summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/bootanimation/BootAnimation.cpp10
-rw-r--r--cmds/telecom/src/com/android/commands/telecom/Telecom.java19
-rw-r--r--core/api/test-current.txt5
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java4
-rw-r--r--core/java/android/companion/ICompanionDeviceManager.aidl1
-rw-r--r--core/java/android/content/pm/PackageManager.java18
-rw-r--r--core/java/android/content/res/Resources.java98
-rw-r--r--core/java/android/content/res/ResourcesImpl.java18
-rw-r--r--core/java/android/database/DatabaseUtils.java32
-rw-r--r--core/java/android/os/TEST_MAPPING13
-rw-r--r--core/java/android/service/dreams/DreamService.java17
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java12
-rw-r--r--core/java/android/text/TextFlags.java2
-rw-r--r--core/java/android/view/InputDevice.java1
-rw-r--r--core/java/android/view/ViewConfiguration.java2
-rw-r--r--core/java/android/view/autofill/AutofillManager.java8
-rw-r--r--core/java/android/view/autofill/IAutoFillManagerClient.aidl5
-rw-r--r--core/java/android/window/WindowTokenClientController.java6
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java95
-rw-r--r--core/jni/android_util_Binder.cpp1
-rw-r--r--core/res/res/values-af/strings.xml2
-rw-r--r--core/res/res/values-am/strings.xml52
-rw-r--r--core/res/res/values-ar/strings.xml4
-rw-r--r--core/res/res/values-as/strings.xml2
-rw-r--r--core/res/res/values-az/strings.xml2
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml2
-rw-r--r--core/res/res/values-be/strings.xml2
-rw-r--r--core/res/res/values-bg/strings.xml2
-rw-r--r--core/res/res/values-bn/strings.xml2
-rw-r--r--core/res/res/values-bs/strings.xml4
-rw-r--r--core/res/res/values-ca/strings.xml2
-rw-r--r--core/res/res/values-cs/strings.xml2
-rw-r--r--core/res/res/values-da/strings.xml4
-rw-r--r--core/res/res/values-de/strings.xml2
-rw-r--r--core/res/res/values-el/strings.xml2
-rw-r--r--core/res/res/values-en-rAU/strings.xml2
-rw-r--r--core/res/res/values-en-rCA/strings.xml2
-rw-r--r--core/res/res/values-en-rGB/strings.xml2
-rw-r--r--core/res/res/values-en-rIN/strings.xml2
-rw-r--r--core/res/res/values-en-rXC/strings.xml2
-rw-r--r--core/res/res/values-es-rUS/strings.xml2
-rw-r--r--core/res/res/values-es/strings.xml2
-rw-r--r--core/res/res/values-et/strings.xml2
-rw-r--r--core/res/res/values-eu/strings.xml2
-rw-r--r--core/res/res/values-fa/strings.xml4
-rw-r--r--core/res/res/values-fi/strings.xml2
-rw-r--r--core/res/res/values-fr-rCA/strings.xml6
-rw-r--r--core/res/res/values-fr/strings.xml4
-rw-r--r--core/res/res/values-gl/strings.xml2
-rw-r--r--core/res/res/values-gu/strings.xml2
-rw-r--r--core/res/res/values-hi/strings.xml2
-rw-r--r--core/res/res/values-hr/strings.xml2
-rw-r--r--core/res/res/values-hu/strings.xml2
-rw-r--r--core/res/res/values-hy/strings.xml2
-rw-r--r--core/res/res/values-in/strings.xml2
-rw-r--r--core/res/res/values-is/strings.xml2
-rw-r--r--core/res/res/values-it/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml2
-rw-r--r--core/res/res/values-ja/strings.xml2
-rw-r--r--core/res/res/values-ka/strings.xml2
-rw-r--r--core/res/res/values-kk/strings.xml2
-rw-r--r--core/res/res/values-km/strings.xml2
-rw-r--r--core/res/res/values-kn/strings.xml4
-rw-r--r--core/res/res/values-ko/strings.xml2
-rw-r--r--core/res/res/values-ky/strings.xml4
-rw-r--r--core/res/res/values-lo/strings.xml2
-rw-r--r--core/res/res/values-lt/strings.xml2
-rw-r--r--core/res/res/values-lv/strings.xml2
-rw-r--r--core/res/res/values-mk/strings.xml2
-rw-r--r--core/res/res/values-ml/strings.xml2
-rw-r--r--core/res/res/values-mn/strings.xml2
-rw-r--r--core/res/res/values-mr/strings.xml4
-rw-r--r--core/res/res/values-ms/strings.xml2
-rw-r--r--core/res/res/values-my/strings.xml2
-rw-r--r--core/res/res/values-nb/strings.xml2
-rw-r--r--core/res/res/values-ne/strings.xml2
-rw-r--r--core/res/res/values-nl/strings.xml4
-rw-r--r--core/res/res/values-or/strings.xml2
-rw-r--r--core/res/res/values-pa/strings.xml4
-rw-r--r--core/res/res/values-pl/strings.xml2
-rw-r--r--core/res/res/values-pt-rBR/strings.xml2
-rw-r--r--core/res/res/values-pt-rPT/strings.xml46
-rw-r--r--core/res/res/values-pt/strings.xml2
-rw-r--r--core/res/res/values-ro/strings.xml2
-rw-r--r--core/res/res/values-ru/strings.xml2
-rw-r--r--core/res/res/values-si/strings.xml2
-rw-r--r--core/res/res/values-sk/strings.xml2
-rw-r--r--core/res/res/values-sl/strings.xml2
-rw-r--r--core/res/res/values-sq/strings.xml2
-rw-r--r--core/res/res/values-sr/strings.xml2
-rw-r--r--core/res/res/values-sv/strings.xml2
-rw-r--r--core/res/res/values-sw/strings.xml2
-rw-r--r--core/res/res/values-ta/strings.xml2
-rw-r--r--core/res/res/values-te/strings.xml4
-rw-r--r--core/res/res/values-th/strings.xml2
-rw-r--r--core/res/res/values-tl/strings.xml2
-rw-r--r--core/res/res/values-tr/strings.xml4
-rw-r--r--core/res/res/values-uk/strings.xml2
-rw-r--r--core/res/res/values-ur/strings.xml2
-rw-r--r--core/res/res/values-uz/strings.xml2
-rw-r--r--core/res/res/values-vi/strings.xml2
-rw-r--r--core/res/res/values-zh-rCN/strings.xml4
-rw-r--r--core/res/res/values-zh-rHK/strings.xml6
-rw-r--r--core/res/res/values-zh-rTW/strings.xml2
-rw-r--r--core/res/res/values-zu/strings.xml2
-rw-r--r--core/res/res/values/config.xml8
-rw-r--r--core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java2
-rw-r--r--core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java2
-rw-r--r--libs/WindowManager/Shell/res/values-am/strings.xml2
-rw-r--r--libs/WindowManager/Shell/res/values-pt-rPT/strings.xml2
-rw-r--r--libs/androidfw/AssetManager2.cpp2
-rw-r--r--packages/PackageInstaller/res/values-ca/strings.xml2
-rw-r--r--packages/PackageInstaller/res/values-pt-rPT/strings.xml10
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml2
-rw-r--r--packages/SettingsLib/ProfileSelector/res/values-am/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-af/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-am/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml16
-rw-r--r--packages/SettingsLib/res/values-ar/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-as/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-az/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-be/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bg/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bn/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bs/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ca/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-cs/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-da/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-de/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-el/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rAU/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rCA/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rGB/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rIN/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rXC/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-es-rUS/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-es/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-et/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-eu/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fa/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fi/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fr/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-gl/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-gu/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hi/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hr/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hu/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hy/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-in/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-is/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-it/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-iw/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ja/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ka/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-kk/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-km/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-kn/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ko/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ky/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lo/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lt/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lv/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-mk/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ml/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-mn/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-mr/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ms/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-my/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-nb/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ne/arrays.xml6
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-nl/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-or/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-pa/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pl/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml16
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ro/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ru/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-si/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sk/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sl/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sq/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sr/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sv/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sw/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ta/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-te/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-th/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-tl/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-tr/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-uk/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ur/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-uz/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-vi/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zu/arrays.xml4
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java7
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java320
-rw-r--r--packages/SystemUI/Android.bp6
-rw-r--r--packages/SystemUI/TEST_MAPPING6
-rw-r--r--packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt2
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt2
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/README.md26
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/blend/Blend.java92
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/contrast/Contrast.java215
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/dislike/DislikeAnalyzer.java58
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java653
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java640
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/ToneDeltaConstraint.java39
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/hct/Cam16.java454
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/hct/Hct.java164
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/hct/HctSolver.java677
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/hct/ViewingConditions.java218
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/palettes/CorePalette.java73
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/palettes/TonalPalette.java146
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProviderLab.java56
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerCelebi.java61
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerMap.java41
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWsmeans.java233
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWu.java407
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/DynamicScheme.java93
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Scheme.java784
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeContent.java59
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeExpressive.java49
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFidelity.java54
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFruitSalad.java39
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeMonochrome.java36
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeNeutral.java36
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeRainbow.java38
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java38
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeVibrant.java44
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Variant.java30
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/score/Score.java184
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/temperature/TemperatureCache.java337
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/utils/ColorUtils.java266
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/utils/MathUtils.java135
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/utils/StringUtils.java35
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java5
-rw-r--r--packages/SystemUI/res-keyguard/values-da/strings.xml6
-rw-r--r--packages/SystemUI/res-product/values-zh-rTW/strings.xml2
-rw-r--r--packages/SystemUI/res/layout/super_notification_shade.xml10
-rw-r--r--packages/SystemUI/res/values-af/strings.xml54
-rw-r--r--packages/SystemUI/res/values-am/strings.xml68
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml58
-rw-r--r--packages/SystemUI/res/values-as/strings.xml54
-rw-r--r--packages/SystemUI/res/values-az/strings.xml56
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml54
-rw-r--r--packages/SystemUI/res/values-be/strings.xml56
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml54
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml58
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml56
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml56
-rw-r--r--packages/SystemUI/res/values-da/strings.xml56
-rw-r--r--packages/SystemUI/res/values-de/strings.xml56
-rw-r--r--packages/SystemUI/res/values-el/strings.xml23
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml54
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml21
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml54
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml54
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml21
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml33
-rw-r--r--packages/SystemUI/res/values-es/strings.xml46
-rw-r--r--packages/SystemUI/res/values-et/strings.xml54
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml56
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml56
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml54
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml56
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml54
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml54
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml58
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml56
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml54
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml54
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml60
-rw-r--r--packages/SystemUI/res/values-in/strings.xml56
-rw-r--r--packages/SystemUI/res/values-is/strings.xml56
-rw-r--r--packages/SystemUI/res/values-it/strings.xml54
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml37
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml54
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml54
-rw-r--r--packages/SystemUI/res/values-km/strings.xml54
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml35
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml54
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml54
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml35
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml54
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml54
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml54
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml35
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml56
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml54
-rw-r--r--packages/SystemUI/res/values-my/strings.xml58
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml39
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml54
-rw-r--r--packages/SystemUI/res/values-or/strings.xml54
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml58
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml56
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml54
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml52
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml54
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml54
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml54
-rw-r--r--packages/SystemUI/res/values-si/strings.xml56
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml35
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml54
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml56
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml54
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml54
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml54
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml58
-rw-r--r--packages/SystemUI/res/values-te/strings.xml54
-rw-r--r--packages/SystemUI/res/values-th/strings.xml56
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml60
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml54
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml56
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml56
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml56
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml56
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml54
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml58
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml58
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml54
-rw-r--r--packages/SystemUI/res/values/colors.xml2
-rw-r--r--packages/SystemUI/res/values/dimens.xml8
-rw-r--r--packages/SystemUI/res/values/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/ClockEventController.kt2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java10
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java6
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java7
-rw-r--r--packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt32
-rw-r--r--packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt20
-rw-r--r--packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt131
-rw-r--r--packages/SystemUI/src/com/android/systemui/dump/SystemUIConfigDumpable.kt73
-rw-r--r--packages/SystemUI/src/com/android/systemui/flags/Flags.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt151
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt43
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt (renamed from packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProvider.java)29
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardAmbientIndicationAreaViewBinder.kt127
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt24
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt34
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt315
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt87
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt131
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt107
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt70
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayout.kt144
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardLayoutManager.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/LockscreenLayoutModule.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/ShortcutsBesideUdfpsLockscreenLayout.kt305
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardAmbientIndicationViewModel.kt51
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt174
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt75
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt116
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java122
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java105
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationInsetsController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java86
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiPickerTrackerFactory.kt92
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt155
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt59
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibInputLog.kt (renamed from packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/TonePolarity.java)15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibTableLog.kt (renamed from packages/SystemUI/monet/src/com/android/systemui/monet/quantize/Quantizer.java)12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepository.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImpl.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLib.kt295
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt32
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayoutTest.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt681
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt107
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java27
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/BlendTest.java109
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java210
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/ColorUtilsTest.java207
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/ContrastTest.java73
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/DislikeTest.java81
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java207
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/HctTest.java320
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/MathUtilsTest.java99
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/PalettesTest.java116
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/QuantizerMapTest.java93
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/README.md4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java253
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java199
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java254
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java254
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java252
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java217
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java253
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTest.java201
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java362
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java217
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/ScoreTest.java72
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/TemperatureCacheTest.java127
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/utils/ArgbSubject.java59
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/retail/data/repository/RetailModeSettingsRepositoryTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java45
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListenerTest.kt192
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt330
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLibTest.kt665
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt50
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt240
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt31
-rw-r--r--packages/VpnDialogs/res/values-pt-rPT/strings.xml4
-rw-r--r--packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java224
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java15
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java8
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java3
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java2
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerService.java7
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java28
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java3
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceInjector.java10
-rw-r--r--services/core/java/com/android/server/pm/PackageSetting.java3
-rw-r--r--services/core/java/com/android/server/pm/RemovePackageHelper.java1
-rw-r--r--services/core/java/com/android/server/pm/UpdateOwnershipHelper.java185
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java6
-rw-r--r--services/core/java/com/android/server/uri/UriPermissionOwner.java16
-rw-r--r--services/core/java/com/android/server/vibrator/TEST_MAPPING19
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskSupervisor.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java18
-rw-r--r--services/core/jni/TEST_MAPPING16
-rw-r--r--services/tests/dreamservicetests/AndroidManifest.xml26
-rw-r--r--services/tests/dreamservicetests/TEST_MAPPING22
-rw-r--r--services/tests/dreamservicetests/res/xml/test_dream_metadata.xml (renamed from services/tests/servicestests/res/xml/test_dream_metadata.xml)3
-rw-r--r--services/tests/dreamservicetests/res/xml/test_dream_metadata_invalid.xml (renamed from services/tests/servicestests/res/xml/test_dream_metadata_invalid.xml)0
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java (renamed from services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java)3
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java (renamed from services/tests/servicestests/src/com/android/server/dreams/DreamOverlayServiceTest.java)2
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java (renamed from services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java)4
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamService.java (renamed from services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java)0
-rw-r--r--services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java (renamed from services/tests/servicestests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java)0
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt2
-rw-r--r--services/tests/servicestests/AndroidManifest.xml26
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java91
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/SystemAudioAutoInitiationActionTest.java14
-rw-r--r--services/tests/vibrator/TEST_MAPPING18
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java72
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java137
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java7
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java122
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java1
-rw-r--r--telecomm/java/com/android/internal/telecom/ITelecomService.aidl2
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt10
-rw-r--r--tests/utils/testutils/TEST_MAPPING32
-rw-r--r--tests/utils/testutils/tests/Android.bp47
-rw-r--r--tests/utils/testutils/tests/AndroidManifest.xml (renamed from packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerResult.java)25
-rw-r--r--tests/utils/testutils/tests/src/android/os/test/TestLooperTest.java (renamed from tests/utils/testutils/java/android/os/test/TestLooperTest.java)0
-rw-r--r--tests/utils/testutils/tests/src/com/android/test/filters/SelectTestTests.java (renamed from tests/utils/testutils/java/com/android/test/filters/SelectTestTests.java)0
-rw-r--r--tools/aapt2/dump/DumpManifest.cpp4
-rw-r--r--tools/aapt2/integration-tests/DumpTest/built_with_aapt_expected.txt2
-rw-r--r--tools/aapt2/integration-tests/DumpTest/components_expected.txt2
-rw-r--r--tools/aapt2/integration-tests/DumpTest/minimal_expected.txt2
-rw-r--r--tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt2
609 files changed, 11715 insertions, 13074 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index c216d1675bb3..10ce3b8d8161 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -81,18 +81,18 @@ static constexpr const char* PRODUCT_USERSPACE_REBOOT_ANIMATION_FILE = "/product
static constexpr const char* OEM_USERSPACE_REBOOT_ANIMATION_FILE = "/oem/media/userspace-reboot.zip";
static constexpr const char* SYSTEM_USERSPACE_REBOOT_ANIMATION_FILE = "/system/media/userspace-reboot.zip";
-static const char BOOTANIM_DATA_DIR_PATH[] = "/data/bootanim";
+static const char BOOTANIM_DATA_DIR_PATH[] = "/data/misc/bootanim";
static const char BOOTANIM_TIME_DIR_NAME[] = "time";
-static const char BOOTANIM_TIME_DIR_PATH[] = "/data/bootanim/time";
+static const char BOOTANIM_TIME_DIR_PATH[] = "/data/misc/bootanim/time";
static const char CLOCK_FONT_ASSET[] = "images/clock_font.png";
static const char CLOCK_FONT_ZIP_NAME[] = "clock_font.png";
static const char PROGRESS_FONT_ASSET[] = "images/progress_font.png";
static const char PROGRESS_FONT_ZIP_NAME[] = "progress_font.png";
static const char LAST_TIME_CHANGED_FILE_NAME[] = "last_time_change";
-static const char LAST_TIME_CHANGED_FILE_PATH[] = "/data/bootanim/time/last_time_change";
+static const char LAST_TIME_CHANGED_FILE_PATH[] = "/data/misc/bootanim/time/last_time_change";
static const char ACCURATE_TIME_FLAG_FILE_NAME[] = "time_is_accurate";
-static const char ACCURATE_TIME_FLAG_FILE_PATH[] = "/data/bootanim/time/time_is_accurate";
-static const char TIME_FORMAT_12_HOUR_FLAG_FILE_PATH[] = "/data/bootanim/time/time_format_12_hour";
+static const char ACCURATE_TIME_FLAG_FILE_PATH[] = "/data/misc/bootanim/time/time_is_accurate";
+static const char TIME_FORMAT_12_HOUR_FLAG_FILE_PATH[] = "/data/misc/bootanim/time/time_format_12_hour";
// Java timestamp format. Don't show the clock if the date is before 2000-01-01 00:00:00.
static const long long ACCURATE_TIME_EPOCH = 946684800000;
static constexpr char FONT_BEGIN_CHAR = ' ';
diff --git a/cmds/telecom/src/com/android/commands/telecom/Telecom.java b/cmds/telecom/src/com/android/commands/telecom/Telecom.java
index 13c7946a033f..1488e14cfb8f 100644
--- a/cmds/telecom/src/com/android/commands/telecom/Telecom.java
+++ b/cmds/telecom/src/com/android/commands/telecom/Telecom.java
@@ -76,6 +76,8 @@ public final class Telecom extends BaseCommand {
private static final String COMMAND_CLEANUP_ORPHAN_PHONE_ACCOUNTS =
"cleanup-orphan-phone-accounts";
private static final String COMMAND_RESET_CAR_MODE = "reset-car-mode";
+ private static final String COMMAND_IS_NON_IN_CALL_SERVICE_BOUND =
+ "is-non-ui-in-call-service-bound";
/**
* Change the system dialer package name if a package name was specified,
@@ -169,6 +171,8 @@ public final class Telecom extends BaseCommand {
+ " over Telephony.\n"
+ "telecom log-mark <MESSAGE>: emits a message into the telecom logs. Useful for "
+ "testers to indicate where in the logs various test steps take place.\n"
+ + "telecom is-non-ui-in-call-service-bound <PACKAGE>: queries a particular "
+ + "non-ui-InCallService in InCallController to determine if it is bound \n"
);
}
@@ -270,6 +274,9 @@ public final class Telecom extends BaseCommand {
case COMMAND_GET_MAX_PHONES:
runGetMaxPhones();
break;
+ case COMMAND_IS_NON_IN_CALL_SERVICE_BOUND:
+ runIsNonUiInCallServiceBound();
+ break;
case COMMAND_SET_TEST_EMERGENCY_PHONE_ACCOUNT_PACKAGE_FILTER:
runSetEmergencyPhoneAccountPackageFilter();
break;
@@ -428,6 +435,18 @@ public final class Telecom extends BaseCommand {
}
/**
+ * prints out whether a particular non-ui InCallServices is bound in a call
+ */
+ public void runIsNonUiInCallServiceBound() throws RemoteException {
+ if (TextUtils.isEmpty(mArgs.peekNextArg())) {
+ System.out.println("No Argument passed. Please pass a <PACKAGE_NAME> to lookup.");
+ } else {
+ System.out.println(
+ String.valueOf(mTelecomService.isNonUiInCallServiceBound(nextArg())));
+ }
+ }
+
+ /**
* Prints the mSIM config to the console.
* "DSDS" for a phone in DSDS mode
* "" (empty string) for a phone in SS mode
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 050667b166bc..3fb9fd931e23 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -837,6 +837,10 @@ package android.appwidget {
package android.companion {
+ public final class CompanionDeviceManager {
+ method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public void enableSecureTransport(boolean);
+ }
+
public abstract class CompanionDeviceService extends android.app.Service {
method public void onBindCompanionDeviceService(@NonNull android.content.Intent);
}
@@ -3526,6 +3530,7 @@ package android.view {
public final class InputDevice implements android.os.Parcelable {
method @RequiresPermission("android.permission.DISABLE_INPUT_DEVICE") public void disable();
method @RequiresPermission("android.permission.DISABLE_INPUT_DEVICE") public void enable();
+ method public int getAssociatedDisplayId();
method @NonNull public android.hardware.input.InputDeviceIdentifier getIdentifier();
method @Nullable public String getKeyboardLanguageTag();
method @Nullable public String getKeyboardLayoutType();
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index e4b2cf335cfc..e45fa1949f18 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -28,6 +28,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.UserHandleAware;
import android.app.Activity;
import android.app.ActivityManager;
@@ -1308,12 +1309,13 @@ public final class CompanionDeviceManager {
}
/**
- * Enable or disable secure transport for testing. Defaults to enabled.
+ * Enables or disables secure transport for testing. Defaults to being enabled.
* Should not be used outside of testing.
*
* @param enabled true to enable. false to disable.
* @hide
*/
+ @TestApi
@RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES)
public void enableSecureTransport(boolean enabled) {
try {
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index b89d3febdbcb..2318e3001698 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -108,5 +108,6 @@ interface ICompanionDeviceManager {
void disableSystemDataSync(int associationId, int flags);
+ @EnforcePermission("MANAGE_COMPANION_DEVICES")
void enableSecureTransport(boolean enabled);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index d9a61aec01cb..33d37bbf0e29 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -235,6 +235,24 @@ public abstract class PackageManager {
"android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT";
/**
+ * Application level {@link android.content.pm.PackageManager.Property PackageManager
+ * .Property} for a privileged system installer to define a list of up to 500 packages that
+ * should not have their updates owned by any installer. The list must be provided via a default
+ * XML resource with the following format:
+ *
+ * <pre>
+ * &lt;deny-ownership&gt;PACKAGE_NAME&lt;/deny-ownership&gt;
+ * &lt;deny-ownership&gt;PACKAGE_NAME&lt;/deny-ownership&gt;
+ * </pre>
+ *
+ * <b>NOTE:</b> Installers that provide this property will not granted update ownership for any
+ * packages that they request update ownership of.
+ * @hide
+ */
+ public static final String PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST =
+ "android.app.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST";
+
+ /**
* A property value set within the manifest.
* <p>
* The value of a property will only have a single type, as defined by
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index c3d5b71e7349..ed22284ae23d 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -54,6 +54,7 @@ import android.graphics.drawable.Drawable.ConstantState;
import android.graphics.drawable.DrawableInflater;
import android.os.Build;
import android.os.Bundle;
+import android.os.SystemClock;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AttributeSet;
@@ -133,6 +134,11 @@ public class Resources {
private static final Object sSync = new Object();
private final Object mUpdateLock = new Object();
+ /**
+ * Controls whether we should preload resources during zygote init.
+ */
+ private static final boolean PRELOAD_RESOURCES = true;
+
// Used by BridgeResources in layoutlib
@UnsupportedAppUsage
static Resources mSystem = null;
@@ -2705,6 +2711,98 @@ public class Resources {
}
}
+ /**
+ * Load in commonly used resources, so they can be shared across processes.
+ *
+ * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even
+ * larger.
+ * @hide
+ */
+ @UnsupportedAppUsage
+ public static void preloadResources() {
+ try {
+ final Resources sysRes = Resources.getSystem();
+ sysRes.startPreloading();
+ if (PRELOAD_RESOURCES) {
+ Log.i(TAG, "Preloading resources...");
+
+ long startTime = SystemClock.uptimeMillis();
+ TypedArray ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_drawables);
+ int numberOfEntries = preloadDrawables(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resources in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+
+ startTime = SystemClock.uptimeMillis();
+ ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_color_state_lists);
+ numberOfEntries = preloadColorStateLists(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resources in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+
+ if (sysRes.getBoolean(
+ com.android.internal.R.bool.config_freeformWindowManagement)) {
+ startTime = SystemClock.uptimeMillis();
+ ar = sysRes.obtainTypedArray(
+ com.android.internal.R.array.preloaded_freeform_multi_window_drawables);
+ numberOfEntries = preloadDrawables(sysRes, ar);
+ ar.recycle();
+ Log.i(TAG, "...preloaded " + numberOfEntries + " resource in "
+ + (SystemClock.uptimeMillis() - startTime) + "ms.");
+ }
+ }
+ sysRes.finishPreloading();
+ } catch (RuntimeException e) {
+ Log.w(TAG, "Failure preloading resources", e);
+ }
+ }
+
+ private static int preloadColorStateLists(Resources resources, TypedArray ar) {
+ final int numberOfEntries = ar.length();
+ for (int i = 0; i < numberOfEntries; i++) {
+ int id = ar.getResourceId(i, 0);
+
+ if (id != 0) {
+ if (resources.getColorStateList(id, null) == null) {
+ throw new IllegalArgumentException(
+ "Unable to find preloaded color resource #0x"
+ + Integer.toHexString(id)
+ + " (" + ar.getString(i) + ")");
+ }
+ }
+ }
+ return numberOfEntries;
+ }
+
+ private static int preloadDrawables(Resources resources, TypedArray ar) {
+ final int numberOfEntries = ar.length();
+ for (int i = 0; i < numberOfEntries; i++) {
+ int id = ar.getResourceId(i, 0);
+
+ if (id != 0) {
+ if (resources.getDrawable(id, null) == null) {
+ throw new IllegalArgumentException(
+ "Unable to find preloaded drawable resource #0x"
+ + Integer.toHexString(id)
+ + " (" + ar.getString(i) + ")");
+ }
+ }
+ }
+ return numberOfEntries;
+ }
+
+ /**
+ * Clear the cache when the framework resources packages is changed.
+ * @hide
+ */
+ @VisibleForTesting
+ public static void resetPreloadDrawableStateCache() {
+ ResourcesImpl.resetDrawableStateCache();
+ preloadResources();
+ }
+
/** @hide */
public void dump(PrintWriter pw, String prefix) {
pw.println(prefix + "class=" + getClass());
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index f2468b5f0653..a937832af5fd 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -55,6 +55,7 @@ import android.util.TypedValue;
import android.util.Xml;
import android.view.DisplayAdjustments;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.GrowingArrayUtils;
import libcore.util.NativeAllocationRegistry;
@@ -164,6 +165,23 @@ public class ResourcesImpl {
}
/**
+ * Clear the cache when the framework resources packages is changed.
+ *
+ * It's only used in the test initial function instead of regular app behaviors. It doesn't
+ * guarantee the thread-safety so mark this with @VisibleForTesting.
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ static void resetDrawableStateCache() {
+ synchronized (sSync) {
+ sPreloadedDrawables[0].clear();
+ sPreloadedDrawables[1].clear();
+ sPreloadedColorDrawables.clear();
+ sPreloadedComplexColors.clear();
+ sPreloaded = false;
+ }
+ }
+
+ /**
* Creates a new ResourcesImpl object with CompatibilityInfo.
*
* @param assets Previously created AssetManager.
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 6c8a8500e4e3..d41df4f49d48 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -511,17 +511,31 @@ public class DatabaseUtils {
*/
public static void appendEscapedSQLString(StringBuilder sb, String sqlString) {
sb.append('\'');
- if (sqlString.indexOf('\'') != -1) {
- int length = sqlString.length();
- for (int i = 0; i < length; i++) {
- char c = sqlString.charAt(i);
- if (c == '\'') {
- sb.append('\'');
+ int length = sqlString.length();
+ for (int i = 0; i < length; i++) {
+ char c = sqlString.charAt(i);
+ if (Character.isHighSurrogate(c)) {
+ if (i == length - 1) {
+ continue;
+ }
+ if (Character.isLowSurrogate(sqlString.charAt(i + 1))) {
+ // add them both
+ sb.append(c);
+ sb.append(sqlString.charAt(i + 1));
+ continue;
+ } else {
+ // this is a lone surrogate, skip it
+ continue;
}
- sb.append(c);
}
- } else
- sb.append(sqlString);
+ if (Character.isLowSurrogate(c)) {
+ continue;
+ }
+ if (c == '\'') {
+ sb.append('\'');
+ }
+ sb.append(c);
+ }
sb.append('\'');
}
diff --git a/core/java/android/os/TEST_MAPPING b/core/java/android/os/TEST_MAPPING
index 954ee3c99346..dae9b5ea6a43 100644
--- a/core/java/android/os/TEST_MAPPING
+++ b/core/java/android/os/TEST_MAPPING
@@ -27,6 +27,19 @@
]
},
{
+ "file_patterns": [
+ "[^/]*(Vibrator|Vibration)[^/]*\\.java",
+ "vibrator/.*"
+ ],
+ "name": "CtsVibratorTestCases",
+ "options": [
+ {"exclude-annotation": "android.platform.test.annotations.LargeTest"},
+ {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
+ },
+ {
"file_patterns": ["Bugreport[^/]*\\.java"],
"name": "BugreportManagerTestCases",
"options": [
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 9b19937444bd..7d9c0a37a13f 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -244,13 +244,7 @@ public class DreamService extends Service implements Window.Callback {
private DreamOverlayConnectionHandler mOverlayConnection;
- private final IDreamOverlayCallback mOverlayCallback = new IDreamOverlayCallback.Stub() {
- @Override
- public void onExitRequested() {
- // Simply finish dream when exit is requested.
- mHandler.post(() -> finish());
- }
- };
+ private IDreamOverlayCallback mOverlayCallback;
public DreamService() {
@@ -877,6 +871,13 @@ public class DreamService extends Service implements Window.Callback {
mDreamComponent = new ComponentName(this, getClass());
mShouldShowComplications = fetchShouldShowComplications(this /*context*/,
fetchServiceInfo(this /*context*/, mDreamComponent));
+ mOverlayCallback = new IDreamOverlayCallback.Stub() {
+ @Override
+ public void onExitRequested() {
+ // Simply finish dream when exit is requested.
+ mHandler.post(() -> finish());
+ }
+ };
super.onCreate();
}
@@ -1083,7 +1084,7 @@ public class DreamService extends Service implements Window.Callback {
// Just in case destroy came in before detach, let's take care of that now
detach();
-
+ mOverlayCallback = null;
super.onDestroy();
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 1d49049ab7d4..07f8aac43bf5 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -485,9 +485,6 @@ public abstract class NotificationListenerService extends Service {
/**
* Implement this method to learn when notifications are removed.
* <p>
- * This might occur because the user has dismissed the notification using system UI (or another
- * notification listener) or because the app has withdrawn the notification.
- * <p>
* NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
* result from {@link StatusBarNotification#getNotification} may be missing some heavyweight
* fields such as {@link android.app.Notification#contentView} and
@@ -506,9 +503,6 @@ public abstract class NotificationListenerService extends Service {
/**
* Implement this method to learn when notifications are removed.
* <p>
- * This might occur because the user has dismissed the notification using system UI (or another
- * notification listener) or because the app has withdrawn the notification.
- * <p>
* NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
* result from {@link StatusBarNotification#getNotification} may be missing some heavyweight
* fields such as {@link android.app.Notification#contentView} and
@@ -531,9 +525,6 @@ public abstract class NotificationListenerService extends Service {
/**
* Implement this method to learn when notifications are removed and why.
* <p>
- * This might occur because the user has dismissed the notification using system UI (or another
- * notification listener) or because the app has withdrawn the notification.
- * <p>
* NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
* result from {@link StatusBarNotification#getNotification} may be missing some heavyweight
* fields such as {@link android.app.Notification#contentView} and
@@ -546,10 +537,9 @@ public abstract class NotificationListenerService extends Service {
* was just removed.
* @param rankingMap The current ranking map that can be used to retrieve ranking information
* for active notifications.
- * @param reason see {@link #REASON_LISTENER_CANCEL}, etc.
*/
public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap,
- int reason) {
+ @NotificationCancelReason int reason) {
onNotificationRemoved(sbn, rankingMap);
}
diff --git a/core/java/android/text/TextFlags.java b/core/java/android/text/TextFlags.java
index 9f11e31e4172..4be6a8def852 100644
--- a/core/java/android/text/TextFlags.java
+++ b/core/java/android/text/TextFlags.java
@@ -44,6 +44,6 @@ public final class TextFlags {
/**
* Default value for the flag {@link #ENABLE_NEW_CONTEXT_MENU}.
*/
- public static final boolean ENABLE_NEW_CONTEXT_MENU_DEFAULT = false;
+ public static final boolean ENABLE_NEW_CONTEXT_MENU_DEFAULT = true;
}
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 8b23f19f1067..f81dc5a58593 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -1319,6 +1319,7 @@ public final class InputDevice implements Parcelable {
}
/** @hide */
+ @TestApi
public int getAssociatedDisplayId() {
return mAssociatedDisplayId;
}
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 3c1ad06a5334..2a88cf074f96 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -181,7 +181,7 @@ public class ViewConfiguration {
private static final int TOUCH_SLOP = 8;
/** Distance a stylus touch can wander before we think the user is handwriting in dips. */
- private static final int HANDWRITING_SLOP = 4;
+ private static final int HANDWRITING_SLOP = 2;
/**
* Defines the minimum size of the touch target for a scrollbar in dips
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 792b38bebefe..2405d4092a0d 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -4305,6 +4305,14 @@ public final class AutofillManager {
}
@Override
+ public void requestHideFillUiWhenDestroyed(int sessionId, AutofillId id) {
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.post(() -> afm.requestHideFillUi(id, true));
+ }
+ }
+
+ @Override
public void notifyNoFillUi(int sessionId, AutofillId id, int sessionFinishedState) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 2e5967cc32d1..6e13097fe319 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -81,6 +81,11 @@ oneway interface IAutoFillManagerClient {
void requestHideFillUi(int sessionId, in AutofillId id);
/**
+ * Requests hiding the fill UI when it's destroyed
+ */
+ void requestHideFillUiWhenDestroyed(int sessionId, in AutofillId id);
+
+ /**
* Notifies no fill UI will be shown, and also mark the state as finished if necessary (if
* sessionFinishedState != 0).
*/
diff --git a/core/java/android/window/WindowTokenClientController.java b/core/java/android/window/WindowTokenClientController.java
index 2f05f830fe09..44847073646d 100644
--- a/core/java/android/window/WindowTokenClientController.java
+++ b/core/java/android/window/WindowTokenClientController.java
@@ -73,6 +73,12 @@ public class WindowTokenClientController {
}
}
+ /** Creates a new instance for test only. */
+ @VisibleForTesting
+ public static WindowTokenClientController createInstanceForTesting() {
+ return new WindowTokenClientController();
+ }
+
private WindowTokenClientController() {}
/**
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 7f53cb433c98..7af196513cae 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -26,7 +26,6 @@ import android.app.ApplicationLoaders;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.SharedLibraryInfo;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.os.Build;
import android.os.Environment;
import android.os.IInstalld;
@@ -105,21 +104,10 @@ public class ZygoteInit {
private static final String SOCKET_NAME_ARG = "--socket-name=";
/**
- * Used to pre-load resources.
- */
- @UnsupportedAppUsage
- private static Resources mResources;
-
- /**
* The path of a file that contains classes to preload.
*/
private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes";
- /**
- * Controls whether we should preload resources during zygote init.
- */
- private static final boolean PRELOAD_RESOURCES = true;
-
private static final int UNPRIVILEGED_UID = 9999;
private static final int UNPRIVILEGED_GID = 9999;
@@ -146,7 +134,7 @@ public class ZygoteInit {
cacheNonBootClasspathClassLoaders();
bootTimingsTraceLog.traceEnd(); // CacheNonBootClasspathClassLoaders
bootTimingsTraceLog.traceBegin("PreloadResources");
- preloadResources();
+ Resources.preloadResources();
bootTimingsTraceLog.traceEnd(); // PreloadResources
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadAppProcessHALs");
nativePreloadAppProcessHALs();
@@ -433,87 +421,6 @@ public class ZygoteInit {
}
/**
- * Load in commonly used resources, so they can be shared across processes.
- *
- * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even
- * larger.
- */
- private static void preloadResources() {
- try {
- mResources = Resources.getSystem();
- mResources.startPreloading();
- if (PRELOAD_RESOURCES) {
- Log.i(TAG, "Preloading resources...");
-
- long startTime = SystemClock.uptimeMillis();
- TypedArray ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_drawables);
- int N = preloadDrawables(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resources in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
-
- startTime = SystemClock.uptimeMillis();
- ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_color_state_lists);
- N = preloadColorStateLists(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resources in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
-
- if (mResources.getBoolean(
- com.android.internal.R.bool.config_freeformWindowManagement)) {
- startTime = SystemClock.uptimeMillis();
- ar = mResources.obtainTypedArray(
- com.android.internal.R.array.preloaded_freeform_multi_window_drawables);
- N = preloadDrawables(ar);
- ar.recycle();
- Log.i(TAG, "...preloaded " + N + " resource in "
- + (SystemClock.uptimeMillis() - startTime) + "ms.");
- }
- }
- mResources.finishPreloading();
- } catch (RuntimeException e) {
- Log.w(TAG, "Failure preloading resources", e);
- }
- }
-
- private static int preloadColorStateLists(TypedArray ar) {
- int N = ar.length();
- for (int i = 0; i < N; i++) {
- int id = ar.getResourceId(i, 0);
-
- if (id != 0) {
- if (mResources.getColorStateList(id, null) == null) {
- throw new IllegalArgumentException(
- "Unable to find preloaded color resource #0x"
- + Integer.toHexString(id)
- + " (" + ar.getString(i) + ")");
- }
- }
- }
- return N;
- }
-
-
- private static int preloadDrawables(TypedArray ar) {
- int N = ar.length();
- for (int i = 0; i < N; i++) {
- int id = ar.getResourceId(i, 0);
-
- if (id != 0) {
- if (mResources.getDrawable(id, null) == null) {
- throw new IllegalArgumentException(
- "Unable to find preloaded drawable resource #0x"
- + Integer.toHexString(id)
- + " (" + ar.getString(i) + ")");
- }
- }
- }
- return N;
- }
-
- /**
* Runs several special GCs to try to clean up a few generations of softly- and final-reachable
* objects, along with any other garbage. This is only useful just before a fork().
*/
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index c19879713f2f..9dce5e3a10f3 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -40,7 +40,6 @@
#include <binder/Stability.h>
#include <binderthreadstate/CallerUtils.h>
#include <cutils/atomic.h>
-#include <cutils/threads.h>
#include <log/log.h>
#include <utils/KeyedVector.h>
#include <utils/List.h>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1c64f5fdc6a4..2d13ab5b868d 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Gebruik biometrie of skermslot"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifieer dat dit jy is"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gebruik jou biometrie om voort te gaan"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Gebruik jou vingerafdruk om voort te gaan"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gebruik jou gesig om voort te gaan"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gebruik jou biometriese data of skermslot om voort te gaan"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometriese hardeware is nie beskikbaar nie"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Stawing is gekanselleer"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 1a574809c4c7..04faabfe52a0 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -202,7 +202,7 @@
<string name="device_policy_manager_service" msgid="5085762851388850332">"የመሣሪያ መመሪያ አስተዳዳሪ አገልግሎት"</string>
<string name="music_recognition_manager_service" msgid="7481956037950276359">"የሙዚቃ ለይቶ ማወቅ አስተዳዳሪ አገልግሎት"</string>
<string name="factory_reset_warning" msgid="6858705527798047809">"የእርስዎ መሣሪያ ይደመሰሳል"</string>
- <string name="factory_reset_message" msgid="2657049595153992213">"የአስተዳዳሪ መተግበሪያ ስራ ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካለዎት የድርጅትዎን አስተዳዳሪ ያነጋግሩ።"</string>
+ <string name="factory_reset_message" msgid="2657049595153992213">"የአስተዳዳሪ መተግበሪያ ሥራ ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካለዎት የድርጅትዎን አስተዳዳሪ ያነጋግሩ።"</string>
<string name="printing_disabled_by" msgid="3517499806528864633">"ማተም በ<xliff:g id="OWNER_APP">%s</xliff:g> ተሰናክሏል።"</string>
<string name="personal_apps_suspension_title" msgid="7561416677884286600">"የስራ መገለጫዎን ያብሩት"</string>
<string name="personal_apps_suspension_text" msgid="6115455688932935597">"የስራ መገለጫዎን እስኪያበሩት ድረስ የግል መተግበሪያዎችዎ ታግደዋል"</string>
@@ -461,8 +461,8 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የጡባዊተኮህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"መተግበሪያው ስለገቢ እና ወጪ ጥሪዎች ያለ ውሂብም ጨምሮ የእርስዎ Android TV መሣሪያ ምዝግብ ማስታወሻ እንዲቀይር ያስችለዋል። ተንኮል-አዘል መተግበሪያዎች ይህን ተጠቅመው የስልክዎን ምዝግብ ማስታወሻ ሊደመስሱ ወይም ሊቀይሩ ይችላሉ።"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
- <string name="permlab_bodySensors" msgid="662918578601619569">"ስራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string>
- <string name="permdesc_bodySensors" product="default" msgid="7652650410295512140">"መተግበሪያው ስራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string>
+ <string name="permlab_bodySensors" msgid="662918578601619569">"ሥራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="7652650410295512140">"መተግበሪያው ሥራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string>
<string name="permlab_bodySensors_background" msgid="4912560779957760446">"ከበስተጀርባ እያለ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string>
<string name="permdesc_bodySensors_background" product="default" msgid="8870726027557749417">"መተግበሪያው ከበስተጀርባ እያለ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"የቀን መቁጠሪያ ክስተቶችን እና ዝርዝሮችን አንብብ"</string>
@@ -474,17 +474,17 @@
<string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ይህ መተግበሪያ በእርስዎ Android TV መሣሪያ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string>
<string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string>
<string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"ተጨማሪ ሥፍራ አቅራቢ ትዕዛዞችን ድረስ።"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"መተግበሪያው ተጨማሪ የአካባቢ አቅራቢ ትእዛዞችን እንዲደርስ ይፈቅድለታል። ይሄ መተግበሪያው በጂፒኤስ ወይም ሌላ የአካባቢ ምንጮች ስራ ላይ ጣልቃ እንዲገባ ሊፈቅድለት ይችላል።"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"መተግበሪያው ተጨማሪ የአካባቢ አቅራቢ ትእዛዞችን እንዲደርስ ይፈቅድለታል። ይሄ መተግበሪያው በጂፒኤስ ወይም ሌላ የአካባቢ ምንጮች ሥራ ላይ ጣልቃ እንዲገባ ሊፈቅድለት ይችላል።"</string>
<string name="permlab_accessFineLocation" msgid="6426318438195622966">"መዳረሻ ከፊት ለፊት ብቻ ትክክለኛ ነው"</string>
- <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"ይህ መተግበሪያ ስራ ላይ ሳለ ከአካባቢ አገልግሎቶች ትክክለኛ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት። ይህ የባትሪ ፍጆታን ሊጨምር ይችላል።"</string>
+ <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"ይህ መተግበሪያ ሥራ ላይ ሳለ ከአካባቢ አገልግሎቶች ትክክለኛ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት። ይህ የባትሪ ፍጆታን ሊጨምር ይችላል።"</string>
<string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"ከፊት ለፊት ብቻ ግምታዊ አካባቢን ድረስ"</string>
- <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"ይህ መተግበሪያ ስራ ላይ ሳለ ከአካባቢ አገልግሎቶች ግምታዊ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት።"</string>
+ <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"ይህ መተግበሪያ ሥራ ላይ ሳለ ከአካባቢ አገልግሎቶች ግምታዊ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት።"</string>
<string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"አካባቢን በበስተጀርባ ድረስ"</string>
- <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"ይህ መተግበሪያ በማንኛውም ጊዜ አካባቢን መድረስ ይችላል፣ መተግበሪያው ስራ ላይ ባይውልም እንኳ።"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"ይህ መተግበሪያ በማንኛውም ጊዜ አካባቢን መድረስ ይችላል፣ መተግበሪያው ሥራ ላይ ባይውልም እንኳ።"</string>
<string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"የድምፅ ቅንብሮችን ለውጥ"</string>
<string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"መተግበሪያው አንደ የድምጽ መጠን እና ለውጽአት የትኛውን የድምጽ ማጉያ ጥቅም ላይ እንደዋለ የመሳሰሉ ሁለንተናዊ የድምጽ ቅንብሮችን እንዲያስተካክል ይፈቅድለታል።"</string>
<string name="permlab_recordAudio" msgid="1208457423054219147">"ኦዲዮ ይቅዱ"</string>
- <string name="permdesc_recordAudio" msgid="5857246765327514062">"ይህ መተግበሪያ መተግበሪያው ስራ ላይ ሳለ ማይክሮፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string>
+ <string name="permdesc_recordAudio" msgid="5857246765327514062">"ይህ መተግበሪያ መተግበሪያው ሥራ ላይ ሳለ ማይክሮፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string>
<string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"በበስተጀርባ ኦዲዮን ይቅዱ"</string>
<string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"ይህ መተግበሪያ በማናቸውም ጊዜ ማይክራፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string>
<string name="permlab_detectScreenCapture" msgid="4447042362828799433">"የመተግበሪያ መስኮቶች የማያ ገፅ ቀረጻዎችን ማወቅ"</string>
@@ -494,7 +494,7 @@
<string name="permlab_activityRecognition" msgid="1782303296053990884">"አካላዊ እንቅስቃሴን ለይቶ ማወቅ"</string>
<string name="permdesc_activityRecognition" msgid="8667484762991357519">"ይህ መተግበሪያ አካላዊ እንቅስቃሴዎን ለይቶ ሊያውቅ ይችላል።"</string>
<string name="permlab_camera" msgid="6320282492904119413">"ፎቶዎች እና ቪዲዮዎች ያንሱ"</string>
- <string name="permdesc_camera" msgid="5240801376168647151">"ይህ መተግበሪያ መተግበሪያው ስራ ላይ ሳለ ካሜራውን በመጠቀም ሥዕሎችን ማንሳት እና ቪዲዮዎችን መቅዳት ይችላል።"</string>
+ <string name="permdesc_camera" msgid="5240801376168647151">"ይህ መተግበሪያ መተግበሪያው ሥራ ላይ ሳለ ካሜራውን በመጠቀም ሥዕሎችን ማንሳት እና ቪዲዮዎችን መቅዳት ይችላል።"</string>
<string name="permlab_backgroundCamera" msgid="7549917926079731681">"በበስተጀርባ ስዕሎችን እና ቪዲዮዎችን ያንሱ"</string>
<string name="permdesc_backgroundCamera" msgid="1615291686191138250">"ይህ መተግበሪያ በማናቸውም ጊዜ ካሜራውን በመጠቀም ፎቶ ሊያነሳ እና ቪዲዮዎችን ሊቀርጽ ይችላል።"</string>
<string name="permlab_systemCamera" msgid="3642917457796210580">"ሥዕሎችን ለማንሣት እና ቪዲዮዎችን ለመቅረጽ እንዲችሉ ወደ ሥርዓት ካሜራዎች ለመተግበሪያ ወይም ለአገልግሎት መዳረሻ ይፍቀዱ"</string>
@@ -601,11 +601,11 @@
<string name="permlab_turnScreenOn" msgid="219344053664171492">"ማያ ገጹን አብራ"</string>
<string name="permdesc_turnScreenOn" msgid="4394606875897601559">"መተግበሪያው ማያ ገጹን እንዲያበራ ይፈቅድለታል።"</string>
<string name="permlab_useBiometric" msgid="6314741124749633786">"ባዮሜትራዊ ሃርድዌርን መጠቀም"</string>
- <string name="permdesc_useBiometric" msgid="7502858732677143410">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ስራ እንዲጠቀም ያስችለዋል"</string>
+ <string name="permdesc_useBiometric" msgid="7502858732677143410">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string>
<string name="permlab_manageFingerprint" msgid="7432667156322821178">"የጣት አሻራ ሃርድዌርን አስተዳድር"</string>
<string name="permdesc_manageFingerprint" msgid="2025616816437339865">"መተግበሪያው ጥቅም ላይ እንዲውሉ የጣት አሻራ ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string>
<string name="permlab_useFingerprint" msgid="1001421069766751922">"የጣት አሻራ ሃርድዌርን ተጠቀም"</string>
- <string name="permdesc_useFingerprint" msgid="412463055059323742">"መተግበሪያው የጣት አሻራ ሃርድዌር ለማረጋገጥ ስራ እንዲጠቀም ያስችለዋል"</string>
+ <string name="permdesc_useFingerprint" msgid="412463055059323742">"መተግበሪያው የጣት አሻራ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string>
<string name="permlab_audioWrite" msgid="8501705294265669405">"የሙዚቃ ስብስብዎን መቀየር"</string>
<string name="permdesc_audioWrite" msgid="8057399517013412431">"መተግበሪያው የሙዚቃ ስብስብዎን እንዲቀይረው ያስችለዋል።"</string>
<string name="permlab_videoWrite" msgid="5940738769586451318">"የቪዲዮ ስብስብዎን መቀየር"</string>
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ባዮሜትሪክስ ወይም ማያ ገፅ መቆለፊያን ይጠቀሙ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"እርስዎን መሆንዎን ያረጋግጡ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ለመቀጠል ባዮሜትሪክዎን ይጠቀሙ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ለመቀጠል የእርስዎን የጣት አሻራ ይጠቀሙ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ለመቀጠል የእርስዎን መልክ ይጠቀሙ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ለመቀጠል የባዮሜትሪክ ወይም የማያ ገፅ ቁልፍዎን ይጠቀሙ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ባዮሜትራዊ ሃርድዌር አይገኝም"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ማረጋገጥ ተሰርዟል"</string>
@@ -842,7 +844,7 @@
<string-array name="phoneTypes">
<item msgid="8996339953292723951">"መነሻ"</item>
<item msgid="7740243458912727194">"ተንቀሳቃሽ"</item>
- <item msgid="8526146065496663766">"ስራ"</item>
+ <item msgid="8526146065496663766">"ሥራ"</item>
<item msgid="8150904584178569699">"የስራ ፋክስ"</item>
<item msgid="4537253139152229577">"የቤት ፋክስ"</item>
<item msgid="6751245029698664340">"ምልክት ማድረጊያ"</item>
@@ -851,24 +853,24 @@
</string-array>
<string-array name="emailAddressTypes">
<item msgid="7786349763648997741">"መነሻ"</item>
- <item msgid="435564470865989199">"ስራ"</item>
+ <item msgid="435564470865989199">"ሥራ"</item>
<item msgid="4199433197875490373">"ሌላ"</item>
<item msgid="3233938986670468328">"ብጁ"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="3861463339764243038">"መነሻ"</item>
- <item msgid="5472578890164979109">"ስራ"</item>
+ <item msgid="5472578890164979109">"ሥራ"</item>
<item msgid="5718921296646594739">"ሌላ"</item>
<item msgid="5523122236731783179">"ብጁ"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="588088543406993772">"መነሻ"</item>
- <item msgid="5503060422020476757">"ስራ"</item>
+ <item msgid="5503060422020476757">"ሥራ"</item>
<item msgid="2530391194653760297">"ሌላ"</item>
<item msgid="7640927178025203330">"ብጁ"</item>
</string-array>
<string-array name="organizationTypes">
- <item msgid="6144047813304847762">"ስራ"</item>
+ <item msgid="6144047813304847762">"ሥራ"</item>
<item msgid="7402720230065674193">"ሌላ"</item>
<item msgid="808230403067569648">"ብጁ"</item>
</string-array>
@@ -885,7 +887,7 @@
<string name="phoneTypeCustom" msgid="5120365721260686814">"ብጁ"</string>
<string name="phoneTypeHome" msgid="3880132427643623588">"መነሻ"</string>
<string name="phoneTypeMobile" msgid="1178852541462086735">"ተንቀሳቃሽ"</string>
- <string name="phoneTypeWork" msgid="6604967163358864607">"ስራ"</string>
+ <string name="phoneTypeWork" msgid="6604967163358864607">"ሥራ"</string>
<string name="phoneTypeFaxWork" msgid="6757519896109439123">"የስራ ፋክስ"</string>
<string name="phoneTypeFaxHome" msgid="6678559953115904345">"የቤት ፋክስ"</string>
<string name="phoneTypePager" msgid="576402072263522767">"ምልክት ማድረጊያ"</string>
@@ -909,16 +911,16 @@
<string name="eventTypeOther" msgid="530671238533887997">"ሌላ"</string>
<string name="emailTypeCustom" msgid="1809435350482181786">"ብጁ"</string>
<string name="emailTypeHome" msgid="1597116303154775999">"መነሻ"</string>
- <string name="emailTypeWork" msgid="2020095414401882111">"ስራ"</string>
+ <string name="emailTypeWork" msgid="2020095414401882111">"ሥራ"</string>
<string name="emailTypeOther" msgid="5131130857030897465">"ሌላ"</string>
<string name="emailTypeMobile" msgid="787155077375364230">"ተንቀሳቃሽ"</string>
<string name="postalTypeCustom" msgid="5645590470242939129">"ብጁ"</string>
<string name="postalTypeHome" msgid="7562272480949727912">"መነሻ"</string>
- <string name="postalTypeWork" msgid="8553425424652012826">"ስራ"</string>
+ <string name="postalTypeWork" msgid="8553425424652012826">"ሥራ"</string>
<string name="postalTypeOther" msgid="7094245413678857420">"ሌላ"</string>
<string name="imTypeCustom" msgid="5653384545085765570">"ብጁ"</string>
<string name="imTypeHome" msgid="6996507981044278216">"መነሻ"</string>
- <string name="imTypeWork" msgid="2099668940169903123">"ስራ"</string>
+ <string name="imTypeWork" msgid="2099668940169903123">"ሥራ"</string>
<string name="imTypeOther" msgid="8068447383276219810">"ሌላ"</string>
<string name="imProtocolCustom" msgid="4437878287653764692">"ብጁ"</string>
<string name="imProtocolAim" msgid="4050198236506604378">"AIM"</string>
@@ -930,7 +932,7 @@
<string name="imProtocolIcq" msgid="2410325380427389521">"ICQ"</string>
<string name="imProtocolJabber" msgid="7919269388889582015">"Jabber"</string>
<string name="imProtocolNetMeeting" msgid="4985002408136148256">"NetMeeting"</string>
- <string name="orgTypeWork" msgid="8684458700669564172">"ስራ"</string>
+ <string name="orgTypeWork" msgid="8684458700669564172">"ሥራ"</string>
<string name="orgTypeOther" msgid="5450675258408005553">"ሌላ"</string>
<string name="orgTypeCustom" msgid="1126322047677329218">"ብጁ"</string>
<string name="relationTypeCustom" msgid="282938315217441351">"ብጁ"</string>
@@ -950,7 +952,7 @@
<string name="relationTypeSpouse" msgid="6916682664436031703">"የትዳር ጓደኛ"</string>
<string name="sipAddressTypeCustom" msgid="6283889809842649336">"ብጁ"</string>
<string name="sipAddressTypeHome" msgid="5918441930656878367">"መነሻ"</string>
- <string name="sipAddressTypeWork" msgid="7873967986701216770">"ስራ"</string>
+ <string name="sipAddressTypeWork" msgid="7873967986701216770">"ሥራ"</string>
<string name="sipAddressTypeOther" msgid="6317012577345187275">"ሌላ"</string>
<string name="quick_contacts_not_available" msgid="1262709196045052223">"ምንም መተግበሪያ ይህንን እውቂያ ለመመልከት አልተገኘም።"</string>
<string name="keyguard_password_enter_pin_code" msgid="6401406801060956153">"ፒን ኮድ ተይብ"</string>
@@ -1862,9 +1864,9 @@
<string name="select_day" msgid="2060371240117403147">"ወር እና ቀን ይምረጡ"</string>
<string name="select_year" msgid="1868350712095595393">"ዓመት ይምረጡ"</string>
<string name="deleted_key" msgid="9130083334943364001">"<xliff:g id="KEY">%1$s</xliff:g> ተሰርዟል"</string>
- <string name="managed_profile_label_badge" msgid="6762559569999499495">"ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="managed_profile_label_badge" msgid="6762559569999499495">"ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2ኛ ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+ <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3ኛ ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="clone_profile_label_badge" msgid="1871997694718793964">"<xliff:g id="LABEL">%1$s</xliff:g>ን አባዛ"</string>
<string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"ከመንቀል በፊት ፒን ጠይቅ"</string>
<string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"ከመንቀል በፊት የማስከፈቻ ስርዓተ-ጥለት ጠይቅ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 4138b0a7766a..322ae8d8e085 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -622,6 +622,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"استخدام المقاييس الحيوية أو قفل الشاشة"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"إثبات هويتك"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"استخدام المقاييس الحيوية للمتابعة"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"استخدِم بصمة إصبعك للمتابعة"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"استخدِم وجهك للمتابعة"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"استخدام المقاييس الحيوية أو قفل الشاشة للمتابعة"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"معدّات المقاييس الحيوية غير متاحة."</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"تم إلغاء المصادقة."</string>
@@ -2173,7 +2175,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"إلغاء الإيقاف المؤقت"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ما مِن تطبيقات عمل."</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ما مِن تطبيقات شخصية."</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"هل تريد فتح تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي للعمل؟"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"هل تريد فتح تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في ملفك الشخصي للعمل؟"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"هل تريد فتح المحتوى في تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي؟"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"هل تريد فتح المحتوى في تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي للعمل؟"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"هل تريد الاتصال من تطبيق العمل؟"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 4d08974e16d6..90234d0a5065 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"বায়\'মেট্ৰিক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"এইয়া আপুনিয়েই বুলি সত্যাপন কৰক"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"অব্যাহত ৰাখিবলৈ আপোনাৰ বায়\'মেট্ৰিক ব্যৱহাৰ কৰক"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"অব্যাহত ৰাখিবলৈ নিজৰ মুখাৱয়ব ব্যৱহাৰ কৰক"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"অব্যাহত ৰাখিবলৈ আপোনাৰ বায়’মেট্ৰিক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"বায়োমেট্ৰিক হাৰ্ডৱেৰ উপলব্ধ নহয়"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ বাতিল কৰা হৈছে"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index e2a280815c86..ff7436fc5be3 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrik məlumatlardan və ya ekran kilidindən istifadə edin"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Kimliyinizi doğrulayın"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Davam etmək üçün biometrik məlumatlarınızdan istifadə edin"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Barmaq izi ilə davam edin"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Üz ilə davam edin"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Davam etmək üçün biometrik məlumatlar və ya ekran kilidinizdən istifadə edin"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrik proqram əlçatan deyil"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Doğrulama ləğv edildi"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 4a1101b86280..c32f95a9cf34 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristite biometriju ili zaključavanje ekrana"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrdite svoj identitet"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Koristite biometrijski podatak da biste nastavili"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Nastavite pomoću otiska prsta"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Potvrdite identitet licem da biste nastavili"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometrijski podatak ili zaključavanje ekrana da biste nastavili"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrijski hardver nije dostupan"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Potvrda identiteta je otkazana"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 217f2c8d18fd..3be47fa89b02 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Выкарыстоўваць біяметрыю ці блакіроўку экрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Спраўдзіце, што гэта вы"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Каб працягнуць, скарыстайце свае біяметрычныя даныя"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Каб працягнуць, скарыстайце адбітак пальца"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Каб працягнуць, скарыстайце распазнаванне твару"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Каб працягнуць, скарыстайце біяметрычныя даныя ці сродак разблакіроўкі экрана"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Біяметрычнае абсталяванне недаступнае"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Аўтэнтыфікацыя скасавана"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index ad166e429860..7425eca0b8a3 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Използване на биометрични данни или опцията за заключване на екрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Потвърдете, че сте вие"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Използвайте биометричните си данни, за да продължите"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Използвайте отпечатъка си, за да продължите"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Използвайте лицето си, за да продължите"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Използвайте биометричните си данни или опцията за заключване на екрана, за да продължите"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометричният хардуер не е налице"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Удостоверяването бе анулирано"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 4e038b5fa7e2..590c9c03cc88 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"বায়োমেট্রিক্স অথবা স্ক্রিন লক ব্যবহার করুন"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"আপনার পরিচয় যাচাই করুন"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"চালিয়ে যেতে আপনার বায়োমেট্রিক্স ব্যবহার করুন"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"চালিয়ে যেতে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"চালিয়ে যেতে আপনার ফেস ব্যবহার করুন"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"চালিয়ে যেতে আপনার বায়োমেট্রিক্স বা স্ক্রিন লক ব্যবহার করুন"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"বায়োমেট্রিক হার্ডওয়্যার পাওয়া যাবে না"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"যাচাইকরণ বাতিল হয়েছে"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 029d6f4a0e5a..a2db18bcff7f 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristi biometriju ili zaključavanje ekrana"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrdite identitet"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Koristite biometriju da nastavite"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Potvrdite identitet otiskom prsta da nastavite"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Potvrdite identitet licem da nastavite"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometriju ili zaključavanje ekrana da nastavite"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrijski hardver nije dostupan"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentifikacija je otkazana"</string>
@@ -2170,7 +2172,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Ponovo pokreni"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"Otvoriti poslovnu aplikaciju <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> za posao?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"Otvoriti u ličnoj aplikaciji <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"Otvoriti u poslovnoj aplikaciji <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"Pozvati iz poslovne aplikacije?"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4417083d6220..356576d6acbd 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Fes servir la biometria o el bloqueig de pantalla"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica la teva identitat"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Utilitza la teva biometria per continuar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Utilitza l\'empremta digital per continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Utilitza la cara per continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Utilitza la biometria o el bloqueig de pantalla per continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Maquinari biomètric no disponible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"S\'ha cancel·lat l\'autenticació"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index df6cc6497cc3..4dd4b69b1c14 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Použít biometrii nebo zámek obrazovky"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrďte, že jste to vy"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Pokračujte biometrickým ověřením"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Pokračujte přiložením prstu"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Pokračujte ověřením obličeje"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Pokračujte ověřením pomocí biometrických údajů nebo zámku obrazovky"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrický hardware není k dispozici"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Ověření bylo zrušeno"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 1a748977b28b..0896f9e62c52 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -268,7 +268,7 @@
<string name="global_action_settings" msgid="4671878836947494217">"Indstillinger"</string>
<string name="global_action_assist" msgid="2517047220311505805">"Assistance"</string>
<string name="global_action_voice_assist" msgid="6655788068555086695">"Taleassistent"</string>
- <string name="global_action_lockdown" msgid="2475471405907902963">"Ekstralås"</string>
+ <string name="global_action_lockdown" msgid="2475471405907902963">"Låsning"</string>
<string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string>
<string name="notification_hidden_text" msgid="2835519769868187223">"Ny notifikation"</string>
<string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Fysisk tastatur"</string>
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Brug biometri eller skærmlås"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verificer, at det er dig"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Brug dine biometriske data for at fortsætte"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Brug dit fingeraftryk for at fortsætte"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Brug dit ansigt for at fortsætte"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Brug dine biometriske data eller din skærmlås for at fortsætte"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrisk hardware er ikke tilgængelig"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Godkendelsen blev annulleret"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index b8275c5f326e..84f2c1f1cec4 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrisches Verfahren oder Displaysperre verwenden"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Deine Identität bestätigen"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Mithilfe eines biometrischen Verfahrens fortfahren"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Fingerabdruck verwenden, um fortzufahren"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gesichtserkennung verwenden, um fortzufahren"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Verwende deine biometrischen Daten oder deine Display-Entsperrmethode, um fortzufahren"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrische Hardware nicht verfügbar"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentifizierung abgebrochen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f2e5c4d9a7d2..d603a2604822 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Χρήση βιομετρικών ή κλειδώματος οθόνης"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Επαλήθευση ταυτότητας"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Χρησιμοποιήστε βιομετρικά για να συνεχίσετε"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα για να συνεχίσετε"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Χρησιμοποιήστε το πρόσωπό σας για να συνεχίσετε"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Χρήση βιομετρικών στοιχείων ή κλειδώματος οθόνης για συνέχεια"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Δεν υπάρχει διαθέσιμος βιομετρικός εξοπλισμός"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Ο έλεγχος ταυτότητας ακυρώθηκε"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index a60b6cc526db..c92f46083ee3 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Use biometrics or screen lock"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verify that it’s you"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use your biometric to continue"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use your fingerprint to continue"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use your face to continue"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use your biometric or screen lock to continue"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometric hardware unavailable"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentication cancelled"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 2c6f6a2aa6e9..bf94625d36e5 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Use biometrics or screen lock"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verify it’s you"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use your biometric to continue"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use your fingerprint to continue"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use your face to continue"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use your biometric or screen lock to continue"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometric hardware unavailable"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentication canceled"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 1918fc750f81..48a10df78d40 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Use biometrics or screen lock"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verify that it’s you"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use your biometric to continue"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use your fingerprint to continue"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use your face to continue"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use your biometric or screen lock to continue"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometric hardware unavailable"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentication cancelled"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 95b37b027dad..a3f2d7db8aad 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Use biometrics or screen lock"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verify that it’s you"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use your biometric to continue"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use your fingerprint to continue"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use your face to continue"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use your biometric or screen lock to continue"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometric hardware unavailable"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentication cancelled"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index fc534cdebfea..17e3fcb12808 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‎Use biometrics or screen lock‎‏‎‎‏‎"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‎‏‎‎Verify it’s you‎‏‎‎‏‎"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎Use your biometric to continue‎‏‎‎‏‎"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎Use your fingerprint to continue‎‏‎‎‏‎"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎Use your face to continue‎‏‎‎‏‎"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎Use your biometric or screen lock to continue‎‏‎‎‏‎"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎Biometric hardware unavailable‎‏‎‎‏‎"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎Authentication canceled‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 4caae1535c22..3e8dd3b6d271 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usar datos biométricos o bloqueo de pantalla"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Comprueba que eres tú"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Usa tus datos biométricos para continuar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Usa tu huella dactilar para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Usa el rostro para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Usa tus datos biométricos o bloqueo de pantalla para continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"No hay hardware biométrico disponible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Se canceló la autenticación"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index b7547f8f52a9..95cbcc018024 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usar biometría o bloqueo de pantalla"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica que eres tú"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Usa tu biometría para continuar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Usa la huella digital para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Usa la cara para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Usa la biometría o tu bloqueo de pantalla para continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biométrico no disponible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autenticación cancelada"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index eb8c8106bf8b..f68aa3199514 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biomeetria või ekraaniluku kasutamine"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Kinnitage oma isik"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Jätkamiseks kasutage biomeetriat"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Jätkamiseks kasutage oma sõrmejälge"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Jätkamiseks kasutage oma nägu"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Jätkamiseks kasutage oma biomeetrilisi andmeid või ekraanilukku"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biomeetriline riistvara ei ole saadaval"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentimine tühistati"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 31ad27b2e20a..bd0a0457d80f 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Erabili sistema biometrikoak edo pantailaren blokeoa"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Egiaztatu zeu zarela"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Aurrera egiteko, erabili sistema biometrikoak"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Aurrera egiteko, erabili hatz-marka"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Aurrera egiteko, erabili aurpegia"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Aurrera egiteko, erabili sistema biometrikoak edo pantailaren blokeoa"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biometrikoa ez dago erabilgarri"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Utzi da autentifikazioa"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 0878b7657276..2d09a9fcb08d 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"استفاده از زیست‌سنجشی یا قفل صفحه"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"تأیید کنید این شمایید"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"برای ادامه، از زیست‌سنجشی استفاده کنید"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"برای ادامه، از اثر انگشتتان استفاده کنید"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"برای ادامه، از چهره‌تان استفاده کنید"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"برای ادامه، از زیست‌سنجشی یا قفل صفحه استفاده کنید"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"سخت‌افزار زیست‌سنجی دردسترس نیست"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"اصالت‌سنجی لغو شد"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"لغو مکث"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"برنامه کاری‌ای وجود ندارد"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"برنامه شخصی‌ای وجود ندارد"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"‫<xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"در <xliff:g id="APP">%s</xliff:g> شخصی باز شود؟"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"در <xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"تماس ازطریق برنامه کاری برقرار شود؟"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 5f1b04828af9..16c864c95956 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Käytä biometriikkaa tai näytön lukitusta"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Vahvista henkilöllisyytesi"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Jatka käyttämällä biometriikkaa"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Jatka sormenjäljen avulla"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Jatka kasvojen avulla"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Jatka biometriikan tai näytön lukituksen avulla"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrinen laitteisto ei käytettävissä"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Todennus peruutettu"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 04b4e36e2774..60575ad71d5b 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -312,9 +312,9 @@
<string name="permgrouplab_storage" msgid="17339216290379241">"Fichiers"</string>
<string name="permgroupdesc_storage" msgid="5378659041354582769">"accéder aux fichiers sur votre appareil"</string>
<string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"Musique et audio"</string>
- <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accédez aux fichiers musicaux et audio sur votre appareil"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accéder aux fichiers musicaux et audio sur votre appareil"</string>
<string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"Photos et vidéos"</string>
- <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accédez aux photos et aux vidéos sur votre appareil"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accéder aux photos et aux vidéos sur votre appareil"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"enregistrer des fichiers audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activité physique"</string>
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Utiliser les données biométriques ou le verrouillage de l\'écran"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirmez que c\'est vous"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Utilisez votre méthode d\'authentification biométrique pour continuer"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Utilisez votre empreinte digitale pour continuer"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Utilisez votre visage pour continuer"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Utilisez vos données biométriques ou le verrouillage de l\'écran pour continuer"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Matériel biométrique indisponible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentification annulée"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 36da634b0ff6..0edaac5fcdfc 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Utiliser la biométrie ou le verrouillage de l\'écran"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirmez votre identité"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Utilisez la biométrie pour continuer"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Utilisez votre empreinte digitale pour continuer"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Utilisez la reconnaissance faciale pour continuer"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Utilisez la biométrie ou le verrouillage de l\'écran pour continuer"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Matériel biométrique indisponible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Authentification annulée"</string>
@@ -1648,7 +1650,7 @@
<string name="display_manager_overlay_display_secure_suffix" msgid="2810034719482834679">", sécurisé"</string>
<string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="1342812634464179931">"Schéma incorrect."</string>
- <string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect."</string>
+ <string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect"</string>
<string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string>
<string name="kg_pattern_instructions" msgid="8366024510502517748">"Tracez votre schéma"</string>
<string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Saisissez le code PIN de la carte SIM."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 20e3812a6e01..9659c6adb049 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Utilizar desbloqueo biométrico ou credencial do dispositivo"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica que es ti"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Para continuar, utiliza o desbloqueo biométrico"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Usa a impresión dixital para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Usa o recoñecemento facial para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Para continuar, utiliza o desbloqueo biométrico ou o bloqueo de pantalla"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"O hardware biométrico non está dispoñible"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Cancelouse a autenticación"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index a48e3433a48d..05c839b28bf9 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"બાયોમેટ્રિક્સ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"તે તમે જ છો એ ચકાસો"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"આગળ વધવા માટે બાયોમેટ્રિકનો ઉપયોગ કરો"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ચાલુ રાખવા માટે તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ચાલુ રાખવા માટે તમારા ચહેરાનો ઉપયોગ કરો"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ચાલુ રાખવા માટે તમારા બાયોમેટ્રિક ડેટા અથવા સ્ક્રીન લૉક સુવિધાનો ઉપયોગ કરો"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"બાયોમેટ્રિક હાર્ડવેર ઉપલબ્ધ નથી"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"પ્રમાણીકરણ રદ કર્યું"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 5f2ba3add382..79df67efa459 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"बायोमेट्रिक्स या स्क्रीन लॉक का क्रेडेंशियल इस्तेमाल करें"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"अपनी पहचान की पुष्टि करें"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"जारी रखने के लिए, बायोमेट्रिक्स इस्तेमाल करें"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"जारी रखने के लिए, अपने फ़िंगरप्रिंट की मदद से पहचान की पुष्टि करें"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"जारी रखने के लिए, अपने चेहरा की मदद से पहचान की पुष्टि करें"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"जारी रखने के लिए, बायोमेट्रिक या स्क्रीन लॉक क्रेडेंशियल डालकर पुष्टि करें"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"बायोमेट्रिक हार्डवेयर उपलब्ध नहीं है"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"प्रमाणीकरण रद्द किया गया"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 711ae1ee41c4..8233e3c384c1 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Upotreba biometrijske autentifikacije ili zaključavanja zaslona"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrdite da ste to vi"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Upotrijebite svoju biometrijsku autentifikaciju da biste nastavili"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Za nastavak upotrijebite otisak prsta"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Za nastavak se identificirajte licem"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Za nastavak se identificirajte biometrijski ili vjerodajnicom zaključavanja zaslona"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrijski hardver nije dostupan"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentifikacija otkazana"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a1fa587447c8..88360855711c 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"A folytatás biometriai feloldással vagy képernyőzárral lehetséges"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Igazolja, hogy Ön az"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"A folytatás biometriai feloldással lehetséges"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"A folytatáshoz használja ujjlenyomatát"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"A folytatáshoz használja az arcalapú feloldást"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"A folytatás biometriai feloldással vagy a képernyőzár feloldásával lehetséges"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrikus hardver nem áll rendelkezésre"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Hitelesítés megszakítva"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 8c30f1d71f1d..6eec876da763 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Օգտագործել կենսաչափական համակարգեր կամ էկրանի կողպում"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Հաստատեք ձեր ինքնությունը"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Շարունակելու համար օգտագործեք կենսաչափական համակարգեր"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Շարունակելու համար օգտագործեք ձեր մատնահետքը"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Շարունակելու համար օգտագործեք դեմքով իսկորոշումը"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Շարունակելու համար օգտագործեք ձեր կենսաչափական տվյալները կամ էկրանի կողպումը"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Կենսաչափական սարքը հասանելի չէ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Նույնականացումը չեղարկվեց"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 120d261afa2a..e65d8e3d9d31 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Gunakan biometrik atau kunci layar"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifikasi bahwa ini memang Anda"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gunakan biometrik untuk melanjutkan"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Gunakan sidik jari untuk melanjutkan"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gunakan wajah untuk melanjutkan"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gunakan biometrik atau kunci layar untuk melanjutkan"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biometrik tidak tersedia"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentikasi dibatalkan"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 552fa6c2dfd3..e904c437e090 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Nota lífkenni eða skjálás"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Staðfestu hver þú ert"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Notaðu lífkenni til að halda áfram"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Notaðu fingrafarið til að halda áfram"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Notaðu andlitið til að halda áfram"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Notaðu lífkenni eða skjálás til að halda áfram"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Lífkennavélbúnaður ekki tiltækur"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Hætt við auðkenningu"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 74c1ac341968..66ee83232982 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usa la biometria o il blocco schermo"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifica la tua identità"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Usa la biometria per continuare"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Utilizza la tua impronta per continuare"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Usa il tuo volto per continuare"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Per continuare devi usare i tuoi dati biometrici o il tuo blocco schermo"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biometrico non disponibile"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autenticazione annullata"</string>
@@ -690,7 +692,7 @@
<string name="face_acquired_too_right" msgid="6245286514593540859">"Sposta lo smartphone verso sinistra"</string>
<string name="face_acquired_too_left" msgid="9201762240918405486">"Sposta lo smartphone verso destra"</string>
<string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Guarda più direttamente verso il dispositivo."</string>
- <string name="face_acquired_not_detected" msgid="1057966913397548150">"Volto non visible. Tieni lo smartphone all\'altezza degli occhi."</string>
+ <string name="face_acquired_not_detected" msgid="1057966913397548150">"Volto non visibile. Tieni lo smartphone all\'altezza degli occhi."</string>
<string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Troppo movimento. Tieni fermo il telefono."</string>
<string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ripeti l\'acquisizione del volto."</string>
<string name="face_acquired_too_different" msgid="2520389515612972889">"Impossibile riconoscere il volto. Riprova."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index f9693bad3aad..16b2d179ae6f 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"שימוש במידע ביומטרי בנעילת מסך"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"אימות הזהות שלך"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"יש להשתמש במידע ביומטרי כדי להמשיך"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"צריך להשתמש בטביעת האצבע כדי להמשיך"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"צריך להשתמש בזיהוי הפנים כדי להמשיך"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"יש להשתמש במידע הביומטרי או בנעילת המסך כדי להמשיך"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"חומרה ביומטרית לא זמינה"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"האימות בוטל"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index a422e094f214..d6064685013c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"生体認証または画面ロックの使用"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"本人確認"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"続行するには生体認証を使用してください"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"続行するには指紋認証を使用してください"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"続行するには顔認証を使用してください"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"続行するには、生体認証または画面ロックを使用してください"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"生体認証ハードウェアが利用できません"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"認証をキャンセルしました"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index ab98d64a466e..2badd0a642db 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"გამოიყენეთ ბიომეტრიული სისტემა ან ეკრანის დაბლოკვა"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"დაადასტურეთ ვინაობა"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"გასაგრძელებლად გამოიყენეთ თქვენი ბიომეტრიული მონაცემები"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"გასაგრძელებლად გამოიყენეთ სახის ამოცნობა"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"გასაგრძელებლად გამოიყენეთ თქვენი ბიომეტრიული მონაცემები ან ეკრანის განბლოკვის ნიმუში"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ბიომეტრიული აპარატურა მიუწვდომელია"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ავტორიზაცია გაუქმდა"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 681aa41404db..0bb57f93ecd8 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Биометриканы немесе экран құлпын пайдалану"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Бұл сіз екеніңізді растаңыз"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Жалғастыру үшін биометрикаңызды пайдаланыңыз."</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Жалғастыру үшін саусақ ізін пайдаланыңыз."</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Жалғастыру үшін бетті анықтау функциясын пайдаланыңыз."</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Жалғастыру үшін биометриканы немесе экран құлпын пайдаланыңыз."</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрикалық жабдық жоқ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Аутентификациядан бас тартылды."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 974b314bbc77..8cc3c64c7d10 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ប្រើជីវមាត្រ ឬ​ការចាក់សោអេក្រង់"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ផ្ទៀងផ្ទាត់ថាជាអ្នក"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ប្រើជីវមាត្រ​របស់អ្នក ដើម្បីបន្ត"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ប្រើ​ស្នាមម្រាមដៃ​របស់អ្នក ដើម្បីបន្ត"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ប្រើមុខរបស់អ្នក ដើម្បីបន្ត"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ប្រើការចាក់សោអេក្រង់ ឬជីវមាត្ររបស់អ្នក ដើម្បីបន្ត"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"មិនអាច​ប្រើឧបករណ៍​ស្កេន​ស្នាមម្រាមដៃ​បានទេ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"បាន​បោះបង់​ការ​ផ្ទៀងផ្ទាត់"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 9eb8516d33ba..7d5fa7d5bcba 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ಇದು ನೀವೇ ಎಂದು ಪರಿಶೀಲಿಸಿ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಬಯೋಮೆಟ್ರಿಕ್ ಬಳಸಿ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಬಳಸಿ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಬಯೋಮೆಟ್ರಿಕ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ಬಯೋಮೆಟ್ರಿಕ್ ಹಾರ್ಡ್‌ವೇರ್‌ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ಪ್ರಮಾಣೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್‌ಗಳಿಲ್ಲ"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"ಉದ್ಯೋಗದ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್‌ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"ವರ್ಕ್‌ ಪ್ರೊಫೈಲ್ ಆದ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್‌ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"ವೈಯಕ್ತಿಕ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್‌ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"ವೈಯಕ್ತಿಕ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್‌ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್‌ನಿಂದ ಕರೆ ಮಾಡಬೇಕೇ?"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 83510e7ac6b4..735b5f7db054 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"생체 인식 또는 화면 잠금을 사용"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"본인 확인"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"생체 인식을 사용하여 계속하세요"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"계속하려면 지문을 인증하세요"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"계속하려면 얼굴로 인증하세요"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"계속하려면 생체 인식이나 화면 잠금을 사용하세요"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"생체 인식 하드웨어를 사용할 수 없음"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"인증이 취소되었습니다."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 7f63669f0099..bbf53e42b35e 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Биометрикалык жөндөөнү же экрандын кулпусун колдонуу"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Өзүңүздү ырастаңыз"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Улантуу үчүн биометрикалык жөндөөнү колдонуу"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Улантуу үчүн манжаңызды сканерге тийгизиңиз"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Улантуу үчүн жүзүңүздү көрсөтүңүз"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Улантуу үчүн биометрикалык маалыматты же экрандын кулпусун колдонуңуз"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрикалык аппарат жеткиликсиз"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Аныктыгын текшерүү жокко чыгарылды"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Иштетүү"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке колдонмолор жок"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"Жумуш үчүн <xliff:g id="APP">%s</xliff:g> колдонмосун ачасызбы?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> жумуш колдонмосун ачасызбы?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"Жеке <xliff:g id="APP">%s</xliff:g> колдонмосунда ачасызбы?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"Жумуш <xliff:g id="APP">%s</xliff:g> колдонмосунда ачасызбы?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"Жумуш колдонмосунан чаласызбы?"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index d0788811dd61..c7f0afc4f95d 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ໃຊ້ລະບົບຊີວະມິຕິ ຫຼື ການລັອກໜ້າຈໍ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ຢັ້ງຢືນວ່າແມ່ນທ່ານ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ໃຊ້ລະບົບຊີວະມິຕິຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ໃຊ້ລາຍນິ້ວມືຂອງທ່ານເພື່ອສືບຕໍ່"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ໃຊ້ໃບໜ້າຂອງທ່ານເພື່ອສືບຕໍ່"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ໃຊ້ລະບົບຊີວະມິຕິ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ຮາດແວຊີວະມິຕິບໍ່ສາມາດໃຊ້ໄດ້"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ຍົກເລີກການຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 33e23daff68f..f32bc96e5185 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Naudoti biometrinius duomenis arba ekrano užraktą"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Patvirtinkite, kad tai jūs"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Norėdami tęsti, naudokite biometrinius duomenis"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Jei norite tęsti, naudokite piršto atspaudą"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Jei norite tęsti, naudokite veido atpažinimo funkciją"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Jei norite tęsti, naudokite biometrinius duomenis arba ekrano užraktą"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrinė aparatinė įranga nepasiekiama"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentifikavimas atšauktas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 346aa30b4196..563d20638fda 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrijas vai ekrāna bloķēšanas izmantošana"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Apstipriniet, ka tas esat jūs"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Lai turpinātu, izmantojiet biometriju"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Izmantojiet pirksta nospiedumu, lai turpinātu"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Izmantojiet autorizāciju pēc sejas, lai turpinātu"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Izmantojiet biometrijas datus vai ekrāna bloķēšanas opciju, lai turpinātu"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrisko datu aparatūra nav pieejama"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentifikācija ir atcelta"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 05246ce00f76..bf79241d386a 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користи биометрика или заклучен екран"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Потврдете дека сте вие"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Користете ја вашата биометрика за да продолжите"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Користете го отпечатокот за да продолжите"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Користете го вашиот лик за да продолжите"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користете ја вашата биометрика или заклучување екран за да продолжите"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрискиот хардвер е недостапен"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Проверката е откажана"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 392a580eb5ff..c2bce63c463c 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ബയോമെട്രിക്‌സ് അല്ലെങ്കിൽ സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ഇത് നിങ്ങളാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"തുടരാൻ ബയോമെട്രിക് ഉപയോഗിക്കുക"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"തുടരാൻ നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"തുടരാൻ നിങ്ങളുടെ മുഖം ഉപയോഗിക്കുക"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"തുടരാൻ നിങ്ങളുടെ ബയോമെട്രിക്‌ അല്ലെങ്കിൽ സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ബയോമെട്രിക് ഹാർ‌ഡ്‌വെയർ ലഭ്യമല്ല"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കി"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 6cd4424975b4..a6a7e85c0e38 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Биометр эсвэл дэлгэцийн түгжээ ашиглах"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Өөрийгөө мөн гэдгийг баталгаажуулаарай"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Үргэлжлүүлэхийн тулд биометрээ ашиглана уу"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Үргэлжлүүлэхийн тулд хурууныхаа хээг ашиглана уу"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Үргэлжлүүлэхийн тулд царайгаа ашиглана уу"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Үргэлжлүүлэхийн тулд биометр эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрийн техник хангамж боломжгүй байна"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Нотолгоог цуцаллаа"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index fc993557582d..9c88e3a8737c 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"बायोमेट्रिक किंवा स्क्रीन लॉक वापरा"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"हे तुम्हीच आहात याची पडताळणी करा"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"पुढे सुरू ठेवण्यासाठी तुमचे बायोमेट्रिक वापरा"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"पुढे सुरू ठेवण्‍यासाठी तुमची फिंगरप्रिंट वापरा"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा वापरा"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"पुढे सुरू ठेवण्यासाठी तुमचे बायोमेट्रिक किंवा स्क्रीन लॉक वापरा"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"बायोमेट्रिक हार्डवेअर उपलब्ध नाही"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ऑथेंटिकेशन रद्द केले"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"पुन्हा सुरू करा"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> उघडायची आहे का?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"वैयक्तिक प्रोफाइल <xliff:g id="APP">%s</xliff:g> मध्ये उघडायची आहे का?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> मध्ये उघडायची आहे का?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"work app मधून कॉल करायचा आहे का?"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index b0a82cbad68f..8effff5f1580 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Gunakan biometrik atau kunci skrin"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Sahkan itu anda"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gunakan biometrik anda untuk meneruskan"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Gunakan cap jari anda untuk teruskan"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gunakan muka anda untuk teruskan"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gunakan biometrik atau kunci skrin anda untuk meneruskan pengesahan"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Perkakasan biometrik tidak tersedia"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Pengesahan dibatalkan"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index cf958dbca2ea..d67390420c66 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ဇီဝမက်ထရစ်အချက်အလက်များ (သို့) ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"သင်ဖြစ်ကြောင်း အတည်ပြုပါ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ရှေ့ဆက်ရန် သင်၏ ဇီဝမက်ထရစ်အချက်အလက်ကို သုံးပါ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ရှေ့ဆက်ရန် သင့်လက်ဗွေကို သုံးပါ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ရှေ့ဆက်ရန် သင့်မျက်နှာကို သုံးပါ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ရှေ့ဆက်ရန် သင်၏ ဇီဝမက်ထရစ်အချက်အလက် (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ဇီဝအချက်အလက်သုံး ကွန်ပျူတာစက်ပစ္စည်း မရရှိနိုင်ပါ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်လိုက်သည်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index e307d2134db7..dafbaba1a0f4 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Bruk biometri eller skjermlås"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Bekreft at det er deg"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Bruk biometri for å fortsette"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Bruk fingeravtrykket for å fortsette"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Bruk ansiktet for å fortsette"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Bruk biometri eller skjermlåsen for å fortsette"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrisk maskinvare er utilgjengelig"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentiseringen er avbrutt"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index ef822428af26..8279158c534b 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"बायोमेट्रिक्स वा स्क्रिन लक प्रयोग गर्नुहोस्"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"यो व्यक्ति तपाईं नै हो भन्ने प्रमाणित गर्नुहोस्"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"जारी राख्न आफ्नो बायोमेट्रिक प्रयोग गर्नुहोस्"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"जारी राख्न आफ्नो फिंगरप्रिन्ट प्रयोग गर्नुहोस्"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"जारी राख्न आफ्नो अनुहार प्रयोग गर्नुहोस्"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"जारी राख्न आफ्नो बायोमेट्रिक वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"बायोमेट्रिक हार्डवेयर उपलब्ध छैन"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"प्रमाणीकरण रद्द गरियो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 966d42e48c80..07c32c678dc6 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrische gegevens of schermvergrendeling gebruiken"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Je identiteit verifiëren"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gebruik je biometrische gegevens om door te gaan"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Gebruik je vingerafdruk om door te gaan"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gebruik je gezicht om door te gaan"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gebruik je biometrische gegevens of schermvergrendeling om door te gaan"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrische hardware niet beschikbaar"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Verificatie geannuleerd"</string>
@@ -1570,7 +1572,7 @@
<string name="shareactionprovider_share_with" msgid="2753089758467748982">"Delen met"</string>
<string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="982510275422590757">"Schuifgreep. Tikken en blijven aanraken."</string>
- <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Swipen om te ontgrendelen"</string>
+ <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Swipe om te ontgrendelen"</string>
<string name="action_bar_home_description" msgid="1501655419158631974">"Navigeren naar startpositie"</string>
<string name="action_bar_up_description" msgid="6611579697195026932">"Omhoog navigeren"</string>
<string name="action_menu_overflow_description" msgid="4579536843510088170">"Meer opties"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 5743fd71691e..a47fd5c43c57 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ବାୟୋମେଟ୍ରିକ୍ସ ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ବାୟୋମେଟ୍ରିକ୍ସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଫେସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ବାୟୋମେଟ୍ରିକ୍ କିମ୍ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ବାୟୋମେଟ୍ରିକ୍‌ ହାର୍ଡୱେର୍‌ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ପ୍ରାମାଣିକତାକୁ ବାତିଲ୍ କରାଯାଇଛି"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 8bc7a326b868..c287bf6eb66c 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਬਾਇਓਮੈਟ੍ਰਿਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਬਾਇਓਮੈਟ੍ਰਿਕ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"ਰੋਕ ਹਟਾਓ"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"ਕੀ ਨਿੱਜੀ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਤੋਂ ਕਾਲ ਕਰਨੀ ਹੈ?"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 2671e392bed7..cf2571be3629 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Używaj biometrii lub blokady ekranu"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potwierdź, że to Ty"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Użyj biometrii, by kontynuować"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Aby kontynuować, użyj odcisku palca"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Aby kontynuować, użyj rozpoznawania twarzy"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Aby kontynuować, użyj biometrii lub blokady ekranu"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Sprzęt biometryczny niedostępny"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Anulowano uwierzytelnianie"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index dfd046a89f14..2ca6ec765326 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usar biometria ou bloqueio de tela"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirme que é você"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use seus dados biométricos para continuar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use sua impressão digital para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use seu rosto para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use sua autenticação biométrica ou o bloqueio de tela para continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biométrico indisponível"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autenticação cancelada"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d094e3e74257..416557a02daf 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -235,9 +235,9 @@
<string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"O dispositivo Android TV será encerrado."</string>
<string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"As suas visualizações vão ser encerradas."</string>
<string name="shutdown_confirm" product="default" msgid="136816458966692315">"O seu telefone será encerrado."</string>
- <string name="shutdown_confirm_question" msgid="796151167261608447">"Pretende encerrar?"</string>
+ <string name="shutdown_confirm_question" msgid="796151167261608447">"Quer encerrar?"</string>
<string name="reboot_safemode_title" msgid="5853949122655346734">"Reiniciar no modo de segurança"</string>
- <string name="reboot_safemode_confirm" msgid="1658357874737219624">"Pretende reiniciar no modo de segurança? Se sim, irá desativar todas as aplicações de terceiros instaladas. Estas serão restauradas quando reiniciar novamente."</string>
+ <string name="reboot_safemode_confirm" msgid="1658357874737219624">"Quer reiniciar no modo de segurança? Se sim, irá desativar todas as aplicações de terceiros instaladas. Estas serão restauradas quando reiniciar novamente."</string>
<string name="recent_tasks_title" msgid="8183172372995396653">"Recente"</string>
<string name="no_recent_tasks" msgid="9063946524312275906">"Não existem aplicações recentes"</string>
<string name="global_actions" product="tablet" msgid="4412132498517933867">"Opções do tablet"</string>
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usar a biometria ou o bloqueio de ecrã"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirme a sua identidade"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Utilize a biometria para continuar."</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use a impressão digital para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use o rosto para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Utilize a biometria ou o bloqueio de ecrã para continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biométrico indisponível."</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autenticação cancelada"</string>
@@ -1068,7 +1070,7 @@
<string name="js_dialog_before_unload_title" msgid="7012587995876771246">"Confirmar Navegação"</string>
<string name="js_dialog_before_unload_positive_button" msgid="4274257182303565509">"Sair desta Página"</string>
<string name="js_dialog_before_unload_negative_button" msgid="3873765747622415310">"Permanecer nesta Página"</string>
- <string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nTem a certeza de que pretende navegar para outra página?"</string>
+ <string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nTem a certeza de que quer navegar para outra página?"</string>
<string name="autofill_window_title" msgid="4379134104008111961">"Preenchimento automático com <xliff:g id="SERVICENAME">%1$s</xliff:g>"</string>
<string name="permlab_setAlarm" msgid="1158001610254173567">"definir um alarme"</string>
<string name="permdesc_setAlarm" msgid="2185033720060109640">"Permite que a app defina um alarme numa app de despertador instalada. Algumas aplicações de despertador podem não integrar esta funcionalidade."</string>
@@ -1094,8 +1096,8 @@
<string name="searchview_description_submit" msgid="6771060386117334686">"Enviar consulta"</string>
<string name="searchview_description_voice" msgid="42360159504884679">"Pesquisa por voz"</string>
<string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"Ativar Explorar Através do Toque?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o tablet."</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o tablet."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string>
<string name="oneMonthDurationPast" msgid="4538030857114635777">"Há 1 mês"</string>
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Há mais de 1 mês"</string>
<string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}"</string>
@@ -1233,7 +1235,7 @@
<string name="force_close" msgid="9035203496368973803">"OK"</string>
<string name="report" msgid="2149194372340349521">"Relatório"</string>
<string name="wait" msgid="7765985809494033348">"Esperar"</string>
- <string name="webpage_unresponsive" msgid="7850879412195273433">"A página deixou de responder. \n \n Pretende fechá-la?"</string>
+ <string name="webpage_unresponsive" msgid="7850879412195273433">"A página deixou de responder. \n \n Quer fechá-la?"</string>
<string name="launch_warning_title" msgid="6725456009564953595">"Aplicação redirecionada"</string>
<string name="launch_warning_replace" msgid="3073392976283203402">"<xliff:g id="APP_NAME">%1$s</xliff:g> está agora a ser executado."</string>
<string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g> foi originalmente iniciado."</string>
@@ -1276,7 +1278,7 @@
<string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite da memória"</string>
<string name="dump_heap_ready_notification" msgid="2302452262927390268">"A captura da área dinâmica para dados do processo <xliff:g id="PROC">%1$s</xliff:g> está pronta."</string>
<string name="dump_heap_notification_detail" msgid="8431586843001054050">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string>
- <string name="dump_heap_title" msgid="4367128917229233901">"Pretende partilhar a captura da área dinâmica para dados?"</string>
+ <string name="dump_heap_title" msgid="4367128917229233901">"Quer partilhar a captura da área dinâmica para dados?"</string>
<string name="dump_heap_text" msgid="1692649033835719336">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu o respetivo limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Está disponível uma captura da área dinâmica para dados para partilhar com o respetivo programador. Atenção: esta captura da área dinâmica para dados pode conter algumas das suas informações pessoais a que a app tem acesso."</string>
<string name="dump_heap_system_text" msgid="6805155514925350849">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu o respetivo limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Está disponível uma captura da área dinâmica para dados para partilhar. Atenção: esta captura da área dinâmica para dados pode conter informações pessoais confidenciais a que o processo tem acesso, que podem incluir coisas que escreveu."</string>
<string name="dump_heap_ready_text" msgid="5849618132123045516">"Está disponível uma captura da área dinâmica para dados do processo <xliff:g id="PROC">%1$s</xliff:g> para partilhar. Atenção: esta captura da área dinâmica para dados pode conter informações pessoais confidenciais a que o processo tem acesso, que podem incluir coisas que escreveu."</string>
@@ -1328,7 +1330,7 @@
<string name="decline" msgid="6490507610282145874">"Recusar"</string>
<string name="select_character" msgid="3352797107930786979">"Introduzir carácter"</string>
<string name="sms_control_title" msgid="4748684259903148341">"A enviar mensagens SMS"</string>
- <string name="sms_control_message" msgid="6574313876316388239">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; está a enviar um grande número de mensagens SMS. Pretende autorizar que a app continue a enviar mensagens?"</string>
+ <string name="sms_control_message" msgid="6574313876316388239">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; está a enviar um grande número de mensagens SMS. Quer autorizar que a app continue a enviar mensagens?"</string>
<string name="sms_control_yes" msgid="4858845109269524622">"Permitir"</string>
<string name="sms_control_no" msgid="4845717880040355570">"Recusar"</string>
<string name="sms_short_code_confirm_message" msgid="1385416688897538724">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; gostaria de enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
@@ -1390,7 +1392,7 @@
<string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"É seguro utilizar a porta USB"</string>
<string name="usb_contaminant_not_detected_message" msgid="892863190942660462">"O telemóvel já não deteta líquidos nem resíduos."</string>
<string name="taking_remote_bugreport_notification_title" msgid="1582531382166919850">"A criar relatório de erro…"</string>
- <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"Pretende partilhar o relatório de erro?"</string>
+ <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"Quer partilhar o relatório de erro?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"A partilhar relatório de erro…"</string>
<string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"O seu gestor solicitou um relatório de erro para ajudar na resolução de problemas deste dispositivo. As aplicações e os dados podem ser partilhados."</string>
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"PARTILHAR"</string>
@@ -1406,7 +1408,7 @@
<string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"Sobrepor a outras apps"</string>
<string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"A app <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplicações"</string>
<string name="alert_windows_notification_title" msgid="6331662751095228536">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras app"</string>
- <string name="alert_windows_notification_message" msgid="6538171456970725333">"Se não pretende que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
+ <string name="alert_windows_notification_message" msgid="6538171456970725333">"Se não quer que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
<string name="alert_windows_notification_turn_off_action" msgid="7805857234839123780">"Desligar"</string>
<string name="ext_media_checking_notification_title" msgid="8299199995416510094">"A verificar o <xliff:g id="NAME">%s</xliff:g>…"</string>
<string name="ext_media_checking_notification_message" msgid="2231566971425375542">"A rever o conteúdo atual…"</string>
@@ -1482,7 +1484,7 @@
<string name="dial_number_using" msgid="6060769078933953531">"Marcar número\nutilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="6200708808003692594">"Criar contacto\nutilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Uma ou várias das aplicações seguintes solicitam permissão para aceder à sua conta, agora e no futuro."</string>
- <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Pretende autorizar este pedido?"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Quer autorizar este pedido?"</string>
<string name="grant_permissions_header_text" msgid="3420736827804657201">"Pedido de acesso"</string>
<string name="allow" msgid="6195617008611933762">"Permitir"</string>
<string name="deny" msgid="6632259981847676572">"Recusar"</string>
@@ -1534,7 +1536,7 @@
<string name="gpsVerifYes" msgid="3719843080744112940">"Sim"</string>
<string name="gpsVerifNo" msgid="1671201856091564741">"Não"</string>
<string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite de eliminações excedido"</string>
- <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que pretende fazer?"</string>
+ <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que quer fazer?"</string>
<string name="sync_really_delete" msgid="5657871730315579051">"Eliminar os itens"</string>
<string name="sync_undo_deletes" msgid="5786033331266418896">"Anular as eliminações"</string>
<string name="sync_do_nothing" msgid="4528734662446469646">"Não fazer nada por agora"</string>
@@ -1688,7 +1690,7 @@
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Aumentar o volume acima do nível recomendado?\n\nOuvir com um volume elevado durante longos períodos poderá ser prejudicial para a sua audição."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Quer continuar a ouvir com um volume elevado?\n\nO volume dos auscultadores está elevado há mais tempo do que o recomendado, o que pode ser prejudicial para a sua audição"</string>
<string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Som alto detetado\n\nO volume dos auscultadores tem estado mais elevado do que o recomendado, o que pode ser prejudicial para a sua audição"</string>
- <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Pretende utilizar o atalho de acessibilidade?"</string>
+ <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Quer utilizar o atalho de acessibilidade?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando o atalho está ativado, premir ambos os botões de volume durante 3 segundos inicia uma funcionalidade de acessibilidade."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ativar o atalho das funcionalidades de acessibilidade?"</string>
<string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Manter premidas ambas as teclas de volume durante alguns segundos ativa as funcionalidades de acessibilidade. Estas podem alterar a forma como o seu dispositivo funciona.\n\nFuncionalidades atuais:\n<xliff:g id="SERVICE">%1$s</xliff:g>\npode alterar as funcionalidades selecionadas em Definições &gt; Acessibilidade."</string>
@@ -2024,14 +2026,14 @@
<string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher automaticamente o conteúdo"</string>
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões do preenchimento automático"</string>
<string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão do preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}"</string>
- <string name="autofill_save_title" msgid="7719802414283739775">"Pretende guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
- <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
- <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
- <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title" msgid="3630695947047069136">"Pretende atualizar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title_with_type" msgid="5264152633488495704">"Pretende atualizar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Pretende atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
- <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Pretende atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
+ <string name="autofill_save_title" msgid="7719802414283739775">"Quer guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Quer guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Quer guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"Quer guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title" msgid="3630695947047069136">"Quer atualizar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title_with_type" msgid="5264152633488495704">"Quer atualizar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Quer atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
+ <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Quer atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
<string name="autofill_save_yes" msgid="8035743017382012850">"Guardar"</string>
<string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string>
<string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string>
@@ -2070,7 +2072,7 @@
<string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string>
<string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string>
<string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicação prejudicial detetada"</string>
- <string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string>
+ <string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string>
<string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificações vibram."</string>
<string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"É desativado o som das chamadas e das notificações."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index dfd046a89f14..2ca6ec765326 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Usar biometria ou bloqueio de tela"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirme que é você"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Use seus dados biométricos para continuar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Use sua impressão digital para continuar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Use seu rosto para continuar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Use sua autenticação biométrica ou o bloqueio de tela para continuar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biométrico indisponível"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autenticação cancelada"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b38622374bd0..345f67fbe485 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Folosește sistemele biometrice sau blocarea ecranului"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Confirmă-ți identitatea"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Folosește sistemele biometrice pentru a continua"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Folosește amprenta pentru a continua"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Folosește-ți chipul pentru a continua"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Folosește sistemele biometrice sau blocarea ecranului pentru a continua"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Hardware biometric indisponibil"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentificarea a fost anulată"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 39aa55a299ff..efebc8a11689 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Использовать биометрию или блокировку экрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Подтвердите, что это вы"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Чтобы продолжить, используйте биометрические данные."</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Чтобы продолжить, прикоснитесь пальцем к сканеру."</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Чтобы продолжить, используйте фейсконтроль."</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Чтобы продолжить, используйте биометрию или данные для разблокировки экрана."</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометрическое оборудование недоступно"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Аутентификация отменена"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index bde7d931f47e..6ed563e92cc4 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ජෛවමිතික හෝ තිර අගුල භාවිත කරන්න"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"එය ඔබ බව තහවුරු කරන්න"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ඉදිරියට යාමට ඔබගේ ජෛවමිතික භාවිත කරන්න"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ඉදිරියට යාමට ඔබේ ඇඟිලි සලකුණ භාවිත කරන්න"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ඉදිරියට යාමට ඔබේ මුහුණ භාවිත කරන්න"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ඉදිරියට යාමට ඔබගේ ජෛවමිතික හෝ තිර අගුල භාවිත කරන්න"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ජීවමිතික දෘඪාංග ලබා ගත නොහැකිය"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"සත්‍යාපනය අවලංගු කළා"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 02e69593b230..0a1b159324c8 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Použiť biometrické údaje alebo zámku obrazovky"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Overenie, že ste to vy"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Ak chcete pokračovať, použite biometrický údaj"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Pokračujte nasnímaním odtlačku prsta"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Pokračujte nasnímaním tváre"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Pokračujte použitím biometrických údajov alebo zámky obrazovky"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrický hardvér nie je k dispozícii"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Overenie bolo zrušené"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index d3acfba6f582..72daf81168e3 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Uporaba biometrike ali odklepanja s poverilnico"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Preverite, da ste res vi"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Za nadaljevanje uporabite biometrični podatek."</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Za nadaljevanje uporabite prstni odtis"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Za nadaljevanje uporabite obraz"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Za nadaljevanje uporabite biometrični podatek ali odklepanje s poverilnico."</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Strojna oprema za biometrične podatke ni na voljo"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Preverjanje pristnosti je preklicano"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 228ce1669a3f..dec475fa9c2b 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Përdor sistemet biometrike ose kyçjen e ekranit"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifiko që je ti"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Përdor sistemet e tua biometrike për të vazhduar"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Përdor gjurmën e gishtit për të vazhduar"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Përdor fytyrën tënde për të vazhduar"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Përdor sistemet e tua biometrike ose kyçjen e ekranit për të vazhduar"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Nuk ofrohet harduer biometrik"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Vërtetimi u anulua"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 84ead151ebc7..a2aee9ca99ee 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -619,6 +619,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користите биометрију или закључавање екрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Потврдите свој идентитет"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Користите биометријски податак да бисте наставили"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Наставите помоћу отиска прста"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Потврдите идентитет лицем да бисте наставили"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користите биометријски податак или закључавање екрана да бисте наставили"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометријски хардвер није доступан"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Потврда идентитета је отказана"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3739f1ff174c..af2e1ea2f058 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Använd biometrisk data eller skärmlåset"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Verifiera din identitet"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Fortsätt med hjälp av din biometriska data"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Fortsätt med hjälp av ditt fingeravtryck"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Fortsätt med hjälp av ditt ansikte"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Fortsätt med hjälp av din biometriska data eller skärmlåset"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrisk maskinvara är inte tillgänglig"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentiseringen avbröts"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 86beafed0d5f..d77385c126e2 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Tumia bayometriki au mbinu ya kufunga skrini"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Thibitisha kuwa ni wewe"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Tumia bayometriki yako ili uendelee"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Tumia alama ya kidole chako ili uendelee"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Tumia uso wako ili uendelee"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Tumia bayometriki au mbinu yako ya kufunga skrini ili uendelee"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Maunzi ya bayometriki hayapatikani"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Imeghairi uthibitishaji"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 783b7099ea61..50d056ae3aea 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"பயோமெட்ரிக்ஸையோ திரைப் பூட்டையோ பயன்படுத்து"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"நீங்கள்தான் என உறுதிசெய்க"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"தொடர உங்கள் பயோமெட்ரிக்கைப் பயன்படுத்துங்கள்"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"தொடர்வதற்கு உங்கள் கைரேகையைப் பயன்படுத்துங்கள்"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"தொடர்வதற்கு உங்கள் முகத்தைப் பயன்படுத்துங்கள்"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"தொடர, உங்கள் பயோமெட்ரிக்கையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"பயோமெட்ரிக் வன்பொருள் இல்லை"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"அங்கீகரிப்பு ரத்தானது"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 634681ead504..a5d28b698580 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"బయోమెట్రిక్స్‌ను లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ఇది మీరేనని వెరిఫై చేసుకోండి"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"కొనసాగించడానికి, మీ బయోమెట్రిక్‌ను ఉపయోగించండి"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"కొనసాగించడానికి మీ వేలిముద్రను ఉపయోగించండి"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"కొనసాగించడానికి మీ ముఖాన్ని ఉపయోగించండి"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"కొనసాగించడానికి మీ బయోమెట్రిక్ లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"బయోమెట్రిక్ హార్డ్‌వేర్‌ అందుబాటులో లేదు"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ప్రమాణీకరణ రద్దు చేయబడింది"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"అన్‌పాజ్ చేయండి"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"వర్క్ యాప్‌లు లేవు"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"వ్యక్తిగత యాప్‌లు లేవు"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"వర్క్ <xliff:g id="APP">%s</xliff:g> యాప్‌ను తెరవాలా?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> వర్క్ యాప్‌ను తెరవాలా?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"వ్యక్తిగత <xliff:g id="APP">%s</xliff:g> యాప్‌లో తెరవాలా?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"వర్క్ <xliff:g id="APP">%s</xliff:g> యాప్‌లో తెరవాలా?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"వర్క్ యాప్ నుండి కాల్ చేయాలా?"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index a987d4ddcf56..1f650867d16d 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"ใช้ข้อมูลไบโอเมตริกหรือการล็อกหน้าจอ"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"ยืนยันว่าเป็นตัวคุณ"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"ใช้ข้อมูลไบโอเมตริกเพื่อดำเนินการต่อ"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"ใช้ลายนิ้วมือของคุณเพื่อดำเนินการต่อ"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"ใช้ใบหน้าของคุณเพื่อดำเนินการต่อ"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"ใช้ข้อมูลไบโอเมตริกหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"ฮาร์ดแวร์ไบโอเมตริกไม่พร้อมใช้งาน"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"ยกเลิกการตรวจสอบสิทธิ์แล้ว"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 6d7a6fdea611..567b67e2cba5 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Gumamit ng biometrics o lock ng screen"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"I-verify na ikaw ito"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Gamitin ang iyong biometric para magpatuloy"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Gamitin ang iyong fingerprint para magpatuloy"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Gamitin ang iyong mukha para magpatuloy"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Gamitin ang iyong biometric o lock ng screen para magpatuloy"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Walang biometric hardware"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Nakansela ang pag-authenticate"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 329c71877ec4..3bf35a5a526f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biyometri veya ekran kilidi kullan"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Siz olduğunuzu doğrulayın"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Devam etmek için biyometri kullanın"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Devam etmek için parmak izinizi kullanın"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Devam etmek için yüzünüzü kullanın"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Devam etmek için biyometrik kimlik bilginizi veya ekran kilidinizi kullanın"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biyometrik donanım kullanılamıyor"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Kimlik doğrulama iptal edildi"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Devam ettir"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş uygulaması yok"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Kişisel uygulama yok"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"İş uygulaması (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> iş uygulaması açılsın mı?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"Kişisel uygulamada (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"İş uygulamasında (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"İş uygulamasından aransın mı?"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4bc7abf6f9df..47e529c3de06 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -620,6 +620,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Використовувати біометрію або дані для розблокування екрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Підтвердьте, що це ви"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Щоб продовжити, скористайтеся біометрією"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Щоб продовжити, скористайтеся відбитком пальця"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Щоб продовжити, скористайтеся фейс-контролем"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Щоб продовжити, скористайтеся біометрією або даними для розблокування екрана"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Біометричне апаратне забезпечення недоступне"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Автентифікацію скасовано"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 4755d650b1b0..907ebd95a862 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"بایو میٹرکس یا اسکرین لاک استعمال کریں"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"توثیق کریں کہ یہ آپ ہیں"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"جاری رکھنے کیلئے اپنا بایو میٹرک استعمال کریں"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"جاری رکھنے کے لیے اپنا فنگر پرنٹ استعمال کریں"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"جاری رکھنے کے لیے اپنے چہرے کا استعمال کریں"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"جاری رکھنے کے لیے اپنے بایو میٹرک اور اسکرین لاک کا استعمال کریں"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"بایومیٹرک ہارڈ ویئر دستیاب نہیں ہے"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"تصدیق کا عمل منسوخ ہو گیا"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index cdf1c9381e79..a65b4780f118 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Biometrika yoki ekran qulfi"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Oʻzingizni taniting"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Davom etish uchun biometrik tasdiqlang"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Davom etish uchun barmoq izingizdan foydalaning"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Yuz tekshiruvi bilan davom eting"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Davom etish uchun biometrika yoki ekran qulfidan foydalaning"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrik sensor ishlamayapti"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Autentifikatsiya bekor qilindi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 68bafc82ad85..9c772995ba6b 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Dùng dữ liệu sinh trắc học hoặc phương thức khóa màn hình"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Xác minh danh tính của bạn"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Dùng dữ liệu sinh trắc học của bạn để tiếp tục"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Hãy dùng vân tay để tiếp tục"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Hãy dùng khuôn mặt để tiếp tục"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Dùng dữ liệu sinh trắc học của bạn hoặc phương thức khóa màn hình để tiếp tục"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Không có phần cứng sinh trắc học"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Đã hủy xác thực"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index b0ec73b7c5c3..666a28f6e8a1 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"使用生物识别或屏幕锁定凭据"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"验证是您本人在操作"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"使用生物识别验证身份才能继续"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"如需继续操作,请使用指纹验证身份"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"如需继续操作,请刷脸验证身份"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"使用生物识别或屏幕锁定凭据验证身份,才能继续操作"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"生物识别硬件无法使用"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"身份验证已取消"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"取消暂停"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"没有支持该内容的工作应用"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"没有支持该内容的个人应用"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"打开工作 <xliff:g id="APP">%s</xliff:g>?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"打开工作应用 <xliff:g id="APP">%s</xliff:g>?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"在个人 <xliff:g id="APP">%s</xliff:g> 中打开?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"在工作 <xliff:g id="APP">%s</xliff:g> 中打开?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"通过工作应用拨打电话?"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index c498d142ee9b..899c314e5f11 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"使用生物識別或螢幕鎖定"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"驗證是你本人"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"如要繼續操作,請使用使用生物識別驗證身分"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"如要繼續操作,請使用你的指紋驗證身分"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"如要繼續操作,請使用你的面孔驗證身分"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"請使用生物識別或螢幕鎖定功能驗證身分,才能繼續操作"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"無法使用生物識別硬件"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"已取消驗證"</string>
@@ -1943,7 +1945,7 @@
<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_regions_section_suggested" msgid="6080131515268225316">"建議的語言"</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>
<string name="language_picker_section_all" msgid="1985809075777564284">"所有語言"</string>
@@ -2169,7 +2171,7 @@
<string name="resolver_switch_on_work" msgid="4527096360772311894">"取消暫停"</string>
<string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string>
<string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string>
- <string name="miniresolver_open_work" msgid="6286176185835401931">"要開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
+ <string name="miniresolver_open_work" msgid="6286176185835401931">"要開啟工作應用程式「<xliff:g id="APP">%s</xliff:g>」嗎?"</string>
<string name="miniresolver_open_in_personal" msgid="807427577794490375">"要在個人「<xliff:g id="APP">%s</xliff:g>」中開啟嗎?"</string>
<string name="miniresolver_open_in_work" msgid="941341494673509916">"要在工作「<xliff:g id="APP">%s</xliff:g>」中開啟嗎?"</string>
<string name="miniresolver_call_in_work" msgid="528779988307529039">"要透過工作應用程式打電話嗎?"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 0089747e83b6..717e0460cd51 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"使用生物特徵辨識或螢幕鎖定功能"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"驗證你的身分"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"如要繼續操作,請使用生物特徵辨識功能驗證身分"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"如要繼續操作,請使用指紋驗證身分"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"如要繼續操作,請使用臉孔驗證身分"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"請使用生物特徵辨識或螢幕鎖定功能驗證身分,才能繼續操作"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"無法使用生物特徵辨識硬體"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"已取消驗證"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index a75f8eb1ce7d..88a35479f490 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -618,6 +618,8 @@
<string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Sebenzisa i-biometrics noma ukukhiya isikrini"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Qinisekisa ukuthi nguwe"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Sebenzisa i-biometric yakho ukuze uqhubeke"</string>
+ <string name="biometric_dialog_fingerprint_subtitle" msgid="2520227942533751342">"Sebenzisa isigxivizo sakho somunwe ukuze uqhubeke"</string>
+ <string name="biometric_dialog_face_subtitle" msgid="5269284162191087084">"Sebenzisa ubuso bakho ukuze uqhubeke"</string>
<string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Sebenzisa i-biometric noma ukukhiya isikrini ukuze uqhubeke"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"I-Biometric hardware ayitholakali"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Ukufakazela ubuqiniso kukhanseliwe"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index dff875aee996..54dff088482b 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2891,12 +2891,14 @@
<bool name="config_multiuserDelayUserDataLocking">false</bool>
<!-- Whether the device allows users to start in background visible on displays.
- Should be false for most devices, except automotive vehicle with passenger displays. -->
+ Should be false for all devices in production. Can be enabled only for development use
+ in automotive vehicles with passenger displays. -->
<bool name="config_multiuserVisibleBackgroundUsers">false</bool>
<!-- Whether the device allows users to start in background visible on the default display.
- Should be false for most devices, except passenger-only automotive build (i.e., when
- Android runs in a separate system in the back seat to manage the passenger displays).
+ Should be false for all devices in production. Can be enabled only for development use
+ in passenger-only automotive build (i.e., when Android runs in a separate system in the
+ back seat to manage the passenger displays).
When set to true, config_multiuserVisibleBackgroundUsers must also be true. -->
<bool name="config_multiuserVisibleBackgroundUsersOnDefaultDisplay">false</bool>
diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
index 34eac35d3c0b..8028b14d53b6 100644
--- a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
+++ b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java
@@ -75,7 +75,7 @@ public class HandwritingInitiatorTest {
private static final int HW_BOUNDS_OFFSETS_TOP_PX = 20;
private static final int HW_BOUNDS_OFFSETS_RIGHT_PX = 30;
private static final int HW_BOUNDS_OFFSETS_BOTTOM_PX = 40;
- private int mHandwritingSlop = 4;
+ private int mHandwritingSlop = 2;
private static final Rect sHwArea1;
private static final Rect sHwArea2;
diff --git a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
index 9793dde0aaa5..767dd8c20b77 100644
--- a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
+++ b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
@@ -76,7 +76,7 @@ public class WindowTokenClientControllerTest {
mOriginalWindowManagerService = WindowManagerGlobal.getWindowManagerService();
WindowManagerGlobal.overrideWindowManagerServiceForTesting(mWindowManagerService);
doReturn(mClientToken).when(mWindowTokenClient).asBinder();
- mController = spy(WindowTokenClientController.getInstance());
+ mController = spy(WindowTokenClientController.createInstanceForTesting());
}
@After
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 9cb4435c82f3..ca08d56d1697 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -85,7 +85,7 @@
<string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
<string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ተጨማሪ ይመልከቱ እና ያድርጉ"</string>
<string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ለተከፈለ ማያ ገፅ ሌላ መተግበሪያ ይጎትቱ"</string>
- <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጪ ሁለቴ መታ ያድርጉ"</string>
+ <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጭ ሁለቴ መታ ያድርጉ"</string>
<string name="letterbox_education_got_it" msgid="4057634570866051177">"ገባኝ"</string>
<string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ለተጨማሪ መረጃ ይዘርጉ።"</string>
<string name="letterbox_restart_dialog_title" msgid="8543049527871033505">"ለተሻለ ዕይታ እንደገና ይጀመር?"</string>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index 04ee54046439..a3d6ce5a4c5a 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -24,7 +24,7 @@
<string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string>
<string name="pip_menu_accessibility_title" msgid="8129016817688656249">"Menu de ecrã no ecrã"</string>
<string name="pip_notification_title" msgid="1347104727641353453">"A app <xliff:g id="NAME">%s</xliff:g> está no modo de ecrã no ecrã"</string>
- <string name="pip_notification_message" msgid="8854051911700302620">"Se não pretende que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
+ <string name="pip_notification_message" msgid="8854051911700302620">"Se não quer que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
<string name="pip_play" msgid="3496151081459417097">"Reproduzir"</string>
<string name="pip_pause" msgid="690688849510295232">"Pausar"</string>
<string name="pip_skip_to_next" msgid="8403429188794867653">"Mudar para o seguinte"</string>
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index ad09067e6309..5ffec34be397 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -931,11 +931,11 @@ base::expected<FindEntryResult, NullOrIOError> AssetManager2::FindEntryInternal(
.entry = *entry,
.config = *best_config,
.type_flags = type_flags,
+ .dynamic_ref_table = package_group.dynamic_ref_table.get(),
.package_name = &best_package->GetPackageName(),
.type_string_ref = StringPoolRef(best_package->GetTypeStringPool(), best_type->id - 1),
.entry_string_ref = StringPoolRef(best_package->GetKeyStringPool(),
(*best_entry_verified)->key()),
- .dynamic_ref_table = package_group.dynamic_ref_table.get(),
};
}
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index 896b075c307c..7a60d46ef5ba 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -82,7 +82,7 @@
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"Aquesta aplicació és necessària per al teu perfil i no es pot desinstal·lar."</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"L\'administrador del dispositiu necessita l\'aplicació i no la pots desinstal·lar."</string>
<string name="manage_device_administrators" msgid="3092696419363842816">"Gestiona aplicacions d\'administració del dispositiu"</string>
- <string name="manage_users" msgid="1243995386982560813">"Gestiona usuaris"</string>
+ <string name="manage_users" msgid="1243995386982560813">"Gestiona els usuaris"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"No s\'ha pogut desinstal·lar <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="Parse_error_dlg_text" msgid="1661404001063076789">"Hi ha hagut un problema en analitzar el paquet."</string>
<string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index cfa2ca637daf..b14459ae98a3 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -25,7 +25,7 @@
<string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"App instalada."</string>
<string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string>
- <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string>
+ <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esta app?"</string>
<string name="install_confirm_question_update_owner_reminder" product="tablet" msgid="7994800761970572198">"&lt;p&gt;Atualize esta app a partir do proprietário &lt;b&gt;<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>&lt;/b&gt;?&lt;/p&gt;&lt;p&gt;Normalmente, esta app recebe atualizações a partir do proprietário &lt;b&gt;<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>&lt;/b&gt;. Se atualizar a partir de uma origem diferente, pode receber futuras atualizações de qualquer origem no seu tablet. A funcionalidade da app pode mudar.&lt;/p&gt;"</string>
<string name="install_confirm_question_update_owner_reminder" product="tv" msgid="2435174886412089791">"&lt;p&gt;Atualize esta app a partir do proprietário &lt;b&gt;<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>&lt;/b&gt;?&lt;/p&gt;&lt;p&gt;Normalmente, esta app recebe atualizações a partir do proprietário &lt;b&gt;<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>&lt;/b&gt;. Se atualizar a partir de uma origem diferente, pode receber futuras atualizações de qualquer origem na sua TV. A funcionalidade da app pode mudar.&lt;/p&gt;"</string>
<string name="install_confirm_question_update_owner_reminder" product="default" msgid="7155138616126795839">"&lt;p&gt;Atualize esta app a partir do proprietário &lt;b&gt;<xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>&lt;/b&gt;?&lt;/p&gt;&lt;p&gt;Normalmente, esta app recebe atualizações a partir do proprietário &lt;b&gt;<xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>&lt;/b&gt;. Se atualizar a partir de uma origem diferente, pode receber futuras atualizações de qualquer origem no seu telemóvel. A funcionalidade da app pode mudar.&lt;/p&gt;"</string>
@@ -58,11 +58,11 @@
<string name="uninstall_update_title" msgid="824411791011583031">"Desinstalar atualização"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> faz parte da seguinte app:"</string>
<string name="uninstall_application_text" msgid="3816830743706143980">"Desinstalar esta app?"</string>
- <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Pretende desinstalar esta app para "<b>"todos"</b>" os utilizadores? A app e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string>
- <string name="uninstall_application_text_user" msgid="498072714173920526">"Pretende desinstalar esta app para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string>
+ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Quer desinstalar esta app para "<b>"todos"</b>" os utilizadores? A app e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string>
+ <string name="uninstall_application_text_user" msgid="498072714173920526">"Quer desinstalar esta app para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string>
<string name="uninstall_application_text_current_user_work_profile" msgid="8788387739022366193">"Quer desinstalar esta app do seu perfil de trabalho?"</string>
- <string name="uninstall_update_text" msgid="863648314632448705">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos."</string>
- <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string>
+ <string name="uninstall_update_text" msgid="863648314632448705">"Quer substituir esta app pela versão de fábrica? Todos os dados são removidos."</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Quer substituir esta app pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string>
<string name="uninstall_keep_data" msgid="7002379587465487550">"Manter <xliff:g id="SIZE">%1$s</xliff:g> de dados da app."</string>
<string name="uninstall_application_text_current_user_clone_profile" msgid="835170400160011636">"Quer apagar esta app?"</string>
<string name="uninstall_application_text_with_clone_instance" msgid="6944473334273349036">"Quer desinstalar esta app? O clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> também vai ser apagado."</string>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index c9a52a87f9a6..a1a7a3b72f20 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -89,7 +89,7 @@
<string name="restart" msgid="2472034227037808749">"Reiniciar"</string>
<string name="no_connection_to_printer" msgid="2159246915977282728">"Sem ligação à impressora"</string>
<string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string>
- <string name="print_service_security_warning_title" msgid="2160752291246775320">"Pretende utilizar o <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
+ <string name="print_service_security_warning_title" msgid="2160752291246775320">"Quer utilizar o <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
<string name="print_service_security_warning_summary" msgid="1427434625361692006">"O seu documento pode passar por um ou mais servidores no respetivo caminho para a impressora."</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Preto e branco"</item>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
index 4de6c617dc4c..3b3f01912656 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
@@ -18,5 +18,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"የግል"</string>
- <string name="settingslib_category_work" msgid="4867750733682444676">"ስራ"</string>
+ <string name="settingslib_category_work" msgid="4867750733682444676">"ሥራ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index a96ea0dcc86e..19f706137072 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Oudiobron"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index a0056938e73c..324174b0c76c 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Skuif op"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 5f7aec2abc00..319ee41e0e0d 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"የኦዲዮ ምንጭ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 28ca2bb1b852..3d7fa7cafa2a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -214,7 +214,7 @@
</string-array>
<string name="choose_profile" msgid="343803890897657450">"መገለጫ ይምረጡ"</string>
<string name="category_personal" msgid="6236798763159385225">"የግል"</string>
- <string name="category_work" msgid="4014193632325996115">"ስራ"</string>
+ <string name="category_work" msgid="4014193632325996115">"ሥራ"</string>
<string name="category_clone" msgid="1554511758987195974">"አባዛ"</string>
<string name="development_settings_title" msgid="140296922921597393">"የገንቢዎች አማራጮች"</string>
<string name="development_settings_enable" msgid="4285094651288242183">"የገንቢዎች አማራጮችን አንቃ"</string>
@@ -375,7 +375,7 @@
<string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"የቀኝ-ወደ-ግራ አቀማመጥ አቅጣጫ አስገድድ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"ለሁሉም አካባቢዎች የማያ ገፅ አቀማመጥ ከቀኝ-ወደ-ግራ እንዲሆን አስገድድ"</string>
<string name="transparent_navigation_bar" msgid="1933192171384678484">"የግልፅነት የአሰሳ አሞሌ"</string>
- <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"የአሰሳ አሞሌ የዳራ ቀለምን በነባሪ ግልጽ አድርግ"</string>
+ <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"የአሰሳ አሞሌ የዳራ ቀለምን በነባሪ ግልፅ አድርግ"</string>
<string name="window_blurs" msgid="6831008984828425106">"የመስኮት ደረጃ ብዥታዎችን ፍቀድ"</string>
<string name="force_msaa" msgid="4081288296137775550">"4x MSAA አስገድድ"</string>
<string name="force_msaa_summary" msgid="9070437493586769500">"4x MSAA በ OpenGL ES 2.0 መተግበሪያዎች ውስጥ ያንቁ"</string>
@@ -388,7 +388,7 @@
<string name="window_animation_scale_title" msgid="5236381298376812508">"የ Window እነማ ልኬት ለውጥ"</string>
<string name="transition_animation_scale_title" msgid="1278477690695439337">"የእነማ ልኬት ለውጥ ሽግግር"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"እነማ አድራጊ ቆይታ መለኪያ"</string>
- <string name="overlay_display_devices_title" msgid="5411894622334469607">"ሁለተኛ ማሳያዎችን አስመስለህ ስራ"</string>
+ <string name="overlay_display_devices_title" msgid="5411894622334469607">"ሁለተኛ ማሳያዎችን አስመስለህ ሥራ"</string>
<string name="debug_applications_category" msgid="5394089406638954196">"መተግበሪያዎች"</string>
<string name="immediately_destroy_activities" msgid="1826287490705167403">"እንቅስቃሴዎችን አትጠብቅ"</string>
<string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ተጠቃሚው እስኪተወው ድረስ እያንዳንዱን እንቅስቃሴ አስወግድ"</string>
@@ -547,7 +547,7 @@
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
<string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ይህ ስልክ"</string>
<string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ይህ ጡባዊ"</string>
- <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምጽ ማውጫ"</string>
+ <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምፅ ማውጫ"</string>
<string name="media_transfer_external_device_name" msgid="2588672258721846418">"የውጭ መሣሪያ"</string>
<string name="media_transfer_default_device_name" msgid="4315604017399871828">"የተገናኘ መሣሪያ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ይህ ስልክ"</string>
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ወደ ላይ ውሰድ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 461c637ab0eb..49405077b249 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"مصدر الصوت"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index aff5c81ea860..c1b49eccef3d 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"نقل للأعلى"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"%% <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index 7e43ab322e60..a543b33567a6 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ধ্বনিৰ উৎস"</item>
<item msgid="8688681727755534982">"এমআইডিআই"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index c1128aed2fc6..f1bbe042608d 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ওপৰলৈ নিয়ক"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 357a2034ce9f..5deb5257caf8 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio Mənbə"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 57b4694e93f7..5b27ec0df384 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Yuxarı köçürün"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 0bcd9bcd5346..994369d72b4b 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Izvor zvuka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index e9e0e90ed9dc..580452d15c72 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Pomerite nagore"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index 3f5da1119b4d..ba027b21958c 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Крыніца аўдыя"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 0f6112cd1248..60979dc6d6d7 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Перамясціць уверх"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index b80b5eb76423..7c430d654f03 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Аудиоизточник"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index abd90d093463..8148cf088eb0 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Преместване нагоре"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index 71228c74a402..300e492f1ddc 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"অডিও উৎস"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index b037b134ac2a..0a0511bc6e31 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"উপরে সরান"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index f664618483d4..6276d49f7a95 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Izvor zvuka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 1a37a3fb706b..b76f6227161e 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Pomjeranje nagore"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index 24761412f5b8..3bf829cc58e7 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Font d\'àudio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 233b3e1096b9..a017f5ad4c1a 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mou cap amunt"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index c0b939543329..233732b92ff9 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Zdroj zvuku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 41d3d528f7a7..0a84473fdf92 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Přesunout nahoru"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 163ee53535c1..22534ac92b48 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Lydkilde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 30022d377a47..9645cec3c578 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Flyt op"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index 5e80e3c1e920..01db4174b0e8 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audioquelle"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index e9d885ae2818..2c5b0779b90c 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Nach oben"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 3d60335b57ea..61a44a276b1a 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Πηγή ήχου"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 19413c197772..5adab614fc3f 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Μετακίνηση προς τα επάνω"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index fa637be68f1e..2f5a72839565 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 58ea68162e91..f5e15948d731 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Move up"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index ea8f2c503467..ec6894a50177 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"0"</item>
+ <item msgid="2646486108212979598">"1"</item>
+ <item msgid="3753634915787796632">"2"</item>
+ <item msgid="4779928470672877922">"3"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index aab6224f6b30..a9a95b1c42f4 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -580,10 +580,10 @@
<string name="user_add_user_item_title" msgid="2394272381086965029">"User"</string>
<string name="user_add_profile_item_title" msgid="3111051717414643029">"Restricted profile"</string>
<string name="user_add_user_title" msgid="5457079143694924885">"Add new user?"</string>
- <string name="user_add_user_message_long" msgid="1527434966294733380">"You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper, and so on. Users can also adjust device settings like Wi‑Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. Accessibility settings and services may not transfer to the new user."</string>
+ <string name="user_add_user_message_long" msgid="1527434966294733380">"You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper and so on. Users can also adjust device settings like Wi‑Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. Accessibility settings and services may not transfer to the new user."</string>
<string name="user_add_user_message_short" msgid="3295959985795716166">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
<string name="user_grant_admin_title" msgid="5157031020083343984">"Make this user an admin?"</string>
- <string name="user_grant_admin_message" msgid="1673791931033486709">"Admins have special privileges that other users dont. An admin can manage all users, update or reset this device, modify settings, see all installed apps, and grant or revoke admin privileges for others."</string>
+ <string name="user_grant_admin_message" msgid="1673791931033486709">"Admins have special privileges that other users don\'t. An admin can manage all users, update or reset this device, modify settings, see all installed apps and grant or revoke admin privileges for others."</string>
<string name="user_grant_admin_button" msgid="5441486731331725756">"Make admin"</string>
<string name="user_setup_dialog_title" msgid="8037342066381939995">"Set up user now?"</string>
<string name="user_setup_dialog_message" msgid="269931619868102841">"Make sure the person is available to take the device and set up their space"</string>
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"Move up"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <string name="not_specified" msgid="5423502443185110328">"Not specified"</string>
+ <string name="neuter" msgid="2075249330106127310">"Neuter"</string>
+ <string name="feminine" msgid="1529155595310784757">"Feminine"</string>
+ <string name="masculine" msgid="4653978041013996303">"Masculine"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index fa637be68f1e..2f5a72839565 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 58ea68162e91..f5e15948d731 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Move up"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index fa637be68f1e..2f5a72839565 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 58ea68162e91..f5e15948d731 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Move up"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml
index 6b404a8e2159..1daa29cc078b 100644
--- a/packages/SettingsLib/res/values-en-rXC/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎Audio Source‎‏‎‎‏‎"</item>
<item msgid="8688681727755534982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎MIDI‎‏‎‎‏‎"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎0‎‏‎‎‏‎"</item>
+ <item msgid="2646486108212979598">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎1‎‏‎‎‏‎"</item>
+ <item msgid="3753634915787796632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎2‎‏‎‎‏‎"</item>
+ <item msgid="4779928470672877922">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎3‎‏‎‎‏‎"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index d69cda5434ad..af34e5b4e7bc 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎Move up‎‏‎‎‏‎"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="PERCENTAGE">%1$d</xliff:g>‎‏‎‎‏‏‏‎ %%‎‏‎‎‏‎"</string>
+ <string name="not_specified" msgid="5423502443185110328">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎Not specified‎‏‎‎‏‎"</string>
+ <string name="neuter" msgid="2075249330106127310">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎Neuter‎‏‎‎‏‎"</string>
+ <string name="feminine" msgid="1529155595310784757">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎Feminine‎‏‎‎‏‎"</string>
+ <string name="masculine" msgid="4653978041013996303">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎Masculine‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index 27cdeeb6bd42..c81f136dafb2 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fuente de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 39fd3412a8b9..069a73ce87ab 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mover hacia arriba"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index a16093aa65bd..5ad5a876b54f 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fuente de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index df256e5da742..5fe2d53ecd8b 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Muévete hacia arriba"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index d6869614ce87..13f1395cb09a 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Heliallikas"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index be847b308333..b22380193c03 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Liiguta üles"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 17d5e1d7fb34..3d4c0a693368 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio-iturburua"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 93abed2a16cd..b5a22dd98946 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Eraman gora"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"%% <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 0eb381f90f45..82de8854406c 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"منبع صوتی"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 9f33fa424425..43c410345130 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"انتقال به‌بالا"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>٪"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index a3cfd15ad119..b4e60a307c94 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Äänilähde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 6ac22b22bb5c..3a1320b55d87 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Siirrä ylös"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 3fb18334638d..7db328ba0e81 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Source audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 532374dae6db..c7a399657679 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Déplacez vers le haut"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index a1a8c99f3eba..4212b1c76cce 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Source audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 683cfa562d9b..a3eec6bd7034 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Déplacer vers le haut"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index bd88e8351d2c..09ea492d8e6b 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fonte de audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 0661d7aeb794..fa20dfcef58d 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mover cara arriba"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index e33c7592cbcc..77ba9a90602e 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ઑડિઓ સ્રોત"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index b92d2f214626..5c7d991d8f24 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ઉપર ખસેડો"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index 2403848229bd..27950532a9fe 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ऑडियो स्रोत"</item>
<item msgid="8688681727755534982">"एमआईडीआई"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index bd508d93e50d..bc0907cf249c 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ऊपर की ओर ले जाएं"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 3cb64abeb9b9..53b342fa3779 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audioizvor"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 7a8507dfb22e..1a71e0ab9f32 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Pomicanje prema gore"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index f4c11762035d..42b0a4598eb0 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Hangforrás"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a67748fa7516..141211a72207 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mozgatás felfelé"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index e9c366d9b25c..a3f16d175216 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Ձայնի աղբյուրը"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index b72b09488cfa..70d736df49b6 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Տեղափոխել վերև"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index 95aeee75d267..461551b709e1 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Sumber Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 07dd53ae320b..277aab8b11f8 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Pindahkan ke atas"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index f0ee71846879..c0c85235b3e7 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio Source"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index bb7bf7074321..49fefcf30822 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Færa upp"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index b6b2fdeae2a7..1b5fc772e5bc 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Sorgente audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 5926a6b5c793..ff95cc95d8aa 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Sposta in alto"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index ca3a4dd57082..01bb1fb5339e 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"מקור אודיו"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"0"</item>
+ <item msgid="2646486108212979598">"1"</item>
+ <item msgid="3753634915787796632">"2"</item>
+ <item msgid="4779928470672877922">"3"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 51bda70539b3..77787dcfffe2 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"הזזה למעלה"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"%% <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
+ <string name="not_specified" msgid="5423502443185110328">"לא רוצה להגדיר"</string>
+ <string name="neuter" msgid="2075249330106127310">"ניטרלי"</string>
+ <string name="feminine" msgid="1529155595310784757">"נקבה"</string>
+ <string name="masculine" msgid="4653978041013996303">"זכר"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index b3267fe3aa25..131df20048d6 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"オーディオソース"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index d15b4effdf09..65f72c909d9c 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"上に移動"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index ab6acfd4f628..84bcd9f0ac1b 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"აუდიო წყარo"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index f63d4c23f6cc..40c521ea6ca8 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ზემოთ გადატანა"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index 2b1d700ed58e..9c874c7c8cec 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Аудио көзі"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 883dea61edc5..690dee1be76a 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Жоғары жылжыту"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index 0f20bf0d1f81..3053f2810383 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ប្រភព​អូឌីយ៉ូ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index f7a8bfdaaa80..1a00891f4da6 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ផ្លាស់ទី​ឡើង​លើ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 00e8049d02c5..762d8f1bcd4f 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"ಆಡಿಯೊ ಮೂಲ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"0"</item>
+ <item msgid="2646486108212979598">"1"</item>
+ <item msgid="3753634915787796632">"2"</item>
+ <item msgid="4779928470672877922">"3"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index e29e22bb5aa8..36f78b583daf 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"ಮೇಲಕ್ಕೆ ಸರಿಸಿ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <string name="not_specified" msgid="5423502443185110328">"ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="neuter" msgid="2075249330106127310">"ನಪುಂಸಕ"</string>
+ <string name="feminine" msgid="1529155595310784757">"ಮಹಿಳೆಯರಿಗಾಗಿ"</string>
+ <string name="masculine" msgid="4653978041013996303">"ಪುರುಷರಿಗಾಗಿ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 85a0a4ad98b1..7faaa193c136 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"오디오 소스"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 653ac2359cba..2ba9c39f87bf 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"위로 이동"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index eb295ae76134..66eec9e7d4ee 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Аудио булак"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index c2aa6520ae46..275ab1975ed5 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Жогору жылдыруу"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index ccb777b19464..6f4833f7ff43 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ແຫຼ່ງ​ທີ່​ມາ​ຂອງ​ສຽງ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 0a429fd5d5be..7481ebfc3bdb 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ຍ້າຍຂຶ້ນ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 010b3b49c9fb..59f2ef2ff315 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Garso šaltinis"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 78246dce4713..05d0b37184ec 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Perkelti aukštyn"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 2c7ac9846bb4..eacf2cd46d54 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio avots"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index e3fbcdf02d01..d5adce4e2af2 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Pārvietojiet pirkstu augšup"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index a276eb3a8200..d829aafc07e2 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Аудиоизвор"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 6ba8d5c59f79..0a864a1052e9 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Преместете нагоре"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index 6eb432cb2213..5e535d36b0a1 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"ഓഡിയോ ഉറവിടം"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"0"</item>
+ <item msgid="2646486108212979598">"1"</item>
+ <item msgid="3753634915787796632">"2"</item>
+ <item msgid="4779928470672877922">"3"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 0f4d30d04187..8b3caae1935b 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"മുകളിലേക്ക് നീക്കുക"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <string name="not_specified" msgid="5423502443185110328">"വ്യക്തമാക്കിയിട്ടില്ലാത്തവ"</string>
+ <string name="neuter" msgid="2075249330106127310">"നപുംസകലിംഗം"</string>
+ <string name="feminine" msgid="1529155595310784757">"സ്ത്രീലിംഗം"</string>
+ <string name="masculine" msgid="4653978041013996303">"പുല്ലിംഗം"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 925c827d9bf3..bcf32cc14c65 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Аудио эх сурвалж"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 29fb6d4b86c0..d32356055f7c 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Дээш зөөх"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index e3b6ae63ee51..d25af6a92b24 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ऑडिओ स्रोत"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index e9e0ee48984a..dea7c17f9f3c 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"वरती हलवा"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 6b8bce4aaae9..291a89968193 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Sumber Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 0a41c0f6a554..48bb22286e70 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Alih ke atas"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 59e1862b5cbe..76acf1baaa9e 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"အသံ ရင်းမြစ်"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 7346d9158d60..77d5d8097af5 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"အပေါ်သို့ရွှေ့ရန်"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index c364c58d2013..4cd8f15bd533 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Lydkilde"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index dc68bf3dd714..4912df09702a 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Flytt opp"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index eaea3ba41bc2..6d618f8edfca 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -282,4 +282,10 @@
<item msgid="8828567335701536560">"अडियो स्रोत"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <string-array name="grammatical_gender_values">
+ <item msgid="4976102487934077239">"०"</item>
+ <item msgid="2646486108212979598">"१"</item>
+ <item msgid="3753634915787796632">"२"</item>
+ <item msgid="4779928470672877922">"३"</item>
+ </string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 5d611329dd10..e536c16ff09d 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -692,4 +692,8 @@
<item msgid="324200556467459329">"माथितिर सार्नुहोस्"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <string name="not_specified" msgid="5423502443185110328">"नतोकिएको"</string>
+ <string name="neuter" msgid="2075249330106127310">"नपुंसक लिङ्ग"</string>
+ <string name="feminine" msgid="1529155595310784757">"स्त्रीलिङ्ग"</string>
+ <string name="masculine" msgid="4653978041013996303">"पुलिङ्ग"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index b8e945ff7982..aaa1fa8ebf0d 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audiobron"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 51fc99a21236..ac655175c002 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Omhoog verplaatsen"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
index d649907966f6..a76355e3a573 100644
--- a/packages/SettingsLib/res/values-or/arrays.xml
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ଅଡିଓ ଉତ୍ସ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index bf7470cd3dd8..a3e0ff2f5aba 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -310,7 +310,7 @@
<string name="select_logd_size_dialog_title" msgid="2105401994681013578">"ଲଗ୍‌ ବଫର୍‌ ପିଛା ଲଗର୍‌ ଆକାରଗୁଡିକର ଚୟନ କରନ୍ତୁ"</string>
<string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"ଲଗର୍‌ ରୋଧି ଷ୍ଟୋରେଜ୍‌ ଖାଲି କରିବେ?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"ଯଦି ଆମେ ଦୃଢ ଲଗର୍‌ ସହିତ ଆଉ ତଦାରଖ କରୁନଥିବୁ, ତେବେ ଆମକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ଥିବା ଲଗର୍‌ ଡାଟାକୁ ଲିଭାଇବାକୁ ପଡ଼ିବ।"</string>
- <string name="select_logpersist_title" msgid="447071974007104196">"ଡିଭାଇସ୍‌ରେ ଲଗାତାର ଲଗର୍‌ ଡାଟା ଷ୍ଟୋର୍‌ କରନ୍ତୁ"</string>
+ <string name="select_logpersist_title" msgid="447071974007104196">"ଡିଭାଇସରେ ନିରନ୍ତର ଲଗର ଡାଟା ଷ୍ଟୋର କରନ୍ତୁ"</string>
<string name="select_logpersist_dialog_title" msgid="7745193591195485594">"ଡିଭାଇସ୍‌ରେ ଲଗାତର ଷ୍ଟୋର୍‌ କରିବାକୁ ଲଗ୍‌ ବଫର୍‌ ଚୟନ କରନ୍ତୁ"</string>
<string name="select_usb_configuration_title" msgid="6339801314922294586">"USB କନଫିଗ୍ୟୁରେସନ୍‌ ଚୟନ କରନ୍ତୁ"</string>
<string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"USB କନଫିଗ୍ୟୁରେସନ୍‌ ଚୟନ କରନ୍ତୁ"</string>
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ଉପରକୁ ମୁଭ କରନ୍ତୁ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index 4f58a3c7f150..bf554fcad994 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">" ਆਡੀਓ ਸਰੋਤ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 3c4c4bc811b9..4b6b90df6fbf 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ਉੱਪਰ ਲਿਜਾਓ"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index 671ae4129777..b2d3e6818a44 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Źródło dźwięku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 62f7e81fe361..9d076d593df8 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Przenieś w górę"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index e3b77017c006..43137504321c 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI (som)"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 6880511f4d97..8d530485b6e9 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mover para cima"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index ba302806de8a..0d92db6a0c7d 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 49e3f91461f1..af10778ec828 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -308,7 +308,7 @@
<string name="wifi_unmetered_label" msgid="6174142840934095093">"Acesso ilimitado"</string>
<string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos da memória intermédia do registo"</string>
<string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Selec. tam. reg. p/ mem. int. reg."</string>
- <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Pretende limpar o armazenamento persistente do registo?"</string>
+ <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Quer limpar o armazenamento persistente do registo?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Quando deixamos de monitorizar com o registo persistente, é necessário apagar os dados de registo que se encontram no seu dispositivo."</string>
<string name="select_logpersist_title" msgid="447071974007104196">"Guardar dados de registo consistentemente"</string>
<string name="select_logpersist_dialog_title" msgid="7745193591195485594">"Selecionar buffers de registo para armazenamento persistente no dispositivo"</string>
@@ -569,12 +569,12 @@
<string name="blob_id_text" msgid="8680078988996308061">"ID de dados partilhados: <xliff:g id="BLOB_ID">%d</xliff:g>"</string>
<string name="blob_expires_text" msgid="7882727111491739331">"Expira a <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="shared_data_delete_failure_text" msgid="3842701391009628947">"Ocorreu um erro ao eliminar os dados partilhados."</string>
- <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"Não existem alocações adquiridas para estes dados partilhados. Pretende eliminá-los?"</string>
+ <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"Não existem alocações adquiridas para estes dados partilhados. Quer eliminá-los?"</string>
<string name="accessor_info_title" msgid="8289823651512477787">"Apps a partilhar dados"</string>
<string name="accessor_no_description_text" msgid="7510967452505591456">"Nenhuma descrição fornecida pela app."</string>
<string name="accessor_expires_text" msgid="4625619273236786252">"A alocação expira a <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="delete_blob_text" msgid="2819192607255625697">"Eliminar dados partilhados"</string>
- <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Tem a certeza de que pretende eliminar estes dados partilhados?"</string>
+ <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Tem a certeza de que quer eliminar estes dados partilhados?"</string>
<string name="user_add_user_item_summary" msgid="5748424612724703400">"Os utilizadores têm as suas próprias aplicações e conteúdos"</string>
<string name="user_add_profile_item_summary" msgid="5418602404308968028">"Pode restringir o acesso às aplicações e conteúdos da sua conta"</string>
<string name="user_add_user_item_title" msgid="2394272381086965029">"Utilizador"</string>
@@ -607,7 +607,7 @@
<string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
<string name="guest_reset_guest" msgid="6110013010356013758">"Repor convidado"</string>
- <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Pretende repor o convidado?"</string>
+ <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Quer repor o convidado?"</string>
<string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover o convidado?"</string>
<string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Repor"</string>
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Remover"</string>
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mover para cima"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index e3b77017c006..43137504321c 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Fonte de áudio"</item>
<item msgid="8688681727755534982">"MIDI (som)"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 6880511f4d97..8d530485b6e9 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Mover para cima"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index 613a631811a6..8b7a4da915d3 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Sursă audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 1dce0e12cf1e..361d0b6b5367 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Deplasează în sus"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index c1bb31ee8d40..7474370f6932 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Источник аудио"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 79db17c02750..3a62f0c8f48a 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Переместите палец вверх"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 0fa107448db4..197e1554e0fd 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ශ්‍රව්‍ය මූලය"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index c43f5dd6426d..549ad8168cf1 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ඉහළට ගෙන යන්න"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index ecc4afecc186..d9c14a2ea709 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Zdroj zvuku"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index ec383f94fa44..3b14a9f5ec4c 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Presuňte nahor"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index 0f2225ae0ea5..bc2398faa6c0 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Vir zvoka"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 4d0e7a8e297f..f119484db248 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Premaknite se navzgor"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index d92ee582ed82..6c05058cd262 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Burimi i audios"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 2fdac37e1dc8..666952e0c518 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Lëvize lart"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 69564fa9848d..a9b6f2753fa3 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Извор звука"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index dc698ce037ec..12848b41a2d0 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Померите нагоре"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index daaa1386492b..ed40b657aeb1 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Ljudkälla"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 64412dd5af5a..5be47eb33ab5 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Flytta uppåt"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index a5555969bf5c..3d40a08d6f26 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Chanzo cha Sauti"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 4893fe838967..73cab1d9221b 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Sogeza juu"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"Asilimia <xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 6195e3c10e6e..b20ee265ce00 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ஆடியோ மூலம்"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index b72c5339db38..527bc67a1c3d 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"மேலே நகர்த்துங்கள்"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 2a31c0dad2d0..d22946327eba 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"ఆడియో మూలం"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index ae1b2519609b..dd0ea23de7db 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"పైకి జరపండి"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index b66fe5c8e635..a9b33b33fae6 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"แหล่งที่มาของเสียง"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 14ef3a3703b4..d81f2f992b56 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"ย้ายขึ้น"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index d9fee742e54c..27c10a9c43ac 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Pinagmulan ng Audio"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index ab4acb650fbc..557bb37b98e8 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Ilipat pataas"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index e22ad902e3a6..52eae36ae130 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Ses Kaynağı"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index abbef53f4ee7..fe95e569ed28 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Yukarı taşı"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"%%<xliff:g id="PERCENTAGE">%1$d</xliff:g>"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index dc02eebc218c..991ebf7d0463 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Джерело аудіо"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index bf297e66c9d8..9c9e5bf78150 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Перемістіть палець угору"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index be76762d9cde..4756f6c9cbb7 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"آڈیو ماخذ"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index db2bb2615aac..90b70d2517ec 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"اوپر منتقل کریں"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index 860761e0fa6b..39407e46c0b4 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Audio manbasi"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 96e5d6a085c2..d4e6eacc6f7c 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Tepaga siljitish"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index 4c6392b1a493..353e323f4a96 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Nguồn âm thanh"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 7035077087ef..bb4df9d6c2a3 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Di chuyển lên"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index 679098a8411e..20043f5f1ce4 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"音频来源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index fabc00483d7e..f4de92dc5f09 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"上移"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 746ac68f3afe..c0479a2d66f6 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"音效檔案來源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 9ec57a33a931..428c23a6e94f 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"向上移"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index b7fb99bcbf4a..f54589d48a8a 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"音訊來源"</item>
<item msgid="8688681727755534982">"MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 59e66aaebb5c..1de769999c18 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"向上移"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 63b19e25d1b7..9b11e3ce5ffc 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -282,4 +282,8 @@
<item msgid="8828567335701536560">"Umthombo Womsindo"</item>
<item msgid="8688681727755534982">"I-MIDI"</item>
</string-array>
+ <!-- no translation found for grammatical_gender_values:0 (4976102487934077239) -->
+ <!-- no translation found for grammatical_gender_values:1 (2646486108212979598) -->
+ <!-- no translation found for grammatical_gender_values:2 (3753634915787796632) -->
+ <!-- no translation found for grammatical_gender_values:3 (4779928470672877922) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index d292bd567718..4a95aef8b998 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -692,4 +692,12 @@
<item msgid="324200556467459329">"Khuphula"</item>
</string-array>
<string name="font_scale_percentage" msgid="2624057443622817886">"<xliff:g id="PERCENTAGE">%1$d</xliff:g> %%"</string>
+ <!-- no translation found for not_specified (5423502443185110328) -->
+ <skip />
+ <!-- no translation found for neuter (2075249330106127310) -->
+ <skip />
+ <!-- no translation found for feminine (1529155595310784757) -->
+ <skip />
+ <!-- no translation found for masculine (4653978041013996303) -->
+ <skip />
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index 7e275607e36f..1ea155a6a623 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -82,6 +82,13 @@ public abstract class InfoMediaManager extends MediaManager {
private static final String TAG = "InfoMediaManager";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ /** Checked exception that signals the specified package is not present in the system. */
+ public static class PackageNotAvailableException extends Exception {
+ public PackageNotAvailableException(String message) {
+ super(message);
+ }
+ }
+
protected String mPackageName;
private MediaDevice mCurrentConnectedDevice;
private final LocalBluetoothManager mBluetoothManager;
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
new file mode 100644
index 000000000000..70956e9221e2
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
@@ -0,0 +1,320 @@
+/*
+ * 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.media;
+
+import android.annotation.SuppressLint;
+import android.app.Notification;
+import android.content.Context;
+import android.media.MediaRoute2Info;
+import android.media.MediaRouter2;
+import android.media.MediaRouter2.RoutingController;
+import android.media.MediaRouter2Manager;
+import android.media.RouteDiscoveryPreference;
+import android.media.RouteListingPreference;
+import android.media.RoutingSessionInfo;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+/** Implements {@link InfoMediaManager} using {@link MediaRouter2}. */
+@SuppressLint("MissingPermission")
+public final class RouterInfoMediaManager extends InfoMediaManager {
+
+ private static final String TAG = "RouterInfoMediaManager";
+
+ private final MediaRouter2 mRouter;
+ private final MediaRouter2Manager mRouterManager;
+
+ private final Executor mExecutor = Executors.newSingleThreadExecutor();
+
+ private final RouteCallback mRouteCallback = new RouteCallback();
+ private final TransferCallback mTransferCallback = new TransferCallback();
+ private final ControllerCallback mControllerCallback = new ControllerCallback();
+ private final RouteListingPreferenceCallback mRouteListingPreferenceCallback =
+ new RouteListingPreferenceCallback();
+
+ // TODO: b/192657812 - Create factory method in InfoMediaManager to return
+ // RouterInfoMediaManager or ManagerInfoMediaManager based on flag.
+ public RouterInfoMediaManager(
+ Context context,
+ String packageName,
+ Notification notification,
+ LocalBluetoothManager localBluetoothManager) throws PackageNotAvailableException {
+ super(context, packageName, notification, localBluetoothManager);
+
+ // TODO: b/291277292 - Change optional package name for a mandatory uid.
+ if (packageName == null) {
+ packageName = context.getPackageName();
+ }
+
+ mRouter = MediaRouter2.getInstance(context, packageName);
+
+ if (mRouter == null) {
+ throw new PackageNotAvailableException(
+ "Package name " + packageName + " does not exist.");
+ }
+ mRouterManager = MediaRouter2Manager.getInstance(context);
+ }
+
+ @Override
+ protected void startScanOnRouter() {
+ mRouter.registerRouteCallback(mExecutor, mRouteCallback, RouteDiscoveryPreference.EMPTY);
+ mRouter.registerRouteListingPreferenceCallback(mExecutor, mRouteListingPreferenceCallback);
+ mRouter.registerTransferCallback(mExecutor, mTransferCallback);
+ mRouter.registerControllerCallback(mExecutor, mControllerCallback);
+ mRouter.startScan();
+ }
+
+ @Override
+ public void stopScan() {
+ mRouter.stopScan();
+ mRouter.unregisterControllerCallback(mControllerCallback);
+ mRouter.unregisterTransferCallback(mTransferCallback);
+ mRouter.unregisterRouteListingPreferenceCallback(mRouteListingPreferenceCallback);
+ mRouter.unregisterRouteCallback(mRouteCallback);
+ }
+
+ @Override
+ protected boolean connectDeviceWithoutPackageName(@NonNull MediaDevice device) {
+ if (device.mRouteInfo == null) {
+ return false;
+ }
+
+ RoutingController controller = mRouter.getSystemController();
+ mRouter.transfer(controller, device.mRouteInfo);
+ return true;
+ }
+
+ @Override
+ protected void transferToRoute(@NonNull MediaRoute2Info route) {
+ mRouter.transferTo(route);
+ }
+
+ @Override
+ protected void selectRoute(@NonNull MediaRoute2Info route, @NonNull RoutingSessionInfo info) {
+ RoutingController controller = getControllerForSession(info);
+ if (controller != null) {
+ controller.selectRoute(route);
+ }
+ }
+
+ @Override
+ protected void deselectRoute(@NonNull MediaRoute2Info route, @NonNull RoutingSessionInfo info) {
+ RoutingController controller = getControllerForSession(info);
+ if (controller != null) {
+ controller.deselectRoute(route);
+ }
+ }
+
+ @Override
+ protected void releaseSession(@NonNull RoutingSessionInfo sessionInfo) {
+ RoutingController controller = getControllerForSession(sessionInfo);
+ if (controller != null) {
+ controller.release();
+ }
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getSelectableRoutes(@NonNull RoutingSessionInfo info) {
+ RoutingController controller = getControllerForSession(info);
+ if (controller == null) {
+ return Collections.emptyList();
+ }
+
+ // Filter out selected routes.
+ List<String> selectedRouteIds = controller.getRoutingSessionInfo().getSelectedRoutes();
+ return controller.getSelectableRoutes().stream()
+ .filter(route -> !selectedRouteIds.contains(route.getId()))
+ .collect(Collectors.toList());
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo info) {
+ RoutingController controller = getControllerForSession(info);
+ if (controller == null) {
+ return Collections.emptyList();
+ }
+
+ return controller.getDeselectableRoutes();
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo info) {
+ RoutingController controller = getControllerForSession(info);
+ if (controller == null) {
+ return Collections.emptyList();
+ }
+ return controller.getSelectedRoutes();
+ }
+
+ @Override
+ protected void setSessionVolume(@NonNull RoutingSessionInfo info, int volume) {
+ // TODO: b/291277292 - Implement MediaRouter2-based solution. Keeping MR2Manager call as
+ // MR2 filters information by package name.
+ mRouterManager.setSessionVolume(info, volume);
+ }
+
+ @Override
+ protected void setRouteVolume(@NonNull MediaRoute2Info route, int volume) {
+ mRouter.setRouteVolume(route, volume);
+ }
+
+ @Nullable
+ @Override
+ protected RouteListingPreference getRouteListingPreference() {
+ return mRouter.getRouteListingPreference();
+ }
+
+ @NonNull
+ @Override
+ protected List<RoutingSessionInfo> getRemoteSessions() {
+ // TODO: b/291277292 - Implement MediaRouter2-based solution. Keeping MR2Manager call as
+ // MR2 filters information by package name.
+ return mRouterManager.getRemoteSessions();
+ }
+
+ @NonNull
+ @Override
+ protected List<RoutingSessionInfo> getRoutingSessionsForPackage() {
+ return mRouter.getControllers().stream()
+ .map(RoutingController::getRoutingSessionInfo)
+ .collect(Collectors.toList());
+ }
+
+ @Nullable
+ @Override
+ protected RoutingSessionInfo getRoutingSessionById(@NonNull String sessionId) {
+ // TODO: b/291277292 - Implement MediaRouter2-based solution. Keeping MR2Manager calls as
+ // MR2 filters information by package name.
+
+ for (RoutingSessionInfo sessionInfo : getRemoteSessions()) {
+ if (TextUtils.equals(sessionInfo.getId(), sessionId)) {
+ return sessionInfo;
+ }
+ }
+
+ RoutingSessionInfo systemSession = mRouterManager.getSystemRoutingSession(null);
+ return TextUtils.equals(systemSession.getId(), sessionId) ? systemSession : null;
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getAllRoutes() {
+ return mRouter.getAllRoutes();
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getAvailableRoutesFromRouter() {
+ return mRouter.getRoutes();
+ }
+
+ @NonNull
+ @Override
+ protected List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) {
+ List<MediaRoute2Info> transferableRoutes = new ArrayList<>();
+
+ List<RoutingController> controllers = mRouter.getControllers();
+ RoutingController activeController = controllers.get(controllers.size() - 1);
+ RoutingSessionInfo sessionInfo = activeController.getRoutingSessionInfo();
+ List<MediaRoute2Info> routes = mRouter.getRoutes();
+
+ for (MediaRoute2Info route : routes) {
+ boolean isCrossDeviceTransfer = sessionInfo.isSystemSession() ^ route.isSystemRoute();
+
+ // Always show remote routes if transfer is local -> remote or viceversa regardless of
+ // whether route is in transferable routes list.
+ if (sessionInfo.getTransferableRoutes().contains(route.getId())
+ || isCrossDeviceTransfer) {
+ transferableRoutes.add(route);
+ }
+ }
+
+ return transferableRoutes;
+ }
+
+ @Nullable
+ private RoutingController getControllerForSession(@NonNull RoutingSessionInfo sessionInfo) {
+ return mRouter.getController(sessionInfo.getId());
+ }
+
+ private final class RouteCallback extends MediaRouter2.RouteCallback {
+ @Override
+ public void onRoutesUpdated(@NonNull List<MediaRoute2Info> routes) {
+ refreshDevices();
+ }
+
+ @Override
+ public void onPreferredFeaturesChanged(@NonNull List<String> preferredFeatures) {
+ refreshDevices();
+ }
+ }
+
+ private final class TransferCallback extends MediaRouter2.TransferCallback {
+ @Override
+ public void onTransfer(
+ @NonNull RoutingController oldController,
+ @NonNull RoutingController newController) {
+ rebuildDeviceList();
+ notifyCurrentConnectedDeviceChanged();
+ }
+
+ @Override
+ public void onTransferFailure(@NonNull MediaRoute2Info requestedRoute) {
+ // Do nothing.
+ }
+
+ @Override
+ public void onStop(@NonNull RoutingController controller) {
+ refreshDevices();
+ }
+
+ @Override
+ public void onRequestFailed(int reason) {
+ dispatchOnRequestFailed(reason);
+ }
+ }
+
+ private final class ControllerCallback extends MediaRouter2.ControllerCallback {
+ @Override
+ public void onControllerUpdated(@NonNull RoutingController controller) {
+ refreshDevices();
+ }
+ }
+
+ private final class RouteListingPreferenceCallback
+ extends MediaRouter2.RouteListingPreferenceCallback {
+ @Override
+ public void onRouteListingPreferenceChanged(@Nullable RouteListingPreference preference) {
+ notifyRouteListingPreferenceUpdated(preference);
+ refreshDevices();
+ }
+ }
+}
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 78d9361272d2..712b737af6a1 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -154,6 +154,7 @@ android_library {
"res-keyguard",
"res",
],
+ use_resource_processor: true,
static_libs: [
"WifiTrackerLib",
"WindowManager-Shell",
@@ -193,6 +194,7 @@ android_library {
"SystemUI-tags",
"SystemUI-proto",
"monet",
+ "libmonet",
"dagger2",
"jsr305",
"jsr330",
@@ -307,6 +309,8 @@ filegroup {
"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",
],
path: "tests/src",
}
@@ -372,6 +376,7 @@ android_library {
"testables",
"truth-prebuilt",
"monet",
+ "libmonet",
"dagger2",
"jsr330",
"WindowManager-Shell",
@@ -528,6 +533,7 @@ android_app {
],
resource_dirs: [],
+ use_resource_processor: true,
platform_apis: true,
system_ext_specific: true,
certificate: "platform",
diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING
index c59b0f9c8e9a..1bd83551886a 100644
--- a/packages/SystemUI/TEST_MAPPING
+++ b/packages/SystemUI/TEST_MAPPING
@@ -35,6 +35,9 @@
},
{
"exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
}
@@ -139,6 +142,9 @@
},
{
"exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
index d65edae1caf0..798bdec49f11 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt
@@ -62,7 +62,7 @@ private val KNOWN_PLUGINS =
"com.android.systemui.falcon.nine" to listOf(ClockMetadata("DIGITAL_CLOCK_WEATHER")),
)
-private fun <TKey, TVal> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut(
+private fun <TKey : Any, TVal : Any> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut(
key: TKey,
value: TVal,
onNew: () -> Unit
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
index 450c6166905c..46a90f63431a 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
+++ b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
@@ -377,6 +377,8 @@ internal constructor(
}
}
+@Deprecated("Please use com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors " +
+ "instead")
class ColorScheme(
@ColorInt val seed: Int,
val darkTheme: Boolean,
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/README.md b/packages/SystemUI/monet/src/com/android/systemui/monet/README.md
deleted file mode 100644
index e4818f9c8d81..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-Subpackages, i.e. folders, in this directory have their source of truth in the internal Google
-source code repository.
-
-The code is manually copied because:
-
-- Alternatives are automatically syncing Material Color Utilities from the internal Google source
- repository, or GitHub.
-- Having Android's core automatically taking updates from code that changes regularly, and can
- easily affect design, is undesirable.
-
-To update the code:
-
-1. Copy Material Color Utilities (libmonet internally) from the internal Google source repository to
- this directory.
-2. Replace package definitions. Use Find and Replace in directory, replace
- com.google.ux.material.libmonet with com.android.systemui.monet.
-3. Remove @CanIgnoreReturnValue and @CheckReturnValue, both usage and imports. Currently only in
- Scheme.java. Chose removal because only Android /external libraries depend on the library with
- these annotations.
-4. Copy tests for Material Color Utilities to
- frameworks/base/packages/SystemUI/tests/src/com/android/systemui/monet/
-5. Remove HctRoundTripTest (~3 minutes to run) and QuantizerCelebiTest (depends on internal source
- repository code for handling images)
-6. Reformat regular and test code to Android bracing/spacing style.
- In Android Studio, right click on the package, and choose Reformat Code.
-7. Change tests to subclass SysuiTestCase and use an annotation such as @SmallTest / @MediumTest.
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/blend/Blend.java b/packages/SystemUI/monet/src/com/android/systemui/monet/blend/Blend.java
deleted file mode 100644
index 927417a57c03..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/blend/Blend.java
+++ /dev/null
@@ -1,92 +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.monet.blend;
-
-import com.android.systemui.monet.hct.Cam16;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.utils.ColorUtils;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** Functions for blending in HCT and CAM16. */
-public class Blend {
- private Blend() {
- }
-
- /**
- * Blend the design color's HCT hue towards the key color's HCT hue, in a way that leaves the
- * original color recognizable and recognizably shifted towards the key color.
- *
- * @param designColor ARGB representation of an arbitrary color.
- * @param sourceColor ARGB representation of the main theme color.
- * @return The design color with a hue shifted towards the system's color, a slightly
- * warmer/cooler variant of the design color's hue.
- */
- public static int harmonize(int designColor, int sourceColor) {
- Hct fromHct = Hct.fromInt(designColor);
- Hct toHct = Hct.fromInt(sourceColor);
- double differenceDegrees = MathUtils.differenceDegrees(fromHct.getHue(), toHct.getHue());
- double rotationDegrees = Math.min(differenceDegrees * 0.5, 15.0);
- double outputHue =
- MathUtils.sanitizeDegreesDouble(
- fromHct.getHue()
- + rotationDegrees * MathUtils.rotationDirection(fromHct.getHue(),
- toHct.getHue()));
- return Hct.from(outputHue, fromHct.getChroma(), fromHct.getTone()).toInt();
- }
-
- /**
- * Blends hue from one color into another. The chroma and tone of the original color are
- * maintained.
- *
- * @param from ARGB representation of color
- * @param to ARGB representation of color
- * @param amount how much blending to perform; 0.0 >= and <= 1.0
- * @return from, with a hue blended towards to. Chroma and tone are constant.
- */
- public static int hctHue(int from, int to, double amount) {
- int ucs = cam16Ucs(from, to, amount);
- Cam16 ucsCam = Cam16.fromInt(ucs);
- Cam16 fromCam = Cam16.fromInt(from);
- Hct blended = Hct.from(ucsCam.getHue(), fromCam.getChroma(),
- ColorUtils.lstarFromArgb(from));
- return blended.toInt();
- }
-
- /**
- * Blend in CAM16-UCS space.
- *
- * @param from ARGB representation of color
- * @param to ARGB representation of color
- * @param amount how much blending to perform; 0.0 >= and <= 1.0
- * @return from, blended towards to. Hue, chroma, and tone will change.
- */
- public static int cam16Ucs(int from, int to, double amount) {
- Cam16 fromCam = Cam16.fromInt(from);
- Cam16 toCam = Cam16.fromInt(to);
- double fromJ = fromCam.getJstar();
- double fromA = fromCam.getAstar();
- double fromB = fromCam.getBstar();
- double toJ = toCam.getJstar();
- double toA = toCam.getAstar();
- double toB = toCam.getBstar();
- double jstar = fromJ + (toJ - fromJ) * amount;
- double astar = fromA + (toA - fromA) * amount;
- double bstar = fromB + (toB - fromB) * amount;
- return Cam16.fromUcs(jstar, astar, bstar).toInt();
- }
-}
-
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/contrast/Contrast.java b/packages/SystemUI/monet/src/com/android/systemui/monet/contrast/Contrast.java
deleted file mode 100644
index ada8cedf30d8..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/contrast/Contrast.java
+++ /dev/null
@@ -1,215 +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.monet.contrast;
-
-
-import static java.lang.Math.max;
-
-import com.android.systemui.monet.utils.ColorUtils;
-
-/**
- * Color science for contrast utilities.
- *
- * <p>Utility methods for calculating contrast given two colors, or calculating a color given one
- * color and a contrast ratio.
- *
- * <p>Contrast ratio is calculated using XYZ's Y. When linearized to match human perception, Y
- * becomes HCT's tone and L*a*b*'s' L*.
- */
-public final class Contrast {
- // The minimum contrast ratio of two colors.
- // Contrast ratio equation = lighter + 5 / darker + 5, if lighter == darker, ratio == 1.
- public static final double RATIO_MIN = 1.0;
-
- // The maximum contrast ratio of two colors.
- // Contrast ratio equation = lighter + 5 / darker + 5. Lighter and darker scale from 0 to 100.
- // If lighter == 100, darker = 0, ratio == 21.
- public static final double RATIO_MAX = 21.0;
- public static final double RATIO_30 = 3.0;
- public static final double RATIO_45 = 4.5;
- public static final double RATIO_70 = 7.0;
-
- // Given a color and a contrast ratio to reach, the luminance of a color that reaches that ratio
- // with the color can be calculated. However, that luminance may not contrast as desired, i.e.
- // the contrast ratio of the input color and the returned luminance may not reach the contrast
- // ratio asked for.
- //
- // When the desired contrast ratio and the result contrast ratio differ by more than this
- // amount, an error value should be returned, or the method should be documented as 'unsafe',
- // meaning, it will return a valid luminance but that luminance may not meet the requested
- // contrast ratio.
- //
- // 0.04 selected because it ensures the resulting ratio rounds to the same tenth.
- private static final double CONTRAST_RATIO_EPSILON = 0.04;
-
- // Color spaces that measure luminance, such as Y in XYZ, L* in L*a*b*, or T in HCT, are
- // known as perceptually accurate color spaces.
- //
- // To be displayed, they must gamut map to a "display space", one that has a defined limit on
- // the number of colors. Display spaces include sRGB, more commonly understood as RGB/HSL/HSV.
- //
- // Gamut mapping is undefined and not defined by the color space. Any gamut mapping algorithm
- // must choose how to sacrifice accuracy in hue, saturation, and/or lightness.
- //
- // A principled solution is to maintain lightness, thus maintaining contrast/a11y, maintain hue,
- // thus maintaining aesthetic intent, and reduce chroma until the color is in gamut.
- //
- // HCT chooses this solution, but, that doesn't mean it will _exactly_ matched desired
- // lightness, if only because RGB is quantized: RGB is expressed as a set of integers: there may
- // be an RGB color with, for example, 47.892 lightness, but not 47.891.
- //
- // To allow for this inherent incompatibility between perceptually accurate color spaces and
- // display color spaces, methods that take a contrast ratio and luminance, and return a
- // luminance that reaches that contrast ratio for the input luminance, purposefully
- // darken/lighten their result such that the desired contrast ratio will be reached even if
- // inaccuracy is introduced.
- //
- // 0.4 is generous, ex. HCT requires much less delta. It was chosen because it provides a rough
- // guarantee that as long as a percetual color space gamut maps lightness such that the
- // resulting lightness rounds to the same as the requested, the desired contrast ratio will be
- // reached.
- private static final double LUMINANCE_GAMUT_MAP_TOLERANCE = 0.4;
-
- private Contrast() {
- }
-
- /**
- * Contrast ratio is a measure of legibility, its used to compare the lightness of two colors.
- * This method is used commonly in industry due to its use by WCAG.
- *
- * <p>To compare lightness, the colors are expressed in the XYZ color space, where Y is
- * lightness,
- * also known as relative luminance.
- *
- * <p>The equation is ratio = lighter Y + 5 / darker Y + 5.
- */
- public static double ratioOfYs(double y1, double y2) {
- final double lighter = max(y1, y2);
- final double darker = (lighter == y2) ? y1 : y2;
- return (lighter + 5.0) / (darker + 5.0);
- }
-
- /**
- * Contrast ratio of two tones. T in HCT, L* in L*a*b*. Also known as luminance or perpectual
- * luminance.
- *
- * <p>Contrast ratio is defined using Y in XYZ, relative luminance. However, relative luminance
- * is linear to number of photons, not to perception of lightness. Perceptual luminance, L* in
- * L*a*b*, T in HCT, is. Designers prefer color spaces with perceptual luminance since they're
- * accurate to the eye.
- *
- * <p>Y and L* are pure functions of each other, so it possible to use perceptually accurate
- * color spaces, and measure contrast, and measure contrast in a much more understandable way:
- * instead of a ratio, a linear difference. This allows a designer to determine what they need
- * to adjust a color's lightness to in order to reach their desired contrast, instead of
- * guessing & checking with hex codes.
- */
- public static double ratioOfTones(double t1, double t2) {
- return ratioOfYs(ColorUtils.yFromLstar(t1), ColorUtils.yFromLstar(t2));
- }
-
- /**
- * Returns T in HCT, L* in L*a*b* >= tone parameter that ensures ratio with input T/L*. Returns
- * -1 if ratio cannot be achieved.
- *
- * @param tone Tone return value must contrast with.
- * @param ratio Desired contrast ratio of return value and tone parameter.
- */
- public static double lighter(double tone, double ratio) {
- if (tone < 0.0 || tone > 100.0) {
- return -1.0;
- }
- // Invert the contrast ratio equation to determine lighter Y given a ratio and darker Y.
- final double darkY = ColorUtils.yFromLstar(tone);
- final double lightY = ratio * (darkY + 5.0) - 5.0;
- if (lightY < 0.0 || lightY > 100.0) {
- return -1.0;
- }
- final double realContrast = ratioOfYs(lightY, darkY);
- final double delta = Math.abs(realContrast - ratio);
- if (realContrast < ratio && delta > CONTRAST_RATIO_EPSILON) {
- return -1.0;
- }
-
- final double returnValue = ColorUtils.lstarFromY(lightY) + LUMINANCE_GAMUT_MAP_TOLERANCE;
- // NOMUTANTS--important validation step; functions it is calling may change implementation.
- if (returnValue < 0 || returnValue > 100) {
- return -1.0;
- }
- return returnValue;
- }
-
- /**
- * Tone >= tone parameter that ensures ratio. 100 if ratio cannot be achieved.
- *
- * <p>This method is unsafe because the returned value is guaranteed to be in bounds, but, the
- * in bounds return value may not reach the desired ratio.
- *
- * @param tone Tone return value must contrast with.
- * @param ratio Desired contrast ratio of return value and tone parameter.
- */
- public static double lighterUnsafe(double tone, double ratio) {
- double lighterSafe = lighter(tone, ratio);
- return lighterSafe < 0.0 ? 100.0 : lighterSafe;
- }
-
- /**
- * Returns T in HCT, L* in L*a*b* <= tone parameter that ensures ratio with input T/L*. Returns
- * -1 if ratio cannot be achieved.
- *
- * @param tone Tone return value must contrast with.
- * @param ratio Desired contrast ratio of return value and tone parameter.
- */
- public static double darker(double tone, double ratio) {
- if (tone < 0.0 || tone > 100.0) {
- return -1.0;
- }
- // Invert the contrast ratio equation to determine darker Y given a ratio and lighter Y.
- final double lightY = ColorUtils.yFromLstar(tone);
- final double darkY = ((lightY + 5.0) / ratio) - 5.0;
- if (darkY < 0.0 || darkY > 100.0) {
- return -1.0;
- }
- final double realContrast = ratioOfYs(lightY, darkY);
- final double delta = Math.abs(realContrast - ratio);
- if (realContrast < ratio && delta > CONTRAST_RATIO_EPSILON) {
- return -1.0;
- }
-
- // For information on 0.4 constant, see comment in lighter(tone, ratio).
- final double returnValue = ColorUtils.lstarFromY(darkY) - LUMINANCE_GAMUT_MAP_TOLERANCE;
- // NOMUTANTS--important validation step; functions it is calling may change implementation.
- if (returnValue < 0 || returnValue > 100) {
- return -1.0;
- }
- return returnValue;
- }
-
- /**
- * Tone <= tone parameter that ensures ratio. 0 if ratio cannot be achieved.
- *
- * <p>This method is unsafe because the returned value is guaranteed to be in bounds, but, the
- * in bounds return value may not reach the desired ratio.
- *
- * @param tone Tone return value must contrast with.
- * @param ratio Desired contrast ratio of return value and tone parameter.
- */
- public static double darkerUnsafe(double tone, double ratio) {
- double darkerSafe = darker(tone, ratio);
- return max(0.0, darkerSafe);
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dislike/DislikeAnalyzer.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dislike/DislikeAnalyzer.java
deleted file mode 100644
index 31feee3b02de..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dislike/DislikeAnalyzer.java
+++ /dev/null
@@ -1,58 +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.monet.dislike;
-
-import com.android.systemui.monet.hct.Hct;
-
-/**
- * Check and/or fix universally disliked colors.
- *
- * <p>Color science studies of color preference indicate universal distaste for dark yellow-greens,
- * and also show this is correlated to distate for biological waste and rotting food.
- *
- * <p>See Palmer and Schloss, 2010 or Schloss and Palmer's Chapter 21 in Handbook of Color
- * Psychology (2015).
- */
-public final class DislikeAnalyzer {
-
- private DislikeAnalyzer() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Returns true if color is disliked.
- *
- * <p>Disliked is defined as a dark yellow-green that is not neutral.
- */
- public static boolean isDisliked(Hct hct) {
- final boolean huePasses = Math.round(hct.getHue()) >= 90.0 && Math.round(hct.getHue())
- <= 111.0;
- final boolean chromaPasses = Math.round(hct.getChroma()) > 16.0;
- final boolean tonePasses = Math.round(hct.getTone()) < 70.0;
-
- return huePasses && chromaPasses && tonePasses;
- }
-
- /** If color is disliked, lighten it to make it likable. */
- public static Hct fixIfDisliked(Hct hct) {
- if (isDisliked(hct)) {
- return Hct.from(hct.getHue(), hct.getChroma(), 70.0);
- }
-
- return hct;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java
deleted file mode 100644
index e839d9bc3c52..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.monet.dynamiccolor;
-
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-
-import com.android.systemui.monet.contrast.Contrast;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.scheme.DynamicScheme;
-import com.android.systemui.monet.utils.MathUtils;
-
-import java.util.HashMap;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-
-/**
- * A color that adjusts itself based on UI state, represented by DynamicScheme.
- *
- * <p>This color automatically adjusts to accommodate a desired contrast level, or other adjustments
- * such as differing in light mode versus dark mode, or what the theme is, or what the color that
- * produced the theme is, etc.
- *
- * <p>Colors without backgrounds do not change tone when contrast changes. Colors with backgrounds
- * become closer to their background as contrast lowers, and further when contrast increases.
- *
- * <p>Prefer the static constructors. They provide a much more simple interface, such as requiring
- * just a hexcode, or just a hexcode and a background.
- *
- * <p>Ultimately, each component necessary for calculating a color, adjusting it for a desired
- * contrast level, and ensuring it has a certain lightness/tone difference from another color, is
- * provided by a function that takes a DynamicScheme and returns a value. This ensures ultimate
- * flexibility, any desired behavior of a color for any design system, but it usually unnecessary.
- * See the default constructor for more information.
- */
-// Prevent lint for Function.apply not being available on Android before API level 14 (4.0.1).
-// "AndroidJdkLibsChecker" for Function, "NewApi" for Function.apply().
-// A java_library Bazel rule with an Android constraint cannot skip these warnings without this
-// annotation; another solution would be to create an android_library rule and supply
-// AndroidManifest with an SDK set higher than 14.
-@SuppressWarnings({"AndroidJdkLibsChecker", "NewApi"})
-public final class DynamicColor {
- public final Function<DynamicScheme, Double> hue;
- public final Function<DynamicScheme, Double> chroma;
- public final Function<DynamicScheme, Double> tone;
- public final Function<DynamicScheme, Double> opacity;
-
- public final Function<DynamicScheme, DynamicColor> background;
- public final Function<DynamicScheme, Double> toneMinContrast;
- public final Function<DynamicScheme, Double> toneMaxContrast;
- public final Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint;
-
- private final HashMap<DynamicScheme, Hct> hctCache = new HashMap<>();
-
- /**
- * The base constructor for DynamicColor.
- *
- * <p>Functional arguments allow overriding without risks that come with subclasses. _Strongly_
- * prefer using one of the static convenience constructors. This class is arguably too
- * flexible to
- * ensure it can support any scenario.
- *
- * <p>For example, the default behavior of adjust tone at max contrast to be at a 7.0 ratio with
- * its background is principled and matches a11y guidance. That does not mean it's the desired
- * approach for _every_ design system, and every color pairing, always, in every case.
- *
- * @param hue given DynamicScheme, return the hue in HCT of the output color.
- * @param chroma given DynamicScheme, return chroma in HCT of the output color.
- * @param tone given DynamicScheme, return tone in HCT of the output color.
- * @param background given DynamicScheme, return the DynamicColor that is the
- * background of this
- * DynamicColor. When this is provided, automated adjustments to
- * lower and raise contrast are
- * made.
- * @param toneMinContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color
- * should
- * be at minimum contrast. See toneMinContrastDefault for the
- * default behavior, and strongly
- * consider using it unless you have strong opinions on a11y. The
- * static constructors use it.
- * @param toneMaxContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color
- * should
- * be at maximum contrast. See toneMaxContrastDefault for the
- * default behavior, and strongly
- * consider using it unless you have strong opinions on a11y. The
- * static constructors use it.
- * @param toneDeltaConstraint given DynamicScheme, return a ToneDeltaConstraint instance that
- * describes a requirement that this DynamicColor must always have
- * some difference in tone/L*
- * from another DynamicColor.<br>
- * Unlikely to be useful unless a design system has some
- * distortions where colors that don't
- * have a background/foreground relationship must have _some_
- * difference in tone, yet, not
- * enough difference to create meaningful contrast.
- */
- public DynamicColor(
- Function<DynamicScheme, Double> hue,
- Function<DynamicScheme, Double> chroma,
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, Double> opacity,
- Function<DynamicScheme, DynamicColor> background,
- Function<DynamicScheme, Double> toneMinContrast,
- Function<DynamicScheme, Double> toneMaxContrast,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint) {
- this.hue = hue;
- this.chroma = chroma;
- this.tone = tone;
- this.opacity = opacity;
- this.background = background;
- this.toneMinContrast = toneMinContrast;
- this.toneMaxContrast = toneMaxContrast;
- this.toneDeltaConstraint = toneDeltaConstraint;
- }
-
- /**
- * Create a DynamicColor from a hex code.
- *
- * <p>Result has no background; thus no support for increasing/decreasing contrast for a11y.
- */
- public static DynamicColor fromArgb(int argb) {
- final Hct hct = Hct.fromInt(argb);
- final TonalPalette palette = TonalPalette.fromInt(argb);
- return DynamicColor.fromPalette((s) -> palette, (s) -> hct.getTone());
- }
-
- /**
- * Create a DynamicColor from just a hex code.
- *
- * <p>Result has no background; thus cannot support increasing/decreasing contrast for a11y.
- *
- * @param argb A hex code.
- * @param tone Function that provides a tone given DynamicScheme. Useful for adjusting for dark
- * vs. light mode.
- */
- public static DynamicColor fromArgb(int argb, Function<DynamicScheme, Double> tone) {
- return DynamicColor.fromPalette((s) -> TonalPalette.fromInt(argb), tone);
- }
-
- /**
- * Create a DynamicColor.
- *
- * <p>If you don't understand HCT fully, or your design team doesn't, but wants support for
- * automated contrast adjustment, this method is _extremely_ useful: you can take a standard
- * design system expressed as hex codes, create DynamicColors corresponding to each color, and
- * then wire up backgrounds.
- *
- * <p>If the design system uses the same hex code on multiple backgrounds, define that in
- * multiple
- * DynamicColors so that the background is accurate for each one. If you define a DynamicColor
- * with one background, and actually use it on another, DynamicColor can't guarantee contrast
- * . For
- * example, if you use a color on both black and white, increasing the contrast on one
- * necessarily
- * decreases contrast of the other.
- *
- * @param argb A hex code.
- * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs.
- * light mode)
- * @param background Function that provides background DynamicColor given DynamicScheme. Useful
- * for contrast, given a background, colors can adjust to increase/decrease
- * contrast.
- */
- public static DynamicColor fromArgb(
- int argb,
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background) {
- return DynamicColor.fromPalette((s) -> TonalPalette.fromInt(argb), tone, background);
- }
-
- /**
- * Create a DynamicColor from:
- *
- * @param argb A hex code.
- * @param tone Function that provides a tone given DynamicScheme. (useful for
- * dark vs. light mode)
- * @param background Function that provides background DynamicColor given
- * DynamicScheme. Useful
- * for contrast, given a background, colors can adjust to
- * increase/decrease contrast.
- * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme.
- * Useful for ensuring lightness difference between colors that
- * don't _require_ contrast or
- * have a formal background/foreground relationship.
- */
- public static DynamicColor fromArgb(
- int argb,
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint) {
- return DynamicColor.fromPalette(
- (s) -> TonalPalette.fromInt(argb), tone, background, toneDeltaConstraint);
- }
-
- /**
- * Create a DynamicColor.
- *
- * @param palette Function that provides a TonalPalette given DynamicScheme. A TonalPalette is
- * defined by a hue and chroma, so this replaces the need to specify
- * hue/chroma. By providing
- * a tonal palette, when contrast adjustments are made, intended chroma can be
- * preserved. For
- * example, at T/L* 90, there is a significant limit to the amount of chroma.
- * There is no
- * colorful red, a red that light is pink. By preserving the _intended_ chroma
- * if lightness
- * lowers for contrast adjustments, the intended chroma is restored.
- * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs.
- * light mode)
- */
- public static DynamicColor fromPalette(
- Function<DynamicScheme, TonalPalette> palette, Function<DynamicScheme, Double> tone) {
- return fromPalette(palette, tone, null, null);
- }
-
- /**
- * Create a DynamicColor.
- *
- * @param palette Function that provides a TonalPalette given DynamicScheme. A
- * TonalPalette is
- * defined by a hue and chroma, so this replaces the need to specify
- * hue/chroma. By providing
- * a tonal palette, when contrast adjustments are made, intended chroma can
- * be preserved. For
- * example, at T/L* 90, there is a significant limit to the amount of
- * chroma. There is no
- * colorful red, a red that light is pink. By preserving the _intended_
- * chroma if lightness
- * lowers for contrast adjustments, the intended chroma is restored.
- * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs.
- * light mode)
- * @param background Function that provides background DynamicColor given DynamicScheme. Useful
- * for contrast, given a background, colors can adjust to increase/decrease
- * contrast.
- */
- public static DynamicColor fromPalette(
- Function<DynamicScheme, TonalPalette> palette,
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background) {
- return fromPalette(palette, tone, background, null);
- }
-
- /**
- * Create a DynamicColor.
- *
- * @param palette Function that provides a TonalPalette given DynamicScheme. A
- * TonalPalette is
- * defined by a hue and chroma, so this replaces the need to
- * specify hue/chroma. By providing
- * a tonal palette, when contrast adjustments are made, intended
- * chroma can be preserved. For
- * example, at T/L* 90, there is a significant limit to the amount
- * of chroma. There is no
- * colorful red, a red that light is pink. By preserving the
- * _intended_ chroma if lightness
- * lowers for contrast adjustments, the intended chroma is restored.
- * @param tone Function that provides a tone given DynamicScheme. (useful for
- * dark vs. light mode)
- * @param background Function that provides background DynamicColor given
- * DynamicScheme. Useful
- * for contrast, given a background, colors can adjust to
- * increase/decrease contrast.
- * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme.
- * Useful for ensuring lightness difference between colors that
- * don't _require_ contrast or
- * have a formal background/foreground relationship.
- */
- public static DynamicColor fromPalette(
- Function<DynamicScheme, TonalPalette> palette,
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint) {
- return new DynamicColor(
- scheme -> palette.apply(scheme).getHue(),
- scheme -> palette.apply(scheme).getChroma(),
- tone,
- null,
- background,
- scheme -> toneMinContrastDefault(tone, background, scheme, toneDeltaConstraint),
- scheme -> toneMaxContrastDefault(tone, background, scheme, toneDeltaConstraint),
- toneDeltaConstraint);
- }
-
- /**
- * The default algorithm for calculating the tone of a color at minimum contrast.<br>
- * If the original contrast ratio was >= 7.0, reach contrast 4.5.<br>
- * If the original contrast ratio was >= 3.0, reach contrast 3.0.<br>
- * If the original contrast ratio was < 3.0, reach that ratio.
- */
- public static double toneMinContrastDefault(
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background,
- DynamicScheme scheme,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint) {
- return DynamicColor.calculateDynamicTone(
- scheme,
- tone,
- c -> c.toneMinContrast.apply(scheme),
- (stdRatio, bgTone) -> {
- double answer = tone.apply(scheme);
- if (stdRatio >= Contrast.RATIO_70) {
- answer = contrastingTone(bgTone, Contrast.RATIO_45);
- } else if (stdRatio >= Contrast.RATIO_30) {
- answer = contrastingTone(bgTone, Contrast.RATIO_30);
- } else {
- final boolean backgroundHasBackground =
- background != null
- && background.apply(scheme) != null
- && background.apply(scheme).background != null
- && background.apply(scheme).background.apply(scheme)
- != null;
- if (backgroundHasBackground) {
- answer = contrastingTone(bgTone, stdRatio);
- }
- }
- return answer;
- },
- background,
- toneDeltaConstraint,
- null,
- standardRatio -> standardRatio);
- }
-
- /**
- * The default algorithm for calculating the tone of a color at maximum contrast.<br>
- * If the color's background has a background, reach contrast 7.0.<br>
- * If it doesn't, maintain the original contrast ratio.<br>
- *
- * <p>This ensures text on surfaces maintains its original, often detrimentally excessive,
- * contrast ratio. But, text on buttons can soften to not have excessive contrast.
- *
- * <p>Historically, digital design uses pure whites and black for text and surfaces. It's too
- * much
- * of a jump at this point in history to introduce a dynamic contrast system _and_ insist that
- * text always had excessive contrast and should reach 7.0, it would deterimentally affect
- * desire
- * to understand and use dynamic contrast.
- */
- public static double toneMaxContrastDefault(
- Function<DynamicScheme, Double> tone,
- Function<DynamicScheme, DynamicColor> background,
- DynamicScheme scheme,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint) {
- return DynamicColor.calculateDynamicTone(
- scheme,
- tone,
- c -> c.toneMaxContrast.apply(scheme),
- (stdRatio, bgTone) -> {
- final boolean backgroundHasBackground =
- background != null
- && background.apply(scheme) != null
- && background.apply(scheme).background != null
- && background.apply(scheme).background.apply(scheme) != null;
- if (backgroundHasBackground) {
- return contrastingTone(bgTone, Contrast.RATIO_70);
- } else {
- return contrastingTone(bgTone, max(Contrast.RATIO_70, stdRatio));
- }
- },
- background,
- toneDeltaConstraint,
- null,
- null);
- }
-
- /**
- * Core method for calculating a tone for under dynamic contrast.
- *
- * <p>It enforces important properties:<br>
- * #1. Desired contrast ratio is reached.<br>
- * As contrast increases from standard to max, the tones involved should always be at least the
- * standard ratio. For example, if a button is T90, and button text is T0, and the button is
- * T0 at
- * max contrast, the button text cannot simply linearly interpolate from T0 to T100, or at some
- * point they'll both be at the same tone.
- *
- * <p>#2. Enable light foregrounds on midtones.<br>
- * The eye prefers light foregrounds on T50 to T60, possibly up to T70, but, contrast ratio 4.5
- * can't be reached with T100 unless the foreground is T50. Contrast ratio 4.5 is crucial, it
- * represents 'readable text', i.e. text smaller than ~40 dp / 1/4". So, if a tone is between
- * T50
- * and T60, it is proactively changed to T49 to enable light foregrounds.
- *
- * <p>#3. Ensure tone delta with another color.<br>
- * In design systems, there may be colors that don't have a pure background/foreground
- * relationship, but, do require different tones for visual differentiation. ToneDeltaConstraint
- * models this requirement, and DynamicColor enforces it.
- */
- public static double calculateDynamicTone(
- DynamicScheme scheme,
- Function<DynamicScheme, Double> toneStandard,
- Function<DynamicColor, Double> toneToJudge,
- BiFunction<Double, Double, Double> desiredTone,
- Function<DynamicScheme, DynamicColor> background,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint,
- Function<Double, Double> minRatio,
- Function<Double, Double> maxRatio) {
- // Start with the tone with no adjustment for contrast.
- // If there is no background, don't perform any adjustment, return immediately.
- final double toneStd = toneStandard.apply(scheme);
- double answer = toneStd;
- final DynamicColor bgDynamic = background == null ? null : background.apply(scheme);
- if (bgDynamic == null) {
- return answer;
- }
- final double bgToneStd = bgDynamic.tone.apply(scheme);
- final double stdRatio = Contrast.ratioOfTones(toneStd, bgToneStd);
-
- // If there is a background, determine its tone after contrast adjustment.
- // Then, calculate the foreground tone that ensures the caller's desired contrast ratio
- // is met.
- final double bgTone = toneToJudge.apply(bgDynamic);
- final double myDesiredTone = desiredTone.apply(stdRatio, bgTone);
- final double currentRatio = Contrast.ratioOfTones(bgTone, myDesiredTone);
- final double minRatioRealized =
- minRatio == null
- ? Contrast.RATIO_MIN
- : minRatio.apply(stdRatio) == null ? Contrast.RATIO_MIN : minRatio.apply(
- stdRatio);
- final double maxRatioRealized =
- maxRatio == null
- ? Contrast.RATIO_MAX
- : maxRatio.apply(stdRatio) == null ? Contrast.RATIO_MAX : maxRatio.apply(
- stdRatio);
- final double desiredRatio =
- MathUtils.clampDouble(minRatioRealized, maxRatioRealized, currentRatio);
- if (desiredRatio == currentRatio) {
- answer = myDesiredTone;
- } else {
- answer = DynamicColor.contrastingTone(bgTone, desiredRatio);
- }
-
- // If the background has no background, adjust the foreground tone to ensure that
- // it is dark enough to have a light foreground.
- if (bgDynamic.background == null || bgDynamic.background.apply(scheme) == null) {
- answer = DynamicColor.enableLightForeground(answer);
- }
-
- // If the caller has specified a constraint where it must have a certain tone distance from
- // another color, enforce that constraint.
- answer = ensureToneDelta(answer, toneStd, scheme, toneDeltaConstraint, toneToJudge);
-
- return answer;
- }
-
- static double ensureToneDelta(
- double tone,
- double toneStandard,
- DynamicScheme scheme,
- Function<DynamicScheme, ToneDeltaConstraint> toneDeltaConstraint,
- Function<DynamicColor, Double> toneToDistanceFrom) {
- final ToneDeltaConstraint constraint =
- (toneDeltaConstraint == null ? null : toneDeltaConstraint.apply(scheme));
- if (constraint == null) {
- return tone;
- }
-
- final double requiredDelta = constraint.delta;
- final double keepAwayTone = toneToDistanceFrom.apply(constraint.keepAway);
- final double delta = Math.abs(tone - keepAwayTone);
- if (delta >= requiredDelta) {
- return tone;
- }
- switch (constraint.keepAwayPolarity) {
- case DARKER:
- return MathUtils.clampDouble(0, 100, keepAwayTone + requiredDelta);
- case LIGHTER:
- return MathUtils.clampDouble(0, 100, keepAwayTone - requiredDelta);
- case NO_PREFERENCE:
- final double keepAwayToneStandard = constraint.keepAway.tone.apply(scheme);
- final boolean preferLighten = toneStandard > keepAwayToneStandard;
- final double alterAmount = Math.abs(delta - requiredDelta);
- final boolean lighten =
- preferLighten ? (tone + alterAmount <= 100.0) : tone < alterAmount;
- return lighten ? tone + alterAmount : tone - alterAmount;
- }
- return tone;
- }
-
- /**
- * Given a background tone, find a foreground tone, while ensuring they reach a contrast ratio
- * that is as close to ratio as possible.
- */
- public static double contrastingTone(double bgTone, double ratio) {
- final double lighterTone = Contrast.lighterUnsafe(bgTone, ratio);
- final double darkerTone = Contrast.darkerUnsafe(bgTone, ratio);
- final double lighterRatio = Contrast.ratioOfTones(lighterTone, bgTone);
- final double darkerRatio = Contrast.ratioOfTones(darkerTone, bgTone);
- final boolean preferLighter = tonePrefersLightForeground(bgTone);
-
- if (preferLighter) {
- // "Neglible difference" handles an edge case where the initial contrast ratio is high
- // (ex. 13.0), and the ratio passed to the function is that high ratio, and both the
- // lighter
- // and darker ratio fails to pass that ratio.
- //
- // This was observed with Tonal Spot's On Primary Container turning black momentarily
- // between
- // high and max contrast in light mode. PC's standard tone was T90, OPC's was T10, it
- // was
- // light mode, and the contrast level was 0.6568521221032331.
- final boolean negligibleDifference =
- Math.abs(lighterRatio - darkerRatio) < 0.1 && lighterRatio < ratio
- && darkerRatio < ratio;
- if (lighterRatio >= ratio || lighterRatio >= darkerRatio || negligibleDifference) {
- return lighterTone;
- } else {
- return darkerTone;
- }
- } else {
- return darkerRatio >= ratio || darkerRatio >= lighterRatio ? darkerTone : lighterTone;
- }
- }
-
- /**
- * Adjust a tone down such that white has 4.5 contrast, if the tone is reasonably close to
- * supporting it.
- */
- public static double enableLightForeground(double tone) {
- if (tonePrefersLightForeground(tone) && !toneAllowsLightForeground(tone)) {
- return 49.0;
- }
- return tone;
- }
-
- /**
- * People prefer white foregrounds on ~T60-70. Observed over time, and also by Andrew Somers
- * during research for APCA.
- *
- * <p>T60 used as to create the smallest discontinuity possible when skipping down to T49 in
- * order
- * to ensure light foregrounds.
- *
- * <p>Since `tertiaryContainer` in dark monochrome scheme requires a tone of 60, it should
- * not be
- * adjusted. Therefore, 60 is excluded here.
- */
- public static boolean tonePrefersLightForeground(double tone) {
- return Math.round(tone) < 60;
- }
-
- /**
- * Tones less than ~T50 always permit white at 4.5 contrast.
- */
- public static boolean toneAllowsLightForeground(double tone) {
- return Math.round(tone) <= 49;
- }
-
- public int getArgb(DynamicScheme scheme) {
- final int argb = getHct(scheme).toInt();
- if (opacity == null) {
- return argb;
- }
- final double percentage = opacity.apply(scheme);
- final int alpha = MathUtils.clampInt(0, 255, (int) Math.round(percentage * 255));
- return (argb & 0x00ffffff) | (alpha << 24);
- }
-
- public Hct getHct(DynamicScheme scheme) {
- final Hct cachedAnswer = hctCache.get(scheme);
- if (cachedAnswer != null) {
- return cachedAnswer;
- }
- // This is crucial for aesthetics: we aren't simply the taking the standard color
- // and changing its tone for contrast. Rather, we find the tone for contrast, then
- // use the specified chroma from the palette to construct a new color.
- //
- // For example, this enables colors with standard tone of T90, which has limited chroma, to
- // "recover" intended chroma as contrast increases.
- final Hct answer = Hct.from(hue.apply(scheme), chroma.apply(scheme), getTone(scheme));
- // NOMUTANTS--trivial test with onerous dependency injection requirement.
- if (hctCache.size() > 4) {
- hctCache.clear();
- }
- // NOMUTANTS--trivial test with onerous dependency injection requirement.
- hctCache.put(scheme, answer);
- return answer;
- }
-
- /**
- * Returns the tone in HCT, ranging from 0 to 100, of the resolved color given scheme.
- */
- public double getTone(DynamicScheme scheme) {
- double answer = tone.apply(scheme);
-
- final boolean decreasingContrast = scheme.contrastLevel < 0.0;
- if (scheme.contrastLevel != 0.0) {
- final double startTone = tone.apply(scheme);
- final double endTone =
- decreasingContrast ? toneMinContrast.apply(scheme) : toneMaxContrast.apply(
- scheme);
- final double delta = (endTone - startTone) * Math.abs(scheme.contrastLevel);
- answer = delta + startTone;
- }
-
- final DynamicColor bgDynamicColor = background == null ? null : background.apply(scheme);
- double minRatio = Contrast.RATIO_MIN;
- double maxRatio = Contrast.RATIO_MAX;
- if (bgDynamicColor != null) {
- final boolean bgHasBg =
- bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme)
- != null;
- final double standardRatio =
- Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme));
- if (decreasingContrast) {
- final double minContrastRatio =
- Contrast.ratioOfTones(
- toneMinContrast.apply(scheme),
- bgDynamicColor.toneMinContrast.apply(scheme));
- minRatio = bgHasBg ? minContrastRatio : 1.0;
- maxRatio = standardRatio;
- } else {
- final double maxContrastRatio =
- Contrast.ratioOfTones(
- toneMaxContrast.apply(scheme),
- bgDynamicColor.toneMaxContrast.apply(scheme));
- minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0;
- maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0;
- }
- }
-
- final double finalMinRatio = minRatio;
- final double finalMaxRatio = maxRatio;
- final double finalAnswer = answer;
- answer =
- calculateDynamicTone(
- scheme,
- this.tone,
- (dynamicColor) -> dynamicColor.getTone(scheme),
- (a, b) -> finalAnswer,
- (s) -> bgDynamicColor,
- toneDeltaConstraint,
- (s) -> finalMinRatio,
- (s) -> finalMaxRatio);
-
- return answer;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java
deleted file mode 100644
index 9f075e521126..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java
+++ /dev/null
@@ -1,640 +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.monet.dynamiccolor;
-
-import android.annotation.NonNull;
-
-import com.android.systemui.monet.dislike.DislikeAnalyzer;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.hct.ViewingConditions;
-import com.android.systemui.monet.scheme.DynamicScheme;
-import com.android.systemui.monet.scheme.Variant;
-
-/** Named colors, otherwise known as tokens, or roles, in the Material Design system. */
-// Prevent lint for Function.apply not being available on Android before API level 14 (4.0.1).
-// "AndroidJdkLibsChecker" for Function, "NewApi" for Function.apply().
-// A java_library Bazel rule with an Android constraint cannot skip these warnings without this
-// annotation; another solution would be to create an android_library rule and supply
-// AndroidManifest with an SDK set higher than 14.
-@SuppressWarnings({"AndroidJdkLibsChecker", "NewApi"})
-public final class MaterialDynamicColors {
- private static final double CONTAINER_ACCENT_TONE_DELTA = 15.0;
-
- public MaterialDynamicColors() {}
-
- // Compatibility Keys Colors for Android
- public DynamicColor primaryPaletteKeyColor() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone());
- }
-
- public DynamicColor secondaryPaletteKeyColor() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone());
- }
-
- public DynamicColor tertiaryPaletteKeyColor() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone());
- }
-
- public DynamicColor neutralPaletteKeyColor() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone());
- }
-
- public DynamicColor neutralVariantPaletteKeyColor() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralVariantPalette,
- (s) -> s.neutralVariantPalette.getKeyColor().getTone());
- }
-
- @NonNull
- public DynamicColor highestSurface(@NonNull DynamicScheme s) {
- return s.isDark ? surfaceBright() : surfaceDim();
- }
-
- @NonNull
- public DynamicColor background() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0);
- }
-
- @NonNull
- public DynamicColor onBackground() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> background());
- }
-
- @NonNull
- public DynamicColor surface() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0);
- }
-
- @NonNull
- public DynamicColor inverseSurface() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 20.0);
- }
-
- @NonNull
- public DynamicColor surfaceBright() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0);
- }
-
- @NonNull
- public DynamicColor surfaceDim() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0);
- }
-
- @NonNull
- public DynamicColor surfaceContainerLowest() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0);
- }
-
- @NonNull
- public DynamicColor surfaceContainerLow() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0);
- }
-
- @NonNull
- public DynamicColor surfaceContainer() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0);
- }
-
- @NonNull
- public DynamicColor surfaceContainerHigh() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0);
- }
-
- @NonNull
- public DynamicColor surfaceContainerHighest() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0);
- }
-
- @NonNull
- public DynamicColor onSurface() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor inverseOnSurface() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralPalette, (s) -> s.isDark ? 20.0 : 95.0, (s) -> inverseSurface());
- }
-
- @NonNull
- public DynamicColor surfaceVariant() {
- return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 90.0);
- }
-
- @NonNull
- public DynamicColor onSurfaceVariant() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0, (s) -> surfaceVariant());
- }
-
- @NonNull
- public DynamicColor outline() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 60.0 : 50.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor outlineVariant() {
- return DynamicColor.fromPalette(
- (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor shadow() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> 0.0);
- }
-
- @NonNull
- public DynamicColor scrim() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> 0.0);
- }
-
- @NonNull
- public DynamicColor surfaceTint() {
- return DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 80.0 : 40.0);
- }
-
- @NonNull
- public DynamicColor primaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isFidelity(s)) {
- return performAlbers(s.sourceColorHct, s);
- }
- if (isMonochrome(s)) {
- return s.isDark ? 85.0 : 25.0;
- }
- return s.isDark ? 30.0 : 90.0;
- },
- this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onPrimaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isFidelity(s)) {
- return DynamicColor.contrastingTone(primaryContainer().tone.apply(s), 4.5);
- }
- if (isMonochrome(s)) {
- return s.isDark ? 0.0 : 100.0;
- }
- return s.isDark ? 90.0 : 10.0;
- },
- (s) -> primaryContainer(),
- null);
- }
-
- @NonNull
- public DynamicColor primary() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 100.0 : 0.0;
- }
- return s.isDark ? 80.0 : 40.0;
- },
- this::highestSurface,
- (s) ->
- new ToneDeltaConstraint(
- CONTAINER_ACCENT_TONE_DELTA,
- primaryContainer(),
- s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER));
- }
-
- @NonNull
- public DynamicColor inversePrimary() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette, (s) -> s.isDark ? 40.0 : 80.0, (s) -> inverseSurface());
- }
-
- @NonNull
- public DynamicColor onPrimary() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 10.0 : 90.0;
- }
- return s.isDark ? 20.0 : 100.0;
- },
- (s) -> primary());
- }
-
- @NonNull
- public DynamicColor secondaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 30.0 : 85.0;
- }
- final double initialTone = s.isDark ? 30.0 : 90.0;
- if (!isFidelity(s)) {
- return initialTone;
- }
- double answer =
- findDesiredChromaByTone(
- s.secondaryPalette.getHue(),
- s.secondaryPalette.getChroma(),
- initialTone,
- !s.isDark);
- answer = performAlbers(s.secondaryPalette.getHct(answer), s);
- return answer;
- },
- this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onSecondaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette,
- (s) -> {
- if (!isFidelity(s)) {
- return s.isDark ? 90.0 : 10.0;
- }
- return DynamicColor.contrastingTone(secondaryContainer().tone.apply(s), 4.5);
- },
- (s) -> secondaryContainer());
- }
-
- @NonNull
- public DynamicColor secondary() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette,
- (s) -> s.isDark ? 80.0 : 40.0,
- this::highestSurface,
- (s) ->
- new ToneDeltaConstraint(
- CONTAINER_ACCENT_TONE_DELTA,
- secondaryContainer(),
- s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER));
- }
-
- @NonNull
- public DynamicColor onSecondary() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 10.0 : 100.0;
- }
- return s.isDark ? 20.0 : 100.0;
- },
- (s) -> secondary());
- }
-
- @NonNull
- public DynamicColor tertiaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 60.0 : 49.0;
- }
- if (!isFidelity(s)) {
- return s.isDark ? 30.0 : 90.0;
- }
- final double albersTone =
- performAlbers(s.tertiaryPalette.getHct(s.sourceColorHct.getTone()), s);
- final Hct proposedHct = s.tertiaryPalette.getHct(albersTone);
- return DislikeAnalyzer.fixIfDisliked(proposedHct).getTone();
- },
- this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onTertiaryContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 0.0 : 100.0;
- }
- if (!isFidelity(s)) {
- return s.isDark ? 90.0 : 10.0;
- }
- return DynamicColor.contrastingTone(tertiaryContainer().tone.apply(s), 4.5);
- },
- (s) -> tertiaryContainer());
- }
-
- @NonNull
- public DynamicColor tertiary() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 90.0 : 25.0;
- }
- return s.isDark ? 80.0 : 40.0;
- },
- this::highestSurface,
- (s) ->
- new ToneDeltaConstraint(
- CONTAINER_ACCENT_TONE_DELTA,
- tertiaryContainer(),
- s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER));
- }
-
- @NonNull
- public DynamicColor onTertiary() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return s.isDark ? 10.0 : 90.0;
- }
- return s.isDark ? 20.0 : 100.0;
- },
- (s) -> tertiary());
- }
-
- @NonNull
- public DynamicColor errorContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.errorPalette, (s) -> s.isDark ? 30.0 : 90.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onErrorContainer() {
- return DynamicColor.fromPalette(
- (s) -> s.errorPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> errorContainer());
- }
-
- @NonNull
- public DynamicColor error() {
- return DynamicColor.fromPalette(
- (s) -> s.errorPalette,
- (s) -> s.isDark ? 80.0 : 40.0,
- this::highestSurface,
- (s) ->
- new ToneDeltaConstraint(
- CONTAINER_ACCENT_TONE_DELTA,
- errorContainer(),
- s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER));
- }
-
- @NonNull
- public DynamicColor onError() {
- return DynamicColor.fromPalette(
- (s) -> s.errorPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> error());
- }
-
- @NonNull
- public DynamicColor primaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return 40.0;
- }
- return 90.0;
- },
- this::highestSurface);
- }
-
- @NonNull
- public DynamicColor primaryFixedDim() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return 30.0;
- }
- return 80.0;
- },
- this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onPrimaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return 100.0;
- }
- return 10.0;
- },
- (s) -> primaryFixedDim());
- }
-
- @NonNull
- public DynamicColor onPrimaryFixedVariant() {
- return DynamicColor.fromPalette(
- (s) -> s.primaryPalette,
- (s) -> {
- if (isMonochrome(s)) {
- return 90.0;
- }
- return 30.0;
- },
- (s) -> primaryFixedDim());
- }
-
- @NonNull
- public DynamicColor secondaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 80.0 : 90.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor secondaryFixedDim() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 70.0 : 80.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onSecondaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette, (s) -> 10.0, (s) -> secondaryFixedDim());
- }
-
- @NonNull
- public DynamicColor onSecondaryFixedVariant() {
- return DynamicColor.fromPalette(
- (s) -> s.secondaryPalette,
- (s) -> isMonochrome(s) ? 25.0 : 30.0,
- (s) -> secondaryFixedDim());
- }
-
- @NonNull
- public DynamicColor tertiaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 40.0 : 90.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor tertiaryFixedDim() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 30.0 : 80.0, this::highestSurface);
- }
-
- @NonNull
- public DynamicColor onTertiaryFixed() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 100.0 : 10.0, (s) -> tertiaryFixedDim());
- }
-
- @NonNull
- public DynamicColor onTertiaryFixedVariant() {
- return DynamicColor.fromPalette(
- (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 90.0 : 30.0, (s) -> tertiaryFixedDim());
- }
-
- /**
- * These colors were present in Android framework before Android U, and used by MDC controls. They
- * should be avoided, if possible. It's unclear if they're used on multiple backgrounds, and if
- * they are, they can't be adjusted for contrast.* For now, they will be set with no background,
- * and those won't adjust for contrast, avoiding issues.
- *
- * <p>* For example, if the same color is on a white background _and_ black background, there's no
- * way to increase contrast with either without losing contrast with the other.
- */
- // colorControlActivated documented as colorAccent in M3 & GM3.
- // colorAccent documented as colorSecondary in M3 and colorPrimary in GM3.
- // Android used Material's Container as Primary/Secondary/Tertiary at launch.
- // Therefore, this is a duplicated version of Primary Container.
- @NonNull
- public DynamicColor controlActivated() {
- return DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 30.0 : 90.0, null);
- }
-
- // colorControlNormal documented as textColorSecondary in M3 & GM3.
- // In Material, textColorSecondary points to onSurfaceVariant in the non-disabled state,
- // which is Neutral Variant T30/80 in light/dark.
- @NonNull
- public DynamicColor controlNormal() {
- return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0);
- }
-
- // colorControlHighlight documented, in both M3 & GM3:
- // Light mode: #1f000000 dark mode: #33ffffff.
- // These are black and white with some alpha.
- // 1F hex = 31 decimal; 31 / 255 = 12% alpha.
- // 33 hex = 51 decimal; 51 / 255 = 20% alpha.
- // DynamicColors do not support alpha currently, and _may_ not need it for this use case,
- // depending on how MDC resolved alpha for the other cases.
- // Returning black in dark mode, white in light mode.
- @NonNull
- public DynamicColor controlHighlight() {
- return new DynamicColor(
- s -> 0.0,
- s -> 0.0,
- s -> s.isDark ? 100.0 : 0.0,
- s -> s.isDark ? 0.20 : 0.12,
- null,
- scheme ->
- DynamicColor.toneMinContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, scheme, null),
- scheme ->
- DynamicColor.toneMaxContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, scheme, null),
- null);
- }
-
- // textColorPrimaryInverse documented, in both M3 & GM3, documented as N10/N90.
- @NonNull
- public DynamicColor textPrimaryInverse() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0);
- }
-
- // textColorSecondaryInverse and textColorTertiaryInverse both documented, in both M3 & GM3, as
- // NV30/NV80
- @NonNull
- public DynamicColor textSecondaryAndTertiaryInverse() {
- return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0);
- }
-
- // textColorPrimaryInverseDisableOnly documented, in both M3 & GM3, as N10/N90
- @NonNull
- public DynamicColor textPrimaryInverseDisableOnly() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0);
- }
-
- // textColorSecondaryInverse and textColorTertiaryInverse in disabled state both documented,
- // in both M3 & GM3, as N10/N90
- @NonNull
- public DynamicColor textSecondaryAndTertiaryInverseDisabled() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0);
- }
-
- // textColorHintInverse documented, in both M3 & GM3, as N10/N90
- @NonNull
- public DynamicColor textHintInverse() {
- return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0);
- }
-
- private static ViewingConditions viewingConditionsForAlbers(DynamicScheme scheme) {
- return ViewingConditions.defaultWithBackgroundLstar(scheme.isDark ? 30.0 : 80.0);
- }
-
- private static boolean isFidelity(DynamicScheme scheme) {
- return scheme.variant == Variant.FIDELITY || scheme.variant == Variant.CONTENT;
- }
-
- private static boolean isMonochrome(DynamicScheme scheme) {
- return scheme.variant == Variant.MONOCHROME;
- }
-
- static double findDesiredChromaByTone(
- double hue, double chroma, double tone, boolean byDecreasingTone) {
- double answer = tone;
-
- Hct closestToChroma = Hct.from(hue, chroma, tone);
- if (closestToChroma.getChroma() < chroma) {
- double chromaPeak = closestToChroma.getChroma();
- while (closestToChroma.getChroma() < chroma) {
- answer += byDecreasingTone ? -1.0 : 1.0;
- Hct potentialSolution = Hct.from(hue, chroma, answer);
- if (chromaPeak > potentialSolution.getChroma()) {
- break;
- }
- if (Math.abs(potentialSolution.getChroma() - chroma) < 0.4) {
- break;
- }
-
- double potentialDelta = Math.abs(potentialSolution.getChroma() - chroma);
- double currentDelta = Math.abs(closestToChroma.getChroma() - chroma);
- if (potentialDelta < currentDelta) {
- closestToChroma = potentialSolution;
- }
- chromaPeak = Math.max(chromaPeak, potentialSolution.getChroma());
- }
- }
-
- return answer;
- }
-
- static double performAlbers(Hct prealbers, DynamicScheme scheme) {
- final Hct albersd = prealbers.inViewingConditions(viewingConditionsForAlbers(scheme));
- if (DynamicColor.tonePrefersLightForeground(prealbers.getTone())
- && !DynamicColor.toneAllowsLightForeground(albersd.getTone())) {
- return DynamicColor.enableLightForeground(prealbers.getTone());
- } else {
- return DynamicColor.enableLightForeground(albersd.getTone());
- }
- }
-} \ No newline at end of file
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/ToneDeltaConstraint.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/ToneDeltaConstraint.java
deleted file mode 100644
index 5fd1210fdb35..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/ToneDeltaConstraint.java
+++ /dev/null
@@ -1,39 +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.monet.dynamiccolor;
-
-/**
- * Documents a constraint between two DynamicColors, in which their tones must have a certain
- * distance from each other.
- */
-public final class ToneDeltaConstraint {
- public final double delta;
- public final DynamicColor keepAway;
- public final TonePolarity keepAwayPolarity;
-
- /**
- * @param delta the difference in tone required
- * @param keepAway the color to distance in tone from
- * @param keepAwayPolarity whether the color to keep away from must be lighter, darker, or no
- * preference, in which case it should
- */
- public ToneDeltaConstraint(double delta, DynamicColor keepAway, TonePolarity keepAwayPolarity) {
- this.delta = delta;
- this.keepAway = keepAway;
- this.keepAwayPolarity = keepAwayPolarity;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Cam16.java b/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Cam16.java
deleted file mode 100644
index 9ccc50307a59..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Cam16.java
+++ /dev/null
@@ -1,454 +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.monet.hct;
-
-import static java.lang.Math.max;
-
-import com.android.systemui.monet.utils.ColorUtils;
-
-/**
- * CAM16, a color appearance model. Colors are not just defined by their hex code, but rather, a hex
- * code and viewing conditions.
- *
- * <p>CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*, b*, or jstar,
- * astar, bstar in code. CAM16-UCS is included in the CAM16 specification, and should be used when
- * measuring distances between colors.
- *
- * <p>In traditional color spaces, a color can be identified solely by the observer's measurement of
- * the color. Color appearance models such as CAM16 also use information about the environment where
- * the color was observed, known as the viewing conditions.
- *
- * <p>For example, white under the traditional assumption of a midday sun white point is accurately
- * measured as a slightly chromatic blue by CAM16. (roughly, hue 203, chroma 3, lightness 100)
- */
-public final class Cam16 {
- // Transforms XYZ color space coordinates to 'cone'/'RGB' responses in CAM16.
- static final double[][] XYZ_TO_CAM16RGB = {
- {0.401288, 0.650173, -0.051461},
- {-0.250268, 1.204414, 0.045854},
- {-0.002079, 0.048952, 0.953127}
- };
-
- // Transforms 'cone'/'RGB' responses in CAM16 to XYZ color space coordinates.
- static final double[][] CAM16RGB_TO_XYZ = {
- {1.8620678, -1.0112547, 0.14918678},
- {0.38752654, 0.62144744, -0.00897398},
- {-0.01584150, -0.03412294, 1.0499644}
- };
-
- // CAM16 color dimensions, see getters for documentation.
- private final double hue;
- private final double chroma;
- private final double j;
- private final double q;
- private final double m;
- private final double s;
-
- // Coordinates in UCS space. Used to determine color distance, like delta E equations in L*a*b*.
- private final double jstar;
- private final double astar;
- private final double bstar;
-
- // Avoid allocations during conversion by pre-allocating an array.
- private final double[] tempArray = new double[]{0.0, 0.0, 0.0};
-
- /**
- * CAM16 instances also have coordinates in the CAM16-UCS space, called J*, a*, b*, or jstar,
- * astar, bstar in code. CAM16-UCS is included in the CAM16 specification, and is used to
- * measure
- * distances between colors.
- */
- double distance(Cam16 other) {
- double dJ = getJstar() - other.getJstar();
- double dA = getAstar() - other.getAstar();
- double dB = getBstar() - other.getBstar();
- double dEPrime = Math.sqrt(dJ * dJ + dA * dA + dB * dB);
- double dE = 1.41 * Math.pow(dEPrime, 0.63);
- return dE;
- }
-
- /** Hue in CAM16 */
- public double getHue() {
- return hue;
- }
-
- /** Chroma in CAM16 */
- public double getChroma() {
- return chroma;
- }
-
- /** Lightness in CAM16 */
- public double getJ() {
- return j;
- }
-
- /**
- * Brightness in CAM16.
- *
- * <p>Prefer lightness, brightness is an absolute quantity. For example, a sheet of white paper
- * is
- * much brighter viewed in sunlight than in indoor light, but it is the lightest object under
- * any
- * lighting.
- */
- public double getQ() {
- return q;
- }
-
- /**
- * Colorfulness in CAM16.
- *
- * <p>Prefer chroma, colorfulness is an absolute quantity. For example, a yellow toy car is much
- * more colorful outside than inside, but it has the same chroma in both environments.
- */
- public double getM() {
- return m;
- }
-
- /**
- * Saturation in CAM16.
- *
- * <p>Colorfulness in proportion to brightness. Prefer chroma, saturation measures colorfulness
- * relative to the color's own brightness, where chroma is colorfulness relative to white.
- */
- public double getS() {
- return s;
- }
-
- /** Lightness coordinate in CAM16-UCS */
- public double getJstar() {
- return jstar;
- }
-
- /** a* coordinate in CAM16-UCS */
- public double getAstar() {
- return astar;
- }
-
- /** b* coordinate in CAM16-UCS */
- public double getBstar() {
- return bstar;
- }
-
- /**
- * All of the CAM16 dimensions can be calculated from 3 of the dimensions, in the following
- * combinations: - {j or q} and {c, m, or s} and hue - jstar, astar, bstar Prefer using a static
- * method that constructs from 3 of those dimensions. This constructor is intended for those
- * methods to use to return all possible dimensions.
- *
- * @param hue for example, red, orange, yellow, green, etc.
- * @param chroma informally, colorfulness / color intensity. like saturation in HSL, except
- * perceptually accurate.
- * @param j lightness
- * @param q brightness; ratio of lightness to white point's lightness
- * @param m colorfulness
- * @param s saturation; ratio of chroma to white point's chroma
- * @param jstar CAM16-UCS J coordinate
- * @param astar CAM16-UCS a coordinate
- * @param bstar CAM16-UCS b coordinate
- */
- private Cam16(
- double hue,
- double chroma,
- double j,
- double q,
- double m,
- double s,
- double jstar,
- double astar,
- double bstar) {
- this.hue = hue;
- this.chroma = chroma;
- this.j = j;
- this.q = q;
- this.m = m;
- this.s = s;
- this.jstar = jstar;
- this.astar = astar;
- this.bstar = bstar;
- }
-
- /**
- * Create a CAM16 color from a color, assuming the color was viewed in default viewing
- * conditions.
- *
- * @param argb ARGB representation of a color.
- */
- public static Cam16 fromInt(int argb) {
- return fromIntInViewingConditions(argb, ViewingConditions.DEFAULT);
- }
-
- /**
- * Create a CAM16 color from a color in defined viewing conditions.
- *
- * @param argb ARGB representation of a color.
- * @param viewingConditions Information about the environment where the color was observed.
- */
- // The RGB => XYZ conversion matrix elements are derived scientific constants. While the values
- // may differ at runtime due to floating point imprecision, keeping the values the same, and
- // accurate, across implementations takes precedence.
- @SuppressWarnings("FloatingPointLiteralPrecision")
- static Cam16 fromIntInViewingConditions(int argb, ViewingConditions viewingConditions) {
- // Transform ARGB int to XYZ
- int red = (argb & 0x00ff0000) >> 16;
- int green = (argb & 0x0000ff00) >> 8;
- int blue = (argb & 0x000000ff);
- double redL = ColorUtils.linearized(red);
- double greenL = ColorUtils.linearized(green);
- double blueL = ColorUtils.linearized(blue);
- double x = 0.41233895 * redL + 0.35762064 * greenL + 0.18051042 * blueL;
- double y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL;
- double z = 0.01932141 * redL + 0.11916382 * greenL + 0.95034478 * blueL;
-
- return fromXyzInViewingConditions(x, y, z, viewingConditions);
- }
-
- static Cam16 fromXyzInViewingConditions(
- double x, double y, double z, ViewingConditions viewingConditions) {
- // Transform XYZ to 'cone'/'rgb' responses
- double[][] matrix = XYZ_TO_CAM16RGB;
- double rT = (x * matrix[0][0]) + (y * matrix[0][1]) + (z * matrix[0][2]);
- double gT = (x * matrix[1][0]) + (y * matrix[1][1]) + (z * matrix[1][2]);
- double bT = (x * matrix[2][0]) + (y * matrix[2][1]) + (z * matrix[2][2]);
-
- // Discount illuminant
- double rD = viewingConditions.getRgbD()[0] * rT;
- double gD = viewingConditions.getRgbD()[1] * gT;
- double bD = viewingConditions.getRgbD()[2] * bT;
-
- // Chromatic adaptation
- double rAF = Math.pow(viewingConditions.getFl() * Math.abs(rD) / 100.0, 0.42);
- double gAF = Math.pow(viewingConditions.getFl() * Math.abs(gD) / 100.0, 0.42);
- double bAF = Math.pow(viewingConditions.getFl() * Math.abs(bD) / 100.0, 0.42);
- double rA = Math.signum(rD) * 400.0 * rAF / (rAF + 27.13);
- double gA = Math.signum(gD) * 400.0 * gAF / (gAF + 27.13);
- double bA = Math.signum(bD) * 400.0 * bAF / (bAF + 27.13);
-
- // redness-greenness
- double a = (11.0 * rA + -12.0 * gA + bA) / 11.0;
- // yellowness-blueness
- double b = (rA + gA - 2.0 * bA) / 9.0;
-
- // auxiliary components
- double u = (20.0 * rA + 20.0 * gA + 21.0 * bA) / 20.0;
- double p2 = (40.0 * rA + 20.0 * gA + bA) / 20.0;
-
- // hue
- double atan2 = Math.atan2(b, a);
- double atanDegrees = Math.toDegrees(atan2);
- double hue =
- atanDegrees < 0
- ? atanDegrees + 360.0
- : atanDegrees >= 360 ? atanDegrees - 360.0 : atanDegrees;
- double hueRadians = Math.toRadians(hue);
-
- // achromatic response to color
- double ac = p2 * viewingConditions.getNbb();
-
- // CAM16 lightness and brightness
- double j =
- 100.0
- * Math.pow(
- ac / viewingConditions.getAw(),
- viewingConditions.getC() * viewingConditions.getZ());
- double q =
- 4.0
- / viewingConditions.getC()
- * Math.sqrt(j / 100.0)
- * (viewingConditions.getAw() + 4.0)
- * viewingConditions.getFlRoot();
-
- // CAM16 chroma, colorfulness, and saturation.
- double huePrime = (hue < 20.14) ? hue + 360 : hue;
- double eHue = 0.25 * (Math.cos(Math.toRadians(huePrime) + 2.0) + 3.8);
- double p1 = 50000.0 / 13.0 * eHue * viewingConditions.getNc() * viewingConditions.getNcb();
- double t = p1 * Math.hypot(a, b) / (u + 0.305);
- double alpha =
- Math.pow(1.64 - Math.pow(0.29, viewingConditions.getN()), 0.73) * Math.pow(t, 0.9);
- // CAM16 chroma, colorfulness, saturation
- double c = alpha * Math.sqrt(j / 100.0);
- double m = c * viewingConditions.getFlRoot();
- double s =
- 50.0 * Math.sqrt(
- (alpha * viewingConditions.getC()) / (viewingConditions.getAw() + 4.0));
-
- // CAM16-UCS components
- double jstar = (1.0 + 100.0 * 0.007) * j / (1.0 + 0.007 * j);
- double mstar = 1.0 / 0.0228 * Math.log1p(0.0228 * m);
- double astar = mstar * Math.cos(hueRadians);
- double bstar = mstar * Math.sin(hueRadians);
-
- return new Cam16(hue, c, j, q, m, s, jstar, astar, bstar);
- }
-
- /**
- * @param j CAM16 lightness
- * @param c CAM16 chroma
- * @param h CAM16 hue
- */
- static Cam16 fromJch(double j, double c, double h) {
- return fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT);
- }
-
- /**
- * @param j CAM16 lightness
- * @param c CAM16 chroma
- * @param h CAM16 hue
- * @param viewingConditions Information about the environment where the color was observed.
- */
- private static Cam16 fromJchInViewingConditions(
- double j, double c, double h, ViewingConditions viewingConditions) {
- double q =
- 4.0
- / viewingConditions.getC()
- * Math.sqrt(j / 100.0)
- * (viewingConditions.getAw() + 4.0)
- * viewingConditions.getFlRoot();
- double m = c * viewingConditions.getFlRoot();
- double alpha = c / Math.sqrt(j / 100.0);
- double s =
- 50.0 * Math.sqrt(
- (alpha * viewingConditions.getC()) / (viewingConditions.getAw() + 4.0));
-
- double hueRadians = Math.toRadians(h);
- double jstar = (1.0 + 100.0 * 0.007) * j / (1.0 + 0.007 * j);
- double mstar = 1.0 / 0.0228 * Math.log1p(0.0228 * m);
- double astar = mstar * Math.cos(hueRadians);
- double bstar = mstar * Math.sin(hueRadians);
- return new Cam16(h, c, j, q, m, s, jstar, astar, bstar);
- }
-
- /**
- * Create a CAM16 color from CAM16-UCS coordinates.
- *
- * @param jstar CAM16-UCS lightness.
- * @param astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian coordinate on the Y
- * axis.
- * @param bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian coordinate on the X
- * axis.
- */
- public static Cam16 fromUcs(double jstar, double astar, double bstar) {
-
- return fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT);
- }
-
- /**
- * Create a CAM16 color from CAM16-UCS coordinates in defined viewing conditions.
- *
- * @param jstar CAM16-UCS lightness.
- * @param astar CAM16-UCS a dimension. Like a* in L*a*b*, it is a Cartesian
- * coordinate on the Y
- * axis.
- * @param bstar CAM16-UCS b dimension. Like a* in L*a*b*, it is a Cartesian
- * coordinate on the X
- * axis.
- * @param viewingConditions Information about the environment where the color was observed.
- */
- public static Cam16 fromUcsInViewingConditions(
- double jstar, double astar, double bstar, ViewingConditions viewingConditions) {
-
- double m = Math.hypot(astar, bstar);
- double m2 = Math.expm1(m * 0.0228) / 0.0228;
- double c = m2 / viewingConditions.getFlRoot();
- double h = Math.atan2(bstar, astar) * (180.0 / Math.PI);
- if (h < 0.0) {
- h += 360.0;
- }
- double j = jstar / (1. - (jstar - 100.) * 0.007);
- return fromJchInViewingConditions(j, c, h, viewingConditions);
- }
-
- /**
- * ARGB representation of the color. Assumes the color was viewed in default viewing conditions,
- * which are near-identical to the default viewing conditions for sRGB.
- */
- public int toInt() {
- return viewed(ViewingConditions.DEFAULT);
- }
-
- /**
- * ARGB representation of the color, in defined viewing conditions.
- *
- * @param viewingConditions Information about the environment where the color will be viewed.
- * @return ARGB representation of color
- */
- int viewed(ViewingConditions viewingConditions) {
- double[] xyz = xyzInViewingConditions(viewingConditions, tempArray);
- return ColorUtils.argbFromXyz(xyz[0], xyz[1], xyz[2]);
- }
-
- double[] xyzInViewingConditions(ViewingConditions viewingConditions, double[] returnArray) {
- double alpha =
- (getChroma() == 0.0 || getJ() == 0.0) ? 0.0 : getChroma() / Math.sqrt(
- getJ() / 100.0);
-
- double t =
- Math.pow(
- alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.getN()), 0.73),
- 1.0 / 0.9);
- double hRad = Math.toRadians(getHue());
-
- double eHue = 0.25 * (Math.cos(hRad + 2.0) + 3.8);
- double ac =
- viewingConditions.getAw()
- * Math.pow(getJ() / 100.0,
- 1.0 / viewingConditions.getC() / viewingConditions.getZ());
- double p1 =
- eHue * (50000.0 / 13.0) * viewingConditions.getNc() * viewingConditions.getNcb();
- double p2 = (ac / viewingConditions.getNbb());
-
- double hSin = Math.sin(hRad);
- double hCos = Math.cos(hRad);
-
- double gamma = 23.0 * (p2 + 0.305) * t / (23.0 * p1 + 11.0 * t * hCos + 108.0 * t * hSin);
- double a = gamma * hCos;
- double b = gamma * hSin;
- double rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0;
- double gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0;
- double bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0;
-
- double rCBase = max(0, (27.13 * Math.abs(rA)) / (400.0 - Math.abs(rA)));
- double rC =
- Math.signum(rA) * (100.0 / viewingConditions.getFl()) * Math.pow(rCBase,
- 1.0 / 0.42);
- double gCBase = max(0, (27.13 * Math.abs(gA)) / (400.0 - Math.abs(gA)));
- double gC =
- Math.signum(gA) * (100.0 / viewingConditions.getFl()) * Math.pow(gCBase,
- 1.0 / 0.42);
- double bCBase = max(0, (27.13 * Math.abs(bA)) / (400.0 - Math.abs(bA)));
- double bC =
- Math.signum(bA) * (100.0 / viewingConditions.getFl()) * Math.pow(bCBase,
- 1.0 / 0.42);
- double rF = rC / viewingConditions.getRgbD()[0];
- double gF = gC / viewingConditions.getRgbD()[1];
- double bF = bC / viewingConditions.getRgbD()[2];
-
- double[][] matrix = CAM16RGB_TO_XYZ;
- double x = (rF * matrix[0][0]) + (gF * matrix[0][1]) + (bF * matrix[0][2]);
- double y = (rF * matrix[1][0]) + (gF * matrix[1][1]) + (bF * matrix[1][2]);
- double z = (rF * matrix[2][0]) + (gF * matrix[2][1]) + (bF * matrix[2][2]);
-
- if (returnArray != null) {
- returnArray[0] = x;
- returnArray[1] = y;
- returnArray[2] = z;
- return returnArray;
- } else {
- return new double[]{x, y, z};
- }
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Hct.java b/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Hct.java
deleted file mode 100644
index 6cff99e9083c..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/Hct.java
+++ /dev/null
@@ -1,164 +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.monet.hct;
-
-import com.android.systemui.monet.utils.ColorUtils;
-
-/**
- * A color system built using CAM16 hue and chroma, and L* from L*a*b*.
- *
- * <p>Using L* creates a link between the color system, contrast, and thus accessibility. Contrast
- * ratio depends on relative luminance, or Y in the XYZ color space. L*, or perceptual luminance can
- * be calculated from Y.
- *
- * <p>Unlike Y, L* is linear to human perception, allowing trivial creation of accurate color tones.
- *
- * <p>Unlike contrast ratio, measuring contrast in L* is linear, and simple to calculate. A
- * difference of 40 in HCT tone guarantees a contrast ratio >= 3.0, and a difference of 50
- * guarantees a contrast ratio >= 4.5.
- */
-
-/**
- * HCT, hue, chroma, and tone. A color system that provides a perceptually accurate color
- * measurement system that can also accurately render what colors will appear as in different
- * lighting environments.
- */
-public final class Hct {
- private double hue;
- private double chroma;
- private double tone;
- private int argb;
-
- /**
- * Create an HCT color from hue, chroma, and tone.
- *
- * @param hue 0 <= hue < 360; invalid values are corrected.
- * @param chroma 0 <= chroma < ?; Informally, colorfulness. The color returned may be lower
- * than
- * the requested chroma. Chroma has a different maximum for any given hue and
- * tone.
- * @param tone 0 <= tone <= 100; invalid values are corrected.
- * @return HCT representation of a color in default viewing conditions.
- */
- public static Hct from(double hue, double chroma, double tone) {
- int argb = HctSolver.solveToInt(hue, chroma, tone);
- return new Hct(argb);
- }
-
- /**
- * Create an HCT color from a color.
- *
- * @param argb ARGB representation of a color.
- * @return HCT representation of a color in default viewing conditions
- */
- public static Hct fromInt(int argb) {
- return new Hct(argb);
- }
-
- private Hct(int argb) {
- setInternalState(argb);
- }
-
- public double getHue() {
- return hue;
- }
-
- public double getChroma() {
- return chroma;
- }
-
- public double getTone() {
- return tone;
- }
-
- /** This color converted to ARGB, i.e. a hex code. */
- public int toInt() {
- return argb;
- }
-
- /**
- * Set the hue of this color. Chroma may decrease because chroma has a different maximum for any
- * given hue and tone.
- *
- * @param newHue 0 <= newHue < 360; invalid values are corrected.
- */
- public void setHue(double newHue) {
- setInternalState(HctSolver.solveToInt(newHue, chroma, tone));
- }
-
- /**
- * Set the chroma of this color. Chroma may decrease because chroma has a different maximum for
- * any given hue and tone.
- *
- * @param newChroma 0 <= newChroma < ?
- */
- public void setChroma(double newChroma) {
- setInternalState(HctSolver.solveToInt(hue, newChroma, tone));
- }
-
- /**
- * Set the tone of this color. Chroma may decrease because chroma has a different maximum for
- * any
- * given hue and tone.
- *
- * @param newTone 0 <= newTone <= 100; invalid valids are corrected.
- */
- public void setTone(double newTone) {
- setInternalState(HctSolver.solveToInt(hue, chroma, newTone));
- }
-
- /**
- * Translate a color into different ViewingConditions.
- *
- * <p>Colors change appearance. They look different with lights on versus off, the same color,
- * as
- * in hex code, on white looks different when on black. This is called color relativity, most
- * famously explicated by Josef Albers in Interaction of Color.
- *
- * <p>In color science, color appearance models can account for this and calculate the
- * appearance
- * of a color in different settings. HCT is based on CAM16, a color appearance model, and uses
- * it
- * to make these calculations.
- *
- * <p>See ViewingConditions.make for parameters affecting color appearance.
- */
- public Hct inViewingConditions(ViewingConditions vc) {
- // 1. Use CAM16 to find XYZ coordinates of color in specified VC.
- Cam16 cam16 = Cam16.fromInt(toInt());
- double[] viewedInVc = cam16.xyzInViewingConditions(vc, null);
-
- // 2. Create CAM16 of those XYZ coordinates in default VC.
- Cam16 recastInVc =
- Cam16.fromXyzInViewingConditions(
- viewedInVc[0], viewedInVc[1], viewedInVc[2], ViewingConditions.DEFAULT);
-
- // 3. Create HCT from:
- // - CAM16 using default VC with XYZ coordinates in specified VC.
- // - L* converted from Y in XYZ coordinates in specified VC.
- return Hct.from(
- recastInVc.getHue(), recastInVc.getChroma(), ColorUtils.lstarFromY(viewedInVc[1]));
- }
-
- private void setInternalState(int argb) {
- this.argb = argb;
- Cam16 cam = Cam16.fromInt(argb);
- hue = cam.getHue();
- chroma = cam.getChroma();
- this.tone = ColorUtils.lstarFromArgb(argb);
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/HctSolver.java b/packages/SystemUI/monet/src/com/android/systemui/monet/hct/HctSolver.java
deleted file mode 100644
index 7083222489c7..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/HctSolver.java
+++ /dev/null
@@ -1,677 +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.monet.hct;
-
-import com.android.systemui.monet.utils.ColorUtils;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** A class that solves the HCT equation. */
-public class HctSolver {
- private HctSolver() {
- }
-
- static final double[][] SCALED_DISCOUNT_FROM_LINRGB =
- new double[][]{
- new double[]{
- 0.001200833568784504, 0.002389694492170889, 0.0002795742885861124,
- },
- new double[]{
- 0.0005891086651375999, 0.0029785502573438758, 0.0003270666104008398,
- },
- new double[]{
- 0.00010146692491640572, 0.0005364214359186694, 0.0032979401770712076,
- },
- };
-
- static final double[][] LINRGB_FROM_SCALED_DISCOUNT =
- new double[][]{
- new double[]{
- 1373.2198709594231, -1100.4251190754821, -7.278681089101213,
- },
- new double[]{
- -271.815969077903, 559.6580465940733, -32.46047482791194,
- },
- new double[]{
- 1.9622899599665666, -57.173814538844006, 308.7233197812385,
- },
- };
-
- static final double[] Y_FROM_LINRGB = new double[]{0.2126, 0.7152, 0.0722};
-
- static final double[] CRITICAL_PLANES =
- new double[]{
- 0.015176349177441876,
- 0.045529047532325624,
- 0.07588174588720938,
- 0.10623444424209313,
- 0.13658714259697685,
- 0.16693984095186062,
- 0.19729253930674434,
- 0.2276452376616281,
- 0.2579979360165119,
- 0.28835063437139563,
- 0.3188300904430532,
- 0.350925934958123,
- 0.3848314933096426,
- 0.42057480301049466,
- 0.458183274052838,
- 0.4976837250274023,
- 0.5391024159806381,
- 0.5824650784040898,
- 0.6277969426914107,
- 0.6751227633498623,
- 0.7244668422128921,
- 0.775853049866786,
- 0.829304845476233,
- 0.8848452951698498,
- 0.942497089126609,
- 1.0022825574869039,
- 1.0642236851973577,
- 1.1283421258858297,
- 1.1946592148522128,
- 1.2631959812511864,
- 1.3339731595349034,
- 1.407011200216447,
- 1.4823302800086415,
- 1.5599503113873272,
- 1.6398909516233677,
- 1.7221716113234105,
- 1.8068114625156377,
- 1.8938294463134073,
- 1.9832442801866852,
- 2.075074464868551,
- 2.1693382909216234,
- 2.2660538449872063,
- 2.36523901573795,
- 2.4669114995532007,
- 2.5710888059345764,
- 2.6777882626779785,
- 2.7870270208169257,
- 2.898822059350997,
- 3.0131901897720907,
- 3.1301480604002863,
- 3.2497121605402226,
- 3.3718988244681087,
- 3.4967242352587946,
- 3.624204428461639,
- 3.754355295633311,
- 3.887192587735158,
- 4.022731918402185,
- 4.160988767090289,
- 4.301978482107941,
- 4.445716283538092,
- 4.592217266055746,
- 4.741496401646282,
- 4.893568542229298,
- 5.048448422192488,
- 5.20615066083972,
- 5.3666897647573375,
- 5.5300801301023865,
- 5.696336044816294,
- 5.865471690767354,
- 6.037501145825082,
- 6.212438385869475,
- 6.390297286737924,
- 6.571091626112461,
- 6.7548350853498045,
- 6.941541251256611,
- 7.131223617812143,
- 7.323895587840543,
- 7.5195704746346665,
- 7.7182615035334345,
- 7.919981813454504,
- 8.124744458384042,
- 8.332562408825165,
- 8.543448553206703,
- 8.757415699253682,
- 8.974476575321063,
- 9.194643831691977,
- 9.417930041841839,
- 9.644347703669503,
- 9.873909240696694,
- 10.106627003236781,
- 10.342513269534024,
- 10.58158024687427,
- 10.8238400726681,
- 11.069304815507364,
- 11.317986476196008,
- 11.569896988756009,
- 11.825048221409341,
- 12.083451977536606,
- 12.345119996613247,
- 12.610063955123938,
- 12.878295467455942,
- 13.149826086772048,
- 13.42466730586372,
- 13.702830557985108,
- 13.984327217668513,
- 14.269168601521828,
- 14.55736596900856,
- 14.848930523210871,
- 15.143873411576273,
- 15.44220572664832,
- 15.743938506781891,
- 16.04908273684337,
- 16.35764934889634,
- 16.66964922287304,
- 16.985093187232053,
- 17.30399201960269,
- 17.62635644741625,
- 17.95219714852476,
- 18.281524751807332,
- 18.614349837764564,
- 18.95068293910138,
- 19.290534541298456,
- 19.633915083172692,
- 19.98083495742689,
- 20.331304511189067,
- 20.685334046541502,
- 21.042933821039977,
- 21.404114048223256,
- 21.76888489811322,
- 22.137256497705877,
- 22.50923893145328,
- 22.884842241736916,
- 23.264076429332462,
- 23.6469514538663,
- 24.033477234264016,
- 24.42366364919083,
- 24.817520537484558,
- 25.21505769858089,
- 25.61628489293138,
- 26.021211842414342,
- 26.429848230738664,
- 26.842203703840827,
- 27.258287870275353,
- 27.678110301598522,
- 28.10168053274597,
- 28.529008062403893,
- 28.96010235337422,
- 29.39497283293396,
- 29.83362889318845,
- 30.276079891419332,
- 30.722335150426627,
- 31.172403958865512,
- 31.62629557157785,
- 32.08401920991837,
- 32.54558406207592,
- 33.010999283389665,
- 33.4802739966603,
- 33.953417292456834,
- 34.430438229418264,
- 34.911345834551085,
- 35.39614910352207,
- 35.88485700094671,
- 36.37747846067349,
- 36.87402238606382,
- 37.37449765026789,
- 37.87891309649659,
- 38.38727753828926,
- 38.89959975977785,
- 39.41588851594697,
- 39.93615253289054,
- 40.460400508064545,
- 40.98864111053629,
- 41.520882981230194,
- 42.05713473317016,
- 42.597404951718396,
- 43.141702194811224,
- 43.6900349931913,
- 44.24241185063697,
- 44.798841244188324,
- 45.35933162437017,
- 45.92389141541209,
- 46.49252901546552,
- 47.065252796817916,
- 47.64207110610409,
- 48.22299226451468,
- 48.808024568002054,
- 49.3971762874833,
- 49.9904556690408,
- 50.587870934119984,
- 51.189430279724725,
- 51.79514187861014,
- 52.40501387947288,
- 53.0190544071392,
- 53.637271562750364,
- 54.259673423945976,
- 54.88626804504493,
- 55.517063457223934,
- 56.15206766869424,
- 56.79128866487574,
- 57.43473440856916,
- 58.08241284012621,
- 58.734331877617365,
- 59.39049941699807,
- 60.05092333227251,
- 60.715611475655585,
- 61.38457167773311,
- 62.057811747619894,
- 62.7353394731159,
- 63.417162620860914,
- 64.10328893648692,
- 64.79372614476921,
- 65.48848194977529,
- 66.18756403501224,
- 66.89098006357258,
- 67.59873767827808,
- 68.31084450182222,
- 69.02730813691093,
- 69.74813616640164,
- 70.47333615344107,
- 71.20291564160104,
- 71.93688215501312,
- 72.67524319850172,
- 73.41800625771542,
- 74.16517879925733,
- 74.9167682708136,
- 75.67278210128072,
- 76.43322770089146,
- 77.1981124613393,
- 77.96744375590167,
- 78.74122893956174,
- 79.51947534912904,
- 80.30219030335869,
- 81.08938110306934,
- 81.88105503125999,
- 82.67721935322541,
- 83.4778813166706,
- 84.28304815182372,
- 85.09272707154808,
- 85.90692527145302,
- 86.72564993000343,
- 87.54890820862819,
- 88.3767072518277,
- 89.2090541872801,
- 90.04595612594655,
- 90.88742016217518,
- 91.73345337380438,
- 92.58406282226491,
- 93.43925555268066,
- 94.29903859396902,
- 95.16341895893969,
- 96.03240364439274,
- 96.9059996312159,
- 97.78421388448044,
- 98.6670533535366,
- 99.55452497210776,
- };
-
- /**
- * Sanitizes a small enough angle in radians.
- *
- * @param angle An angle in radians; must not deviate too much from 0.
- * @return A coterminal angle between 0 and 2pi.
- */
- static double sanitizeRadians(double angle) {
- return (angle + Math.PI * 8) % (Math.PI * 2);
- }
-
- /**
- * Delinearizes an RGB component, returning a floating-point number.
- *
- * @param rgbComponent 0.0 <= rgb_component <= 100.0, represents linear R/G/B channel
- * @return 0.0 <= output <= 255.0, color channel converted to regular RGB space
- */
- static double trueDelinearized(double rgbComponent) {
- double normalized = rgbComponent / 100.0;
- double delinearized = 0.0;
- if (normalized <= 0.0031308) {
- delinearized = normalized * 12.92;
- } else {
- delinearized = 1.055 * Math.pow(normalized, 1.0 / 2.4) - 0.055;
- }
- return delinearized * 255.0;
- }
-
- static double chromaticAdaptation(double component) {
- double af = Math.pow(Math.abs(component), 0.42);
- return MathUtils.signum(component) * 400.0 * af / (af + 27.13);
- }
-
- /**
- * Returns the hue of a linear RGB color in CAM16.
- *
- * @param linrgb The linear RGB coordinates of a color.
- * @return The hue of the color in CAM16, in radians.
- */
- static double hueOf(double[] linrgb) {
- double[] scaledDiscount = MathUtils.matrixMultiply(linrgb, SCALED_DISCOUNT_FROM_LINRGB);
- double rA = chromaticAdaptation(scaledDiscount[0]);
- double gA = chromaticAdaptation(scaledDiscount[1]);
- double bA = chromaticAdaptation(scaledDiscount[2]);
- // redness-greenness
- double a = (11.0 * rA + -12.0 * gA + bA) / 11.0;
- // yellowness-blueness
- double b = (rA + gA - 2.0 * bA) / 9.0;
- return Math.atan2(b, a);
- }
-
- static boolean areInCyclicOrder(double a, double b, double c) {
- double deltaAB = sanitizeRadians(b - a);
- double deltaAC = sanitizeRadians(c - a);
- return deltaAB < deltaAC;
- }
-
- /**
- * Solves the lerp equation.
- *
- * @param source The starting number.
- * @param mid The number in the middle.
- * @param target The ending number.
- * @return A number t such that lerp(source, target, t) = mid.
- */
- static double intercept(double source, double mid, double target) {
- return (mid - source) / (target - source);
- }
-
- static double[] lerpPoint(double[] source, double t, double[] target) {
- return new double[]{
- source[0] + (target[0] - source[0]) * t,
- source[1] + (target[1] - source[1]) * t,
- source[2] + (target[2] - source[2]) * t,
- };
- }
-
- /**
- * Intersects a segment with a plane.
- *
- * @param source The coordinates of point A.
- * @param coordinate The R-, G-, or B-coordinate of the plane.
- * @param target The coordinates of point B.
- * @param axis The axis the plane is perpendicular with. (0: R, 1: G, 2: B)
- * @return The intersection point of the segment AB with the plane R=coordinate,
- * G=coordinate, or
- * B=coordinate
- */
- static double[] setCoordinate(double[] source, double coordinate, double[] target, int axis) {
- double t = intercept(source[axis], coordinate, target[axis]);
- return lerpPoint(source, t, target);
- }
-
- static boolean isBounded(double x) {
- return 0.0 <= x && x <= 100.0;
- }
-
- /**
- * Returns the nth possible vertex of the polygonal intersection.
- *
- * @param y The Y value of the plane.
- * @param n The zero-based index of the point. 0 <= n <= 11.
- * @return The nth possible vertex of the polygonal intersection of the y plane and the RGB
- * cube,
- * in linear RGB coordinates, if it exists. If this possible vertex lies outside of the cube,
- * [-1.0, -1.0, -1.0] is returned.
- */
- static double[] nthVertex(double y, int n) {
- double kR = Y_FROM_LINRGB[0];
- double kG = Y_FROM_LINRGB[1];
- double kB = Y_FROM_LINRGB[2];
- double coordA = n % 4 <= 1 ? 0.0 : 100.0;
- double coordB = n % 2 == 0 ? 0.0 : 100.0;
- if (n < 4) {
- double g = coordA;
- double b = coordB;
- double r = (y - g * kG - b * kB) / kR;
- if (isBounded(r)) {
- return new double[]{r, g, b};
- } else {
- return new double[]{-1.0, -1.0, -1.0};
- }
- } else if (n < 8) {
- double b = coordA;
- double r = coordB;
- double g = (y - r * kR - b * kB) / kG;
- if (isBounded(g)) {
- return new double[]{r, g, b};
- } else {
- return new double[]{-1.0, -1.0, -1.0};
- }
- } else {
- double r = coordA;
- double g = coordB;
- double b = (y - r * kR - g * kG) / kB;
- if (isBounded(b)) {
- return new double[]{r, g, b};
- } else {
- return new double[]{-1.0, -1.0, -1.0};
- }
- }
- }
-
- /**
- * Finds the segment containing the desired color.
- *
- * @param y The Y value of the color.
- * @param targetHue The hue of the color.
- * @return A list of two sets of linear RGB coordinates, each corresponding to an endpoint of
- * the
- * segment containing the desired color.
- */
- static double[][] bisectToSegment(double y, double targetHue) {
- double[] left = new double[]{-1.0, -1.0, -1.0};
- double[] right = left;
- double leftHue = 0.0;
- double rightHue = 0.0;
- boolean initialized = false;
- boolean uncut = true;
- for (int n = 0; n < 12; n++) {
- double[] mid = nthVertex(y, n);
- if (mid[0] < 0) {
- continue;
- }
- double midHue = hueOf(mid);
- if (!initialized) {
- left = mid;
- right = mid;
- leftHue = midHue;
- rightHue = midHue;
- initialized = true;
- continue;
- }
- if (uncut || areInCyclicOrder(leftHue, midHue, rightHue)) {
- uncut = false;
- if (areInCyclicOrder(leftHue, targetHue, midHue)) {
- right = mid;
- rightHue = midHue;
- } else {
- left = mid;
- leftHue = midHue;
- }
- }
- }
- return new double[][]{left, right};
- }
-
- static double[] midpoint(double[] a, double[] b) {
- return new double[]{
- (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2,
- };
- }
-
- static int criticalPlaneBelow(double x) {
- return (int) Math.floor(x - 0.5);
- }
-
- static int criticalPlaneAbove(double x) {
- return (int) Math.ceil(x - 0.5);
- }
-
- /**
- * Finds a color with the given Y and hue on the boundary of the cube.
- *
- * @param y The Y value of the color.
- * @param targetHue The hue of the color.
- * @return The desired color, in linear RGB coordinates.
- */
- static double[] bisectToLimit(double y, double targetHue) {
- double[][] segment = bisectToSegment(y, targetHue);
- double[] left = segment[0];
- double leftHue = hueOf(left);
- double[] right = segment[1];
- for (int axis = 0; axis < 3; axis++) {
- if (left[axis] != right[axis]) {
- int lPlane = -1;
- int rPlane = 255;
- if (left[axis] < right[axis]) {
- lPlane = criticalPlaneBelow(trueDelinearized(left[axis]));
- rPlane = criticalPlaneAbove(trueDelinearized(right[axis]));
- } else {
- lPlane = criticalPlaneAbove(trueDelinearized(left[axis]));
- rPlane = criticalPlaneBelow(trueDelinearized(right[axis]));
- }
- for (int i = 0; i < 8; i++) {
- if (Math.abs(rPlane - lPlane) <= 1) {
- break;
- } else {
- int mPlane = (int) Math.floor((lPlane + rPlane) / 2.0);
- double midPlaneCoordinate = CRITICAL_PLANES[mPlane];
- double[] mid = setCoordinate(left, midPlaneCoordinate, right, axis);
- double midHue = hueOf(mid);
- if (areInCyclicOrder(leftHue, targetHue, midHue)) {
- right = mid;
- rPlane = mPlane;
- } else {
- left = mid;
- leftHue = midHue;
- lPlane = mPlane;
- }
- }
- }
- }
- }
- return midpoint(left, right);
- }
-
- static double inverseChromaticAdaptation(double adapted) {
- double adaptedAbs = Math.abs(adapted);
- double base = Math.max(0, 27.13 * adaptedAbs / (400.0 - adaptedAbs));
- return MathUtils.signum(adapted) * Math.pow(base, 1.0 / 0.42);
- }
-
- /**
- * Finds a color with the given hue, chroma, and Y.
- *
- * @param hueRadians The desired hue in radians.
- * @param chroma The desired chroma.
- * @param y The desired Y.
- * @return The desired color as a hexadecimal integer, if found; 0 otherwise.
- */
- static int findResultByJ(double hueRadians, double chroma, double y) {
- // Initial estimate of j.
- double j = Math.sqrt(y) * 11.0;
- // ===========================================================
- // Operations inlined from Cam16 to avoid repeated calculation
- // ===========================================================
- ViewingConditions viewingConditions = ViewingConditions.DEFAULT;
- double tInnerCoeff = 1 / Math.pow(1.64 - Math.pow(0.29, viewingConditions.getN()), 0.73);
- double eHue = 0.25 * (Math.cos(hueRadians + 2.0) + 3.8);
- double p1 =
- eHue * (50000.0 / 13.0) * viewingConditions.getNc() * viewingConditions.getNcb();
- double hSin = Math.sin(hueRadians);
- double hCos = Math.cos(hueRadians);
- for (int iterationRound = 0; iterationRound < 5; iterationRound++) {
- // ===========================================================
- // Operations inlined from Cam16 to avoid repeated calculation
- // ===========================================================
- double jNormalized = j / 100.0;
- double alpha = chroma == 0.0 || j == 0.0 ? 0.0 : chroma / Math.sqrt(jNormalized);
- double t = Math.pow(alpha * tInnerCoeff, 1.0 / 0.9);
- double ac =
- viewingConditions.getAw()
- * Math.pow(jNormalized,
- 1.0 / viewingConditions.getC() / viewingConditions.getZ());
- double p2 = ac / viewingConditions.getNbb();
- double gamma = 23.0 * (p2 + 0.305) * t / (23.0 * p1 + 11 * t * hCos + 108.0 * t * hSin);
- double a = gamma * hCos;
- double b = gamma * hSin;
- double rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0;
- double gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0;
- double bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0;
- double rCScaled = inverseChromaticAdaptation(rA);
- double gCScaled = inverseChromaticAdaptation(gA);
- double bCScaled = inverseChromaticAdaptation(bA);
- double[] linrgb =
- MathUtils.matrixMultiply(
- new double[]{rCScaled, gCScaled, bCScaled},
- LINRGB_FROM_SCALED_DISCOUNT);
- // ===========================================================
- // Operations inlined from Cam16 to avoid repeated calculation
- // ===========================================================
- if (linrgb[0] < 0 || linrgb[1] < 0 || linrgb[2] < 0) {
- return 0;
- }
- double kR = Y_FROM_LINRGB[0];
- double kG = Y_FROM_LINRGB[1];
- double kB = Y_FROM_LINRGB[2];
- double fnj = kR * linrgb[0] + kG * linrgb[1] + kB * linrgb[2];
- if (fnj <= 0) {
- return 0;
- }
- if (iterationRound == 4 || Math.abs(fnj - y) < 0.002) {
- if (linrgb[0] > 100.01 || linrgb[1] > 100.01 || linrgb[2] > 100.01) {
- return 0;
- }
- return ColorUtils.argbFromLinrgb(linrgb);
- }
- // Iterates with Newton method,
- // Using 2 * fn(j) / j as the approximation of fn'(j)
- j = j - (fnj - y) * j / (2 * fnj);
- }
- return 0;
- }
-
- /**
- * Finds an sRGB color with the given hue, chroma, and L*, if possible.
- *
- * @param hueDegrees The desired hue, in degrees.
- * @param chroma The desired chroma.
- * @param lstar The desired L*.
- * @return A hexadecimal representing the sRGB color. The color has sufficiently close hue,
- * chroma, and L* to the desired values, if possible; otherwise, the hue and L* will be
- * sufficiently close, and chroma will be maximized.
- */
- public static int solveToInt(double hueDegrees, double chroma, double lstar) {
- if (chroma < 0.0001 || lstar < 0.0001 || lstar > 99.9999) {
- return ColorUtils.argbFromLstar(lstar);
- }
- hueDegrees = MathUtils.sanitizeDegreesDouble(hueDegrees);
- double hueRadians = hueDegrees / 180 * Math.PI;
- double y = ColorUtils.yFromLstar(lstar);
- int exactAnswer = findResultByJ(hueRadians, chroma, y);
- if (exactAnswer != 0) {
- return exactAnswer;
- }
- double[] linrgb = bisectToLimit(y, hueRadians);
- return ColorUtils.argbFromLinrgb(linrgb);
- }
-
- /**
- * Finds an sRGB color with the given hue, chroma, and L*, if possible.
- *
- * @param hueDegrees The desired hue, in degrees.
- * @param chroma The desired chroma.
- * @param lstar The desired L*.
- * @return A CAM16 object representing the sRGB color. The color has sufficiently close hue,
- * chroma, and L* to the desired values, if possible; otherwise, the hue and L* will be
- * sufficiently close, and chroma will be maximized.
- */
- public static Cam16 solveToCam(double hueDegrees, double chroma, double lstar) {
- return Cam16.fromInt(solveToInt(hueDegrees, chroma, lstar));
- }
-}
-
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/ViewingConditions.java b/packages/SystemUI/monet/src/com/android/systemui/monet/hct/ViewingConditions.java
deleted file mode 100644
index a0ba7a6781cc..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/hct/ViewingConditions.java
+++ /dev/null
@@ -1,218 +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.monet.hct;
-
-import com.android.systemui.monet.utils.ColorUtils;
-import com.android.systemui.monet.utils.MathUtils;
-
-/**
- * In traditional color spaces, a color can be identified solely by the observer's measurement of
- * the color. Color appearance models such as CAM16 also use information about the environment where
- * the color was observed, known as the viewing conditions.
- *
- * <p>For example, white under the traditional assumption of a midday sun white point is accurately
- * measured as a slightly chromatic blue by CAM16. (roughly, hue 203, chroma 3, lightness 100)
- *
- * <p>This class caches intermediate values of the CAM16 conversion process that depend only on
- * viewing conditions, enabling speed ups.
- */
-public final class ViewingConditions {
- /** sRGB-like viewing conditions. */
- public static final ViewingConditions DEFAULT =
- ViewingConditions.defaultWithBackgroundLstar(50.0);
-
- private final double aw;
- private final double nbb;
- private final double ncb;
- private final double c;
- private final double nc;
- private final double n;
- private final double[] rgbD;
- private final double fl;
- private final double flRoot;
- private final double z;
-
- public double getAw() {
- return aw;
- }
-
- public double getN() {
- return n;
- }
-
- public double getNbb() {
- return nbb;
- }
-
- double getNcb() {
- return ncb;
- }
-
- double getC() {
- return c;
- }
-
- double getNc() {
- return nc;
- }
-
- public double[] getRgbD() {
- return rgbD;
- }
-
- double getFl() {
- return fl;
- }
-
- public double getFlRoot() {
- return flRoot;
- }
-
- double getZ() {
- return z;
- }
-
- /**
- * Create ViewingConditions from a simple, physically relevant, set of parameters.
- *
- * @param whitePoint White point, measured in the XYZ color space. default = D65, or
- * sunny day
- * afternoon
- * @param adaptingLuminance The luminance of the adapting field. Informally, how bright it
- * is in
- * the room where the color is viewed. Can be calculated from lux
- * by multiplying lux by
- * 0.0586. default = 11.72, or 200 lux.
- * @param backgroundLstar The lightness of the area surrounding the color. measured by L*
- * in
- * L*a*b*. default = 50.0
- * @param surround A general description of the lighting surrounding the color. 0
- * is pitch dark,
- * like watching a movie in a theater. 1.0 is a dimly light room,
- * like watching TV at home at
- * night. 2.0 means there is no difference between the lighting on
- * the color and around it.
- * default = 2.0
- * @param discountingIlluminant Whether the eye accounts for the tint of the ambient lighting,
- * such as knowing an apple is still red in green light. default =
- * false, the eye does not
- * perform this process on self-luminous objects like displays.
- */
- public static ViewingConditions make(
- double[] whitePoint,
- double adaptingLuminance,
- double backgroundLstar,
- double surround,
- boolean discountingIlluminant) {
- // A background of pure black is non-physical and leads to infinities that represent the
- // idea
- // that any color viewed in pure black can't be seen.
- backgroundLstar = Math.max(0.1, backgroundLstar);
- // Transform white point XYZ to 'cone'/'rgb' responses
- double[][] matrix = Cam16.XYZ_TO_CAM16RGB;
- double[] xyz = whitePoint;
- double rW = (xyz[0] * matrix[0][0]) + (xyz[1] * matrix[0][1]) + (xyz[2] * matrix[0][2]);
- double gW = (xyz[0] * matrix[1][0]) + (xyz[1] * matrix[1][1]) + (xyz[2] * matrix[1][2]);
- double bW = (xyz[0] * matrix[2][0]) + (xyz[1] * matrix[2][1]) + (xyz[2] * matrix[2][2]);
- double f = 0.8 + (surround / 10.0);
- double c =
- (f >= 0.9)
- ? MathUtils.lerp(0.59, 0.69, ((f - 0.9) * 10.0))
- : MathUtils.lerp(0.525, 0.59, ((f - 0.8) * 10.0));
- double d =
- discountingIlluminant
- ? 1.0
- : f * (1.0 - ((1.0 / 3.6) * Math.exp((-adaptingLuminance - 42.0) / 92.0)));
- d = MathUtils.clampDouble(0.0, 1.0, d);
- double nc = f;
- double[] rgbD =
- new double[]{
- d * (100.0 / rW) + 1.0 - d, d * (100.0 / gW) + 1.0 - d,
- d * (100.0 / bW) + 1.0 - d
- };
- double k = 1.0 / (5.0 * adaptingLuminance + 1.0);
- double k4 = k * k * k * k;
- double k4F = 1.0 - k4;
- double fl = (k4 * adaptingLuminance) + (0.1 * k4F * k4F * Math.cbrt(
- 5.0 * adaptingLuminance));
- double n = (ColorUtils.yFromLstar(backgroundLstar) / whitePoint[1]);
- double z = 1.48 + Math.sqrt(n);
- double nbb = 0.725 / Math.pow(n, 0.2);
- double ncb = nbb;
- double[] rgbAFactors =
- new double[]{
- Math.pow(fl * rgbD[0] * rW / 100.0, 0.42),
- Math.pow(fl * rgbD[1] * gW / 100.0, 0.42),
- Math.pow(fl * rgbD[2] * bW / 100.0, 0.42)
- };
-
- double[] rgbA =
- new double[]{
- (400.0 * rgbAFactors[0]) / (rgbAFactors[0] + 27.13),
- (400.0 * rgbAFactors[1]) / (rgbAFactors[1] + 27.13),
- (400.0 * rgbAFactors[2]) / (rgbAFactors[2] + 27.13)
- };
-
- double aw = ((2.0 * rgbA[0]) + rgbA[1] + (0.05 * rgbA[2])) * nbb;
- return new ViewingConditions(n, aw, nbb, ncb, c, nc, rgbD, fl, Math.pow(fl, 0.25), z);
- }
-
- /**
- * Create sRGB-like viewing conditions with a custom background lstar.
- *
- * <p>Default viewing conditions have a lstar of 50, midgray.
- */
- public static ViewingConditions defaultWithBackgroundLstar(double lstar) {
- return ViewingConditions.make(
- ColorUtils.whitePointD65(),
- (200.0 / Math.PI * ColorUtils.yFromLstar(50.0) / 100.f),
- lstar,
- 2.0,
- false);
- }
-
- /**
- * Parameters are intermediate values of the CAM16 conversion process. Their names are
- * shorthand
- * for technical color science terminology, this class would not benefit from documenting them
- * individually. A brief overview is available in the CAM16 specification, and a complete
- * overview
- * requires a color science textbook, such as Fairchild's Color Appearance Models.
- */
- private ViewingConditions(
- double n,
- double aw,
- double nbb,
- double ncb,
- double c,
- double nc,
- double[] rgbD,
- double fl,
- double flRoot,
- double z) {
- this.n = n;
- this.aw = aw;
- this.nbb = nbb;
- this.ncb = ncb;
- this.c = c;
- this.nc = nc;
- this.rgbD = rgbD;
- this.fl = fl;
- this.flRoot = flRoot;
- this.z = z;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/CorePalette.java b/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/CorePalette.java
deleted file mode 100644
index 37f6042045f9..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/CorePalette.java
+++ /dev/null
@@ -1,73 +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.monet.palettes;
-
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-
-import com.android.systemui.monet.hct.Hct;
-
-/**
- * An intermediate concept between the key color for a UI theme, and a full color scheme. 5 sets of
- * tones are generated, all except one use the same hue as the key color, and all vary in chroma.
- */
-public final class CorePalette {
- public TonalPalette a1;
- public TonalPalette a2;
- public TonalPalette a3;
- public TonalPalette n1;
- public TonalPalette n2;
- public TonalPalette error;
-
- /**
- * Create key tones from a color.
- *
- * @param argb ARGB representation of a color
- */
- public static CorePalette of(int argb) {
- return new CorePalette(argb, false);
- }
-
- /**
- * Create content key tones from a color.
- *
- * @param argb ARGB representation of a color
- */
- public static CorePalette contentOf(int argb) {
- return new CorePalette(argb, true);
- }
-
- private CorePalette(int argb, boolean isContent) {
- Hct hct = Hct.fromInt(argb);
- double hue = hct.getHue();
- double chroma = hct.getChroma();
- if (isContent) {
- this.a1 = TonalPalette.fromHueAndChroma(hue, chroma);
- this.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3.);
- this.a3 = TonalPalette.fromHueAndChroma(hue + 60., chroma / 2.);
- this.n1 = TonalPalette.fromHueAndChroma(hue, min(chroma / 12., 4.));
- this.n2 = TonalPalette.fromHueAndChroma(hue, min(chroma / 6., 8.));
- } else {
- this.a1 = TonalPalette.fromHueAndChroma(hue, max(48., chroma));
- this.a2 = TonalPalette.fromHueAndChroma(hue, 16.);
- this.a3 = TonalPalette.fromHueAndChroma(hue + 60., 24.);
- this.n1 = TonalPalette.fromHueAndChroma(hue, 4.);
- this.n2 = TonalPalette.fromHueAndChroma(hue, 8.);
- }
- this.error = TonalPalette.fromHueAndChroma(25, 84.);
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/TonalPalette.java b/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/TonalPalette.java
deleted file mode 100644
index 8e905ea2c33e..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/palettes/TonalPalette.java
+++ /dev/null
@@ -1,146 +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.monet.palettes;
-
-import com.android.systemui.monet.hct.Hct;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A convenience class for retrieving colors that are constant in hue and chroma, but vary in tone.
- */
-public final class TonalPalette {
- Map<Integer, Integer> cache;
- Hct keyColor;
- double hue;
- double chroma;
-
- /**
- * Create tones using the HCT hue and chroma from a color.
- *
- * @param argb ARGB representation of a color
- * @return Tones matching that color's hue and chroma.
- */
- public static TonalPalette fromInt(int argb) {
- return fromHct(Hct.fromInt(argb));
- }
-
- /**
- * Create tones using a HCT color.
- *
- * @param hct HCT representation of a color.
- * @return Tones matching that color's hue and chroma.
- */
- public static TonalPalette fromHct(Hct hct) {
- return new TonalPalette(hct.getHue(), hct.getChroma(), hct);
- }
-
- /**
- * Create tones from a defined HCT hue and chroma.
- *
- * @param hue HCT hue
- * @param chroma HCT chroma
- * @return Tones matching hue and chroma.
- */
- public static TonalPalette fromHueAndChroma(double hue, double chroma) {
- return new TonalPalette(hue, chroma, createKeyColor(hue, chroma));
- }
-
- private TonalPalette(double hue, double chroma, Hct keyColor) {
- cache = new HashMap<>();
- this.hue = hue;
- this.chroma = chroma;
- this.keyColor = keyColor;
- }
-
- /** The key color is the first tone, starting from T50, matching the given hue and chroma. */
- private static Hct createKeyColor(double hue, double chroma) {
- double startTone = 50.0;
- Hct smallestDeltaHct = Hct.from(hue, chroma, startTone);
- double smallestDelta = Math.abs(smallestDeltaHct.getChroma() - chroma);
- // Starting from T50, check T+/-delta to see if they match the requested
- // chroma.
- //
- // Starts from T50 because T50 has the most chroma available, on
- // average. Thus it is most likely to have a direct answer and minimize
- // iteration.
- for (double delta = 1.0; delta < 50.0; delta += 1.0) {
- // Termination condition rounding instead of minimizing delta to avoid
- // case where requested chroma is 16.51, and the closest chroma is 16.49.
- // Error is minimized, but when rounded and displayed, requested chroma
- // is 17, key color's chroma is 16.
- if (Math.round(chroma) == Math.round(smallestDeltaHct.getChroma())) {
- return smallestDeltaHct;
- }
-
- final Hct hctAdd = Hct.from(hue, chroma, startTone + delta);
- final double hctAddDelta = Math.abs(hctAdd.getChroma() - chroma);
- if (hctAddDelta < smallestDelta) {
- smallestDelta = hctAddDelta;
- smallestDeltaHct = hctAdd;
- }
-
- final Hct hctSubtract = Hct.from(hue, chroma, startTone - delta);
- final double hctSubtractDelta = Math.abs(hctSubtract.getChroma() - chroma);
- if (hctSubtractDelta < smallestDelta) {
- smallestDelta = hctSubtractDelta;
- smallestDeltaHct = hctSubtract;
- }
- }
-
- return smallestDeltaHct;
- }
-
- /**
- * Create an ARGB color with HCT hue and chroma of this Tones instance, and the provided HCT
- * tone.
- *
- * @param tone HCT tone, measured from 0 to 100.
- * @return ARGB representation of a color with that tone.
- */
- // AndroidJdkLibsChecker is higher priority than ComputeIfAbsentUseValue (b/119581923)
- @SuppressWarnings("ComputeIfAbsentUseValue")
- public int tone(int tone) {
- Integer color = cache.get(tone);
- if (color == null) {
- color = Hct.from(this.hue, this.chroma, tone).toInt();
- cache.put(tone, color);
- }
- return color;
- }
-
- /** Given a tone, use hue and chroma of palette to create a color, and return it as HCT. */
- public Hct getHct(double tone) {
- return Hct.from(this.hue, this.chroma, tone);
- }
-
- /** The chroma of the Tonal Palette, in HCT. Ranges from 0 to ~130 (for sRGB gamut). */
- public double getChroma() {
- return this.chroma;
- }
-
- /** The hue of the Tonal Palette, in HCT. Ranges from 0 to 360. */
- public double getHue() {
- return this.hue;
- }
-
- /** The key color is the first tone, starting from T50, that matches the palette's chroma. */
- public Hct getKeyColor() {
- return this.keyColor;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProviderLab.java b/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProviderLab.java
deleted file mode 100644
index e852d5ad9c60..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProviderLab.java
+++ /dev/null
@@ -1,56 +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.monet.quantize;
-
-import com.android.systemui.monet.utils.ColorUtils;
-
-/**
- * Provides conversions needed for K-Means quantization. Converting input to points, and converting
- * the final state of the K-Means algorithm to colors.
- */
-public final class PointProviderLab implements PointProvider {
- /**
- * Convert a color represented in ARGB to a 3-element array of L*a*b* coordinates of the color.
- */
- @Override
- public double[] fromInt(int argb) {
- double[] lab = ColorUtils.labFromArgb(argb);
- return new double[]{lab[0], lab[1], lab[2]};
- }
-
- /** Convert a 3-element array to a color represented in ARGB. */
- @Override
- public int toInt(double[] lab) {
- return ColorUtils.argbFromLab(lab[0], lab[1], lab[2]);
- }
-
- /**
- * Standard CIE 1976 delta E formula also takes the square root, unneeded here. This method is
- * used by quantization algorithms to compare distance, and the relative ordering is the same,
- * with or without a square root.
- *
- * <p>This relatively minor optimization is helpful because this method is called at least once
- * for each pixel in an image.
- */
- @Override
- public double distance(double[] one, double[] two) {
- double dL = (one[0] - two[0]);
- double dA = (one[1] - two[1]);
- double dB = (one[2] - two[2]);
- return (dL * dL + dA * dA + dB * dB);
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerCelebi.java b/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerCelebi.java
deleted file mode 100644
index d448dd0e4a96..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerCelebi.java
+++ /dev/null
@@ -1,61 +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.monet.quantize;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * An image quantizer that improves on the quality of a standard K-Means algorithm by setting the
- * K-Means initial state to the output of a Wu quantizer, instead of random centroids. Improves on
- * speed by several optimizations, as implemented in Wsmeans, or Weighted Square Means, K-Means with
- * those optimizations.
- *
- * <p>This algorithm was designed by M. Emre Celebi, and was found in their 2011 paper, Improving
- * the Performance of K-Means for Color Quantization. https://arxiv.org/abs/1101.0395
- */
-public final class QuantizerCelebi {
- private QuantizerCelebi() {
- }
-
- /**
- * Reduce the number of colors needed to represented the input, minimizing the difference
- * between
- * the original image and the recolored image.
- *
- * @param pixels Colors in ARGB format.
- * @param maxColors The number of colors to divide the image into. A lower number of colors may
- * be
- * returned.
- * @return Map with keys of colors in ARGB format, and values of number of pixels in the
- * original
- * image that correspond to the color in the quantized image.
- */
- public static Map<Integer, Integer> quantize(int[] pixels, int maxColors) {
- QuantizerWu wu = new QuantizerWu();
- QuantizerResult wuResult = wu.quantize(pixels, maxColors);
-
- Set<Integer> wuClustersAsObjects = wuResult.colorToCount.keySet();
- int index = 0;
- int[] wuClusters = new int[wuClustersAsObjects.size()];
- for (Integer argb : wuClustersAsObjects) {
- wuClusters[index++] = argb;
- }
-
- return QuantizerWsmeans.quantize(pixels, wuClusters, maxColors);
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerMap.java b/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerMap.java
deleted file mode 100644
index 9dae8ffa2c41..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerMap.java
+++ /dev/null
@@ -1,41 +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.monet.quantize;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/** Creates a dictionary with keys of colors, and values of count of the color */
-public final class QuantizerMap implements Quantizer {
- Map<Integer, Integer> colorToCount;
-
- @Override
- public QuantizerResult quantize(int[] pixels, int colorCount) {
- final Map<Integer, Integer> pixelByCount = new LinkedHashMap<>();
- for (int pixel : pixels) {
- final Integer currentPixelCount = pixelByCount.get(pixel);
- final int newPixelCount = currentPixelCount == null ? 1 : currentPixelCount + 1;
- pixelByCount.put(pixel, newPixelCount);
- }
- colorToCount = pixelByCount;
- return new QuantizerResult(pixelByCount);
- }
-
- public Map<Integer, Integer> getColorToCount() {
- return colorToCount;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWsmeans.java b/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWsmeans.java
deleted file mode 100644
index 75dd75bd518b..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWsmeans.java
+++ /dev/null
@@ -1,233 +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.monet.quantize;
-
-import static java.lang.Math.min;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Random;
-
-/**
- * An image quantizer that improves on the speed of a standard K-Means algorithm by implementing
- * several optimizations, including deduping identical pixels and a triangle inequality rule that
- * reduces the number of comparisons needed to identify which cluster a point should be moved to.
- *
- * <p>Wsmeans stands for Weighted Square Means.
- *
- * <p>This algorithm was designed by M. Emre Celebi, and was found in their 2011 paper, Improving
- * the Performance of K-Means for Color Quantization. https://arxiv.org/abs/1101.0395
- */
-public final class QuantizerWsmeans {
- private QuantizerWsmeans() {
- }
-
- private static final class Distance implements Comparable<Distance> {
- int index;
- double distance;
-
- Distance() {
- this.index = -1;
- this.distance = -1;
- }
-
- @Override
- public int compareTo(Distance other) {
- return ((Double) this.distance).compareTo(other.distance);
- }
- }
-
- private static final int MAX_ITERATIONS = 10;
- private static final double MIN_MOVEMENT_DISTANCE = 3.0;
-
- /**
- * Reduce the number of colors needed to represented the input, minimizing the difference
- * between
- * the original image and the recolored image.
- *
- * @param inputPixels Colors in ARGB format.
- * @param startingClusters Defines the initial state of the quantizer. Passing an empty array
- * is
- * fine, the implementation will create its own initial state that leads
- * to reproducible
- * results for the same inputs. Passing an array that is the result of
- * Wu quantization leads
- * to higher quality results.
- * @param maxColors The number of colors to divide the image into. A lower number of
- * colors may be
- * returned.
- * @return Map with keys of colors in ARGB format, values of how many of the input pixels belong
- * to the color.
- */
- public static Map<Integer, Integer> quantize(
- int[] inputPixels, int[] startingClusters, int maxColors) {
- // Uses a seeded random number generator to ensure consistent results.
- Random random = new Random(0x42688);
-
- Map<Integer, Integer> pixelToCount = new LinkedHashMap<>();
- double[][] points = new double[inputPixels.length][];
- int[] pixels = new int[inputPixels.length];
- PointProvider pointProvider = new PointProviderLab();
-
- int pointCount = 0;
- for (int i = 0; i < inputPixels.length; i++) {
- int inputPixel = inputPixels[i];
- Integer pixelCount = pixelToCount.get(inputPixel);
- if (pixelCount == null) {
- points[pointCount] = pointProvider.fromInt(inputPixel);
- pixels[pointCount] = inputPixel;
- pointCount++;
-
- pixelToCount.put(inputPixel, 1);
- } else {
- pixelToCount.put(inputPixel, pixelCount + 1);
- }
- }
-
- int[] counts = new int[pointCount];
- for (int i = 0; i < pointCount; i++) {
- int pixel = pixels[i];
- int count = pixelToCount.get(pixel);
- counts[i] = count;
- }
-
- int clusterCount = min(maxColors, pointCount);
- if (startingClusters.length != 0) {
- clusterCount = min(clusterCount, startingClusters.length);
- }
-
- double[][] clusters = new double[clusterCount][];
- for (int i = 0; i < startingClusters.length; i++) {
- clusters[i] = pointProvider.fromInt(startingClusters[i]);
- }
-
- int[] clusterIndices = new int[pointCount];
- for (int i = 0; i < pointCount; i++) {
- clusterIndices[i] = random.nextInt(clusterCount);
- }
-
- int[][] indexMatrix = new int[clusterCount][];
- for (int i = 0; i < clusterCount; i++) {
- indexMatrix[i] = new int[clusterCount];
- }
-
- Distance[][] distanceToIndexMatrix = new Distance[clusterCount][];
- for (int i = 0; i < clusterCount; i++) {
- distanceToIndexMatrix[i] = new Distance[clusterCount];
- for (int j = 0; j < clusterCount; j++) {
- distanceToIndexMatrix[i][j] = new Distance();
- }
- }
-
- int[] pixelCountSums = new int[clusterCount];
- for (int iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
- for (int i = 0; i < clusterCount; i++) {
- for (int j = i + 1; j < clusterCount; j++) {
- double distance = pointProvider.distance(clusters[i], clusters[j]);
- distanceToIndexMatrix[j][i].distance = distance;
- distanceToIndexMatrix[j][i].index = i;
- distanceToIndexMatrix[i][j].distance = distance;
- distanceToIndexMatrix[i][j].index = j;
- }
- Arrays.sort(distanceToIndexMatrix[i]);
- for (int j = 0; j < clusterCount; j++) {
- indexMatrix[i][j] = distanceToIndexMatrix[i][j].index;
- }
- }
-
- int pointsMoved = 0;
- for (int i = 0; i < pointCount; i++) {
- double[] point = points[i];
- int previousClusterIndex = clusterIndices[i];
- double[] previousCluster = clusters[previousClusterIndex];
- double previousDistance = pointProvider.distance(point, previousCluster);
-
- double minimumDistance = previousDistance;
- int newClusterIndex = -1;
- for (int j = 0; j < clusterCount; j++) {
- if (distanceToIndexMatrix[previousClusterIndex][j].distance
- >= 4 * previousDistance) {
- continue;
- }
- double distance = pointProvider.distance(point, clusters[j]);
- if (distance < minimumDistance) {
- minimumDistance = distance;
- newClusterIndex = j;
- }
- }
- if (newClusterIndex != -1) {
- double distanceChange =
- Math.abs(Math.sqrt(minimumDistance) - Math.sqrt(previousDistance));
- if (distanceChange > MIN_MOVEMENT_DISTANCE) {
- pointsMoved++;
- clusterIndices[i] = newClusterIndex;
- }
- }
- }
-
- if (pointsMoved == 0 && iteration != 0) {
- break;
- }
-
- double[] componentASums = new double[clusterCount];
- double[] componentBSums = new double[clusterCount];
- double[] componentCSums = new double[clusterCount];
- Arrays.fill(pixelCountSums, 0);
- for (int i = 0; i < pointCount; i++) {
- int clusterIndex = clusterIndices[i];
- double[] point = points[i];
- int count = counts[i];
- pixelCountSums[clusterIndex] += count;
- componentASums[clusterIndex] += (point[0] * count);
- componentBSums[clusterIndex] += (point[1] * count);
- componentCSums[clusterIndex] += (point[2] * count);
- }
-
- for (int i = 0; i < clusterCount; i++) {
- int count = pixelCountSums[i];
- if (count == 0) {
- clusters[i] = new double[]{0., 0., 0.};
- continue;
- }
- double a = componentASums[i] / count;
- double b = componentBSums[i] / count;
- double c = componentCSums[i] / count;
- clusters[i][0] = a;
- clusters[i][1] = b;
- clusters[i][2] = c;
- }
- }
-
- Map<Integer, Integer> argbToPopulation = new LinkedHashMap<>();
- for (int i = 0; i < clusterCount; i++) {
- int count = pixelCountSums[i];
- if (count == 0) {
- continue;
- }
-
- int possibleNewCluster = pointProvider.toInt(clusters[i]);
- if (argbToPopulation.containsKey(possibleNewCluster)) {
- continue;
- }
-
- argbToPopulation.put(possibleNewCluster, count);
- }
-
- return argbToPopulation;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWu.java b/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWu.java
deleted file mode 100644
index f788d4583529..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerWu.java
+++ /dev/null
@@ -1,407 +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.monet.quantize;
-
-import com.android.systemui.monet.utils.ColorUtils;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An image quantizer that divides the image's pixels into clusters by recursively cutting an RGB
- * cube, based on the weight of pixels in each area of the cube.
- *
- * <p>The algorithm was described by Xiaolin Wu in Graphic Gems II, published in 1991.
- */
-public final class QuantizerWu implements Quantizer {
- int[] weights;
- int[] momentsR;
- int[] momentsG;
- int[] momentsB;
- double[] moments;
- Box[] cubes;
-
- // A histogram of all the input colors is constructed. It has the shape of a
- // cube. The cube would be too large if it contained all 16 million colors:
- // historical best practice is to use 5 bits of the 8 in each channel,
- // reducing the histogram to a volume of ~32,000.
- private static final int INDEX_BITS = 5;
- private static final int INDEX_COUNT = 33; // ((1 << INDEX_BITS) + 1)
- private static final int TOTAL_SIZE = 35937; // INDEX_COUNT * INDEX_COUNT * INDEX_COUNT
-
- @Override
- public QuantizerResult quantize(int[] pixels, int colorCount) {
- QuantizerResult mapResult = new QuantizerMap().quantize(pixels, colorCount);
- constructHistogram(mapResult.colorToCount);
- createMoments();
- CreateBoxesResult createBoxesResult = createBoxes(colorCount);
- List<Integer> colors = createResult(createBoxesResult.resultCount);
- Map<Integer, Integer> resultMap = new LinkedHashMap<>();
- for (int color : colors) {
- resultMap.put(color, 0);
- }
- return new QuantizerResult(resultMap);
- }
-
- static int getIndex(int r, int g, int b) {
- return (r << (INDEX_BITS * 2)) + (r << (INDEX_BITS + 1)) + r + (g << INDEX_BITS) + g + b;
- }
-
- void constructHistogram(Map<Integer, Integer> pixels) {
- weights = new int[TOTAL_SIZE];
- momentsR = new int[TOTAL_SIZE];
- momentsG = new int[TOTAL_SIZE];
- momentsB = new int[TOTAL_SIZE];
- moments = new double[TOTAL_SIZE];
-
- for (Map.Entry<Integer, Integer> pair : pixels.entrySet()) {
- int pixel = pair.getKey();
- int count = pair.getValue();
- int red = ColorUtils.redFromArgb(pixel);
- int green = ColorUtils.greenFromArgb(pixel);
- int blue = ColorUtils.blueFromArgb(pixel);
- int bitsToRemove = 8 - INDEX_BITS;
- int iR = (red >> bitsToRemove) + 1;
- int iG = (green >> bitsToRemove) + 1;
- int iB = (blue >> bitsToRemove) + 1;
- int index = getIndex(iR, iG, iB);
- weights[index] += count;
- momentsR[index] += (red * count);
- momentsG[index] += (green * count);
- momentsB[index] += (blue * count);
- moments[index] += (count * ((red * red) + (green * green) + (blue * blue)));
- }
- }
-
- void createMoments() {
- for (int r = 1; r < INDEX_COUNT; ++r) {
- int[] area = new int[INDEX_COUNT];
- int[] areaR = new int[INDEX_COUNT];
- int[] areaG = new int[INDEX_COUNT];
- int[] areaB = new int[INDEX_COUNT];
- double[] area2 = new double[INDEX_COUNT];
-
- for (int g = 1; g < INDEX_COUNT; ++g) {
- int line = 0;
- int lineR = 0;
- int lineG = 0;
- int lineB = 0;
- double line2 = 0.0;
- for (int b = 1; b < INDEX_COUNT; ++b) {
- int index = getIndex(r, g, b);
- line += weights[index];
- lineR += momentsR[index];
- lineG += momentsG[index];
- lineB += momentsB[index];
- line2 += moments[index];
-
- area[b] += line;
- areaR[b] += lineR;
- areaG[b] += lineG;
- areaB[b] += lineB;
- area2[b] += line2;
-
- int previousIndex = getIndex(r - 1, g, b);
- weights[index] = weights[previousIndex] + area[b];
- momentsR[index] = momentsR[previousIndex] + areaR[b];
- momentsG[index] = momentsG[previousIndex] + areaG[b];
- momentsB[index] = momentsB[previousIndex] + areaB[b];
- moments[index] = moments[previousIndex] + area2[b];
- }
- }
- }
- }
-
- CreateBoxesResult createBoxes(int maxColorCount) {
- cubes = new Box[maxColorCount];
- for (int i = 0; i < maxColorCount; i++) {
- cubes[i] = new Box();
- }
- double[] volumeVariance = new double[maxColorCount];
- Box firstBox = cubes[0];
- firstBox.r1 = INDEX_COUNT - 1;
- firstBox.g1 = INDEX_COUNT - 1;
- firstBox.b1 = INDEX_COUNT - 1;
-
- int generatedColorCount = maxColorCount;
- int next = 0;
- for (int i = 1; i < maxColorCount; i++) {
- if (cut(cubes[next], cubes[i])) {
- volumeVariance[next] = (cubes[next].vol > 1) ? variance(cubes[next]) : 0.0;
- volumeVariance[i] = (cubes[i].vol > 1) ? variance(cubes[i]) : 0.0;
- } else {
- volumeVariance[next] = 0.0;
- i--;
- }
-
- next = 0;
-
- double temp = volumeVariance[0];
- for (int j = 1; j <= i; j++) {
- if (volumeVariance[j] > temp) {
- temp = volumeVariance[j];
- next = j;
- }
- }
- if (temp <= 0.0) {
- generatedColorCount = i + 1;
- break;
- }
- }
-
- return new CreateBoxesResult(maxColorCount, generatedColorCount);
- }
-
- List<Integer> createResult(int colorCount) {
- List<Integer> colors = new ArrayList<>();
- for (int i = 0; i < colorCount; ++i) {
- Box cube = cubes[i];
- int weight = volume(cube, weights);
- if (weight > 0) {
- int r = volume(cube, momentsR) / weight;
- int g = volume(cube, momentsG) / weight;
- int b = volume(cube, momentsB) / weight;
- int color = (255 << 24) | ((r & 0x0ff) << 16) | ((g & 0x0ff) << 8) | (b & 0x0ff);
- colors.add(color);
- }
- }
- return colors;
- }
-
- double variance(Box cube) {
- int dr = volume(cube, momentsR);
- int dg = volume(cube, momentsG);
- int db = volume(cube, momentsB);
- double xx =
- moments[getIndex(cube.r1, cube.g1, cube.b1)]
- - moments[getIndex(cube.r1, cube.g1, cube.b0)]
- - moments[getIndex(cube.r1, cube.g0, cube.b1)]
- + moments[getIndex(cube.r1, cube.g0, cube.b0)]
- - moments[getIndex(cube.r0, cube.g1, cube.b1)]
- + moments[getIndex(cube.r0, cube.g1, cube.b0)]
- + moments[getIndex(cube.r0, cube.g0, cube.b1)]
- - moments[getIndex(cube.r0, cube.g0, cube.b0)];
-
- int hypotenuse = dr * dr + dg * dg + db * db;
- int volume = volume(cube, weights);
- return xx - hypotenuse / ((double) volume);
- }
-
- Boolean cut(Box one, Box two) {
- int wholeR = volume(one, momentsR);
- int wholeG = volume(one, momentsG);
- int wholeB = volume(one, momentsB);
- int wholeW = volume(one, weights);
-
- MaximizeResult maxRResult =
- maximize(one, Direction.RED, one.r0 + 1, one.r1, wholeR, wholeG, wholeB, wholeW);
- MaximizeResult maxGResult =
- maximize(one, Direction.GREEN, one.g0 + 1, one.g1, wholeR, wholeG, wholeB, wholeW);
- MaximizeResult maxBResult =
- maximize(one, Direction.BLUE, one.b0 + 1, one.b1, wholeR, wholeG, wholeB, wholeW);
- Direction cutDirection;
- double maxR = maxRResult.maximum;
- double maxG = maxGResult.maximum;
- double maxB = maxBResult.maximum;
- if (maxR >= maxG && maxR >= maxB) {
- if (maxRResult.cutLocation < 0) {
- return false;
- }
- cutDirection = Direction.RED;
- } else if (maxG >= maxR && maxG >= maxB) {
- cutDirection = Direction.GREEN;
- } else {
- cutDirection = Direction.BLUE;
- }
-
- two.r1 = one.r1;
- two.g1 = one.g1;
- two.b1 = one.b1;
-
- switch (cutDirection) {
- case RED:
- one.r1 = maxRResult.cutLocation;
- two.r0 = one.r1;
- two.g0 = one.g0;
- two.b0 = one.b0;
- break;
- case GREEN:
- one.g1 = maxGResult.cutLocation;
- two.r0 = one.r0;
- two.g0 = one.g1;
- two.b0 = one.b0;
- break;
- case BLUE:
- one.b1 = maxBResult.cutLocation;
- two.r0 = one.r0;
- two.g0 = one.g0;
- two.b0 = one.b1;
- break;
- }
-
- one.vol = (one.r1 - one.r0) * (one.g1 - one.g0) * (one.b1 - one.b0);
- two.vol = (two.r1 - two.r0) * (two.g1 - two.g0) * (two.b1 - two.b0);
-
- return true;
- }
-
- MaximizeResult maximize(
- Box cube,
- Direction direction,
- int first,
- int last,
- int wholeR,
- int wholeG,
- int wholeB,
- int wholeW) {
- int bottomR = bottom(cube, direction, momentsR);
- int bottomG = bottom(cube, direction, momentsG);
- int bottomB = bottom(cube, direction, momentsB);
- int bottomW = bottom(cube, direction, weights);
-
- double max = 0.0;
- int cut = -1;
-
- int halfR = 0;
- int halfG = 0;
- int halfB = 0;
- int halfW = 0;
- for (int i = first; i < last; i++) {
- halfR = bottomR + top(cube, direction, i, momentsR);
- halfG = bottomG + top(cube, direction, i, momentsG);
- halfB = bottomB + top(cube, direction, i, momentsB);
- halfW = bottomW + top(cube, direction, i, weights);
- if (halfW == 0) {
- continue;
- }
-
- double tempNumerator = halfR * halfR + halfG * halfG + halfB * halfB;
- double tempDenominator = halfW;
- double temp = tempNumerator / tempDenominator;
-
- halfR = wholeR - halfR;
- halfG = wholeG - halfG;
- halfB = wholeB - halfB;
- halfW = wholeW - halfW;
- if (halfW == 0) {
- continue;
- }
-
- tempNumerator = halfR * halfR + halfG * halfG + halfB * halfB;
- tempDenominator = halfW;
- temp += (tempNumerator / tempDenominator);
-
- if (temp > max) {
- max = temp;
- cut = i;
- }
- }
- return new MaximizeResult(cut, max);
- }
-
- static int volume(Box cube, int[] moment) {
- return (moment[getIndex(cube.r1, cube.g1, cube.b1)]
- - moment[getIndex(cube.r1, cube.g1, cube.b0)]
- - moment[getIndex(cube.r1, cube.g0, cube.b1)]
- + moment[getIndex(cube.r1, cube.g0, cube.b0)]
- - moment[getIndex(cube.r0, cube.g1, cube.b1)]
- + moment[getIndex(cube.r0, cube.g1, cube.b0)]
- + moment[getIndex(cube.r0, cube.g0, cube.b1)]
- - moment[getIndex(cube.r0, cube.g0, cube.b0)]);
- }
-
- static int bottom(Box cube, Direction direction, int[] moment) {
- switch (direction) {
- case RED:
- return -moment[getIndex(cube.r0, cube.g1, cube.b1)]
- + moment[getIndex(cube.r0, cube.g1, cube.b0)]
- + moment[getIndex(cube.r0, cube.g0, cube.b1)]
- - moment[getIndex(cube.r0, cube.g0, cube.b0)];
- case GREEN:
- return -moment[getIndex(cube.r1, cube.g0, cube.b1)]
- + moment[getIndex(cube.r1, cube.g0, cube.b0)]
- + moment[getIndex(cube.r0, cube.g0, cube.b1)]
- - moment[getIndex(cube.r0, cube.g0, cube.b0)];
- case BLUE:
- return -moment[getIndex(cube.r1, cube.g1, cube.b0)]
- + moment[getIndex(cube.r1, cube.g0, cube.b0)]
- + moment[getIndex(cube.r0, cube.g1, cube.b0)]
- - moment[getIndex(cube.r0, cube.g0, cube.b0)];
- }
- throw new IllegalArgumentException("unexpected direction " + direction);
- }
-
- static int top(Box cube, Direction direction, int position, int[] moment) {
- switch (direction) {
- case RED:
- return (moment[getIndex(position, cube.g1, cube.b1)]
- - moment[getIndex(position, cube.g1, cube.b0)]
- - moment[getIndex(position, cube.g0, cube.b1)]
- + moment[getIndex(position, cube.g0, cube.b0)]);
- case GREEN:
- return (moment[getIndex(cube.r1, position, cube.b1)]
- - moment[getIndex(cube.r1, position, cube.b0)]
- - moment[getIndex(cube.r0, position, cube.b1)]
- + moment[getIndex(cube.r0, position, cube.b0)]);
- case BLUE:
- return (moment[getIndex(cube.r1, cube.g1, position)]
- - moment[getIndex(cube.r1, cube.g0, position)]
- - moment[getIndex(cube.r0, cube.g1, position)]
- + moment[getIndex(cube.r0, cube.g0, position)]);
- }
- throw new IllegalArgumentException("unexpected direction " + direction);
- }
-
- private enum Direction {
- RED,
- GREEN,
- BLUE
- }
-
- private static final class MaximizeResult {
- // < 0 if cut impossible
- int cutLocation;
- double maximum;
-
- MaximizeResult(int cut, double max) {
- this.cutLocation = cut;
- this.maximum = max;
- }
- }
-
- private static final class CreateBoxesResult {
- int requestedCount;
- int resultCount;
-
- CreateBoxesResult(int requestedCount, int resultCount) {
- this.requestedCount = requestedCount;
- this.resultCount = resultCount;
- }
- }
-
- private static final class Box {
- int r0 = 0;
- int r1 = 0;
- int g0 = 0;
- int g1 = 0;
- int b0 = 0;
- int b1 = 0;
- int vol = 0;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/DynamicScheme.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/DynamicScheme.java
deleted file mode 100644
index e1cbfb123a4a..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/DynamicScheme.java
+++ /dev/null
@@ -1,93 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.utils.MathUtils;
-
-/**
- * Provides important settings for creating colors dynamically, and 6 color palettes. Requires: 1. A
- * color. (source color) 2. A theme. (Variant) 3. Whether or not its dark mode. 4. Contrast level.
- * (-1 to 1, currently contrast ratio 3.0 and 7.0)
- */
-public class DynamicScheme {
- public final int sourceColorArgb;
- public final Hct sourceColorHct;
- public final Variant variant;
- public final boolean isDark;
- public final double contrastLevel;
-
- public final TonalPalette primaryPalette;
- public final TonalPalette secondaryPalette;
- public final TonalPalette tertiaryPalette;
- public final TonalPalette neutralPalette;
- public final TonalPalette neutralVariantPalette;
- public final TonalPalette errorPalette;
-
- public DynamicScheme(
- Hct sourceColorHct,
- Variant variant,
- boolean isDark,
- double contrastLevel,
- TonalPalette primaryPalette,
- TonalPalette secondaryPalette,
- TonalPalette tertiaryPalette,
- TonalPalette neutralPalette,
- TonalPalette neutralVariantPalette) {
- this.sourceColorArgb = sourceColorHct.toInt();
- this.sourceColorHct = sourceColorHct;
- this.variant = variant;
- this.isDark = isDark;
- this.contrastLevel = contrastLevel;
-
- this.primaryPalette = primaryPalette;
- this.secondaryPalette = secondaryPalette;
- this.tertiaryPalette = tertiaryPalette;
- this.neutralPalette = neutralPalette;
- this.neutralVariantPalette = neutralVariantPalette;
- this.errorPalette = TonalPalette.fromHueAndChroma(25.0, 84.0);
- }
-
- /**
- * Given a set of hues and set of hue rotations, locate which hues the source color's hue is
- * between, apply the rotation at the same index as the first hue in the range, and return the
- * rotated hue.
- *
- * @param sourceColorHct The color whose hue should be rotated.
- * @param hues A set of hues.
- * @param rotations A set of hue rotations.
- * @return Color's hue with a rotation applied.
- */
- public static double getRotatedHue(Hct sourceColorHct, double[] hues, double[] rotations) {
- final double sourceHue = sourceColorHct.getHue();
- if (rotations.length == 1) {
- return MathUtils.sanitizeDegreesDouble(sourceHue + rotations[0]);
- }
- final int size = hues.length;
- for (int i = 0; i <= (size - 2); i++) {
- final double thisHue = hues[i];
- final double nextHue = hues[i + 1];
- if (thisHue < sourceHue && sourceHue < nextHue) {
- return MathUtils.sanitizeDegreesDouble(sourceHue + rotations[i]);
- }
- }
- // If this statement executes, something is wrong, there should have been a rotation
- // found using the arrays.
- return sourceHue;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Scheme.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Scheme.java
deleted file mode 100644
index fa736cc88e29..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Scheme.java
+++ /dev/null
@@ -1,784 +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.monet.scheme;
-
-import com.android.systemui.monet.palettes.CorePalette;
-
-/** Represents a Material color scheme, a mapping of color roles to colors. */
-public class Scheme {
- private int primary;
- private int onPrimary;
- private int primaryContainer;
- private int onPrimaryContainer;
- private int secondary;
- private int onSecondary;
- private int secondaryContainer;
- private int onSecondaryContainer;
- private int tertiary;
- private int onTertiary;
- private int tertiaryContainer;
- private int onTertiaryContainer;
- private int error;
- private int onError;
- private int errorContainer;
- private int onErrorContainer;
- private int background;
- private int onBackground;
- private int surface;
- private int onSurface;
- private int surfaceVariant;
- private int onSurfaceVariant;
- private int outline;
- private int outlineVariant;
- private int shadow;
- private int scrim;
- private int inverseSurface;
- private int inverseOnSurface;
- private int inversePrimary;
-
- public Scheme() {
- }
-
- public Scheme(
- int primary,
- int onPrimary,
- int primaryContainer,
- int onPrimaryContainer,
- int secondary,
- int onSecondary,
- int secondaryContainer,
- int onSecondaryContainer,
- int tertiary,
- int onTertiary,
- int tertiaryContainer,
- int onTertiaryContainer,
- int error,
- int onError,
- int errorContainer,
- int onErrorContainer,
- int background,
- int onBackground,
- int surface,
- int onSurface,
- int surfaceVariant,
- int onSurfaceVariant,
- int outline,
- int outlineVariant,
- int shadow,
- int scrim,
- int inverseSurface,
- int inverseOnSurface,
- int inversePrimary) {
- super();
- this.primary = primary;
- this.onPrimary = onPrimary;
- this.primaryContainer = primaryContainer;
- this.onPrimaryContainer = onPrimaryContainer;
- this.secondary = secondary;
- this.onSecondary = onSecondary;
- this.secondaryContainer = secondaryContainer;
- this.onSecondaryContainer = onSecondaryContainer;
- this.tertiary = tertiary;
- this.onTertiary = onTertiary;
- this.tertiaryContainer = tertiaryContainer;
- this.onTertiaryContainer = onTertiaryContainer;
- this.error = error;
- this.onError = onError;
- this.errorContainer = errorContainer;
- this.onErrorContainer = onErrorContainer;
- this.background = background;
- this.onBackground = onBackground;
- this.surface = surface;
- this.onSurface = onSurface;
- this.surfaceVariant = surfaceVariant;
- this.onSurfaceVariant = onSurfaceVariant;
- this.outline = outline;
- this.outlineVariant = outlineVariant;
- this.shadow = shadow;
- this.scrim = scrim;
- this.inverseSurface = inverseSurface;
- this.inverseOnSurface = inverseOnSurface;
- this.inversePrimary = inversePrimary;
- }
-
- /** Create a light theme Scheme from a source color in ARGB, i.e. a hex code. */
- public static Scheme light(int argb) {
- return lightFromCorePalette(CorePalette.of(argb));
- }
-
- /** Create a dark theme Scheme from a source color in ARGB, i.e. a hex code. */
- public static Scheme dark(int argb) {
- return darkFromCorePalette(CorePalette.of(argb));
- }
-
- /** Create a light theme content-based Scheme from a source color in ARGB, i.e. a hex code. */
- public static Scheme lightContent(int argb) {
- return lightFromCorePalette(CorePalette.contentOf(argb));
- }
-
- /** Create a dark theme content-based Scheme from a source color in ARGB, i.e. a hex code. */
- public static Scheme darkContent(int argb) {
- return darkFromCorePalette(CorePalette.contentOf(argb));
- }
-
- private static Scheme lightFromCorePalette(CorePalette core) {
- return new Scheme()
- .withPrimary(core.a1.tone(40))
- .withOnPrimary(core.a1.tone(100))
- .withPrimaryContainer(core.a1.tone(90))
- .withOnPrimaryContainer(core.a1.tone(10))
- .withSecondary(core.a2.tone(40))
- .withOnSecondary(core.a2.tone(100))
- .withSecondaryContainer(core.a2.tone(90))
- .withOnSecondaryContainer(core.a2.tone(10))
- .withTertiary(core.a3.tone(40))
- .withOnTertiary(core.a3.tone(100))
- .withTertiaryContainer(core.a3.tone(90))
- .withOnTertiaryContainer(core.a3.tone(10))
- .withError(core.error.tone(40))
- .withOnError(core.error.tone(100))
- .withErrorContainer(core.error.tone(90))
- .withOnErrorContainer(core.error.tone(10))
- .withBackground(core.n1.tone(99))
- .withOnBackground(core.n1.tone(10))
- .withSurface(core.n1.tone(99))
- .withOnSurface(core.n1.tone(10))
- .withSurfaceVariant(core.n2.tone(90))
- .withOnSurfaceVariant(core.n2.tone(30))
- .withOutline(core.n2.tone(50))
- .withOutlineVariant(core.n2.tone(80))
- .withShadow(core.n1.tone(0))
- .withScrim(core.n1.tone(0))
- .withInverseSurface(core.n1.tone(20))
- .withInverseOnSurface(core.n1.tone(95))
- .withInversePrimary(core.a1.tone(80));
- }
-
- private static Scheme darkFromCorePalette(CorePalette core) {
- return new Scheme()
- .withPrimary(core.a1.tone(80))
- .withOnPrimary(core.a1.tone(20))
- .withPrimaryContainer(core.a1.tone(30))
- .withOnPrimaryContainer(core.a1.tone(90))
- .withSecondary(core.a2.tone(80))
- .withOnSecondary(core.a2.tone(20))
- .withSecondaryContainer(core.a2.tone(30))
- .withOnSecondaryContainer(core.a2.tone(90))
- .withTertiary(core.a3.tone(80))
- .withOnTertiary(core.a3.tone(20))
- .withTertiaryContainer(core.a3.tone(30))
- .withOnTertiaryContainer(core.a3.tone(90))
- .withError(core.error.tone(80))
- .withOnError(core.error.tone(20))
- .withErrorContainer(core.error.tone(30))
- .withOnErrorContainer(core.error.tone(80))
- .withBackground(core.n1.tone(10))
- .withOnBackground(core.n1.tone(90))
- .withSurface(core.n1.tone(10))
- .withOnSurface(core.n1.tone(90))
- .withSurfaceVariant(core.n2.tone(30))
- .withOnSurfaceVariant(core.n2.tone(80))
- .withOutline(core.n2.tone(60))
- .withOutlineVariant(core.n2.tone(30))
- .withShadow(core.n1.tone(0))
- .withScrim(core.n1.tone(0))
- .withInverseSurface(core.n1.tone(90))
- .withInverseOnSurface(core.n1.tone(20))
- .withInversePrimary(core.a1.tone(40));
- }
-
- public int getPrimary() {
- return primary;
- }
-
- public void setPrimary(int primary) {
- this.primary = primary;
- }
-
- public Scheme withPrimary(int primary) {
- this.primary = primary;
- return this;
- }
-
- public int getOnPrimary() {
- return onPrimary;
- }
-
- public void setOnPrimary(int onPrimary) {
- this.onPrimary = onPrimary;
- }
-
- public Scheme withOnPrimary(int onPrimary) {
- this.onPrimary = onPrimary;
- return this;
- }
-
- public int getPrimaryContainer() {
- return primaryContainer;
- }
-
- public void setPrimaryContainer(int primaryContainer) {
- this.primaryContainer = primaryContainer;
- }
-
- public Scheme withPrimaryContainer(int primaryContainer) {
- this.primaryContainer = primaryContainer;
- return this;
- }
-
- public int getOnPrimaryContainer() {
- return onPrimaryContainer;
- }
-
- public void setOnPrimaryContainer(int onPrimaryContainer) {
- this.onPrimaryContainer = onPrimaryContainer;
- }
-
- public Scheme withOnPrimaryContainer(int onPrimaryContainer) {
- this.onPrimaryContainer = onPrimaryContainer;
- return this;
- }
-
- public int getSecondary() {
- return secondary;
- }
-
- public void setSecondary(int secondary) {
- this.secondary = secondary;
- }
-
- public Scheme withSecondary(int secondary) {
- this.secondary = secondary;
- return this;
- }
-
- public int getOnSecondary() {
- return onSecondary;
- }
-
- public void setOnSecondary(int onSecondary) {
- this.onSecondary = onSecondary;
- }
-
- public Scheme withOnSecondary(int onSecondary) {
- this.onSecondary = onSecondary;
- return this;
- }
-
- public int getSecondaryContainer() {
- return secondaryContainer;
- }
-
- public void setSecondaryContainer(int secondaryContainer) {
- this.secondaryContainer = secondaryContainer;
- }
-
- public Scheme withSecondaryContainer(int secondaryContainer) {
- this.secondaryContainer = secondaryContainer;
- return this;
- }
-
- public int getOnSecondaryContainer() {
- return onSecondaryContainer;
- }
-
- public void setOnSecondaryContainer(int onSecondaryContainer) {
- this.onSecondaryContainer = onSecondaryContainer;
- }
-
- public Scheme withOnSecondaryContainer(int onSecondaryContainer) {
- this.onSecondaryContainer = onSecondaryContainer;
- return this;
- }
-
- public int getTertiary() {
- return tertiary;
- }
-
- public void setTertiary(int tertiary) {
- this.tertiary = tertiary;
- }
-
- public Scheme withTertiary(int tertiary) {
- this.tertiary = tertiary;
- return this;
- }
-
- public int getOnTertiary() {
- return onTertiary;
- }
-
- public void setOnTertiary(int onTertiary) {
- this.onTertiary = onTertiary;
- }
-
- public Scheme withOnTertiary(int onTertiary) {
- this.onTertiary = onTertiary;
- return this;
- }
-
- public int getTertiaryContainer() {
- return tertiaryContainer;
- }
-
- public void setTertiaryContainer(int tertiaryContainer) {
- this.tertiaryContainer = tertiaryContainer;
- }
-
- public Scheme withTertiaryContainer(int tertiaryContainer) {
- this.tertiaryContainer = tertiaryContainer;
- return this;
- }
-
- public int getOnTertiaryContainer() {
- return onTertiaryContainer;
- }
-
- public void setOnTertiaryContainer(int onTertiaryContainer) {
- this.onTertiaryContainer = onTertiaryContainer;
- }
-
- public Scheme withOnTertiaryContainer(int onTertiaryContainer) {
- this.onTertiaryContainer = onTertiaryContainer;
- return this;
- }
-
- public int getError() {
- return error;
- }
-
- public void setError(int error) {
- this.error = error;
- }
-
- public Scheme withError(int error) {
- this.error = error;
- return this;
- }
-
- public int getOnError() {
- return onError;
- }
-
- public void setOnError(int onError) {
- this.onError = onError;
- }
-
- public Scheme withOnError(int onError) {
- this.onError = onError;
- return this;
- }
-
- public int getErrorContainer() {
- return errorContainer;
- }
-
- public void setErrorContainer(int errorContainer) {
- this.errorContainer = errorContainer;
- }
-
- public Scheme withErrorContainer(int errorContainer) {
- this.errorContainer = errorContainer;
- return this;
- }
-
- public int getOnErrorContainer() {
- return onErrorContainer;
- }
-
- public void setOnErrorContainer(int onErrorContainer) {
- this.onErrorContainer = onErrorContainer;
- }
-
- public Scheme withOnErrorContainer(int onErrorContainer) {
- this.onErrorContainer = onErrorContainer;
- return this;
- }
-
- public int getBackground() {
- return background;
- }
-
- public void setBackground(int background) {
- this.background = background;
- }
-
- public Scheme withBackground(int background) {
- this.background = background;
- return this;
- }
-
- public int getOnBackground() {
- return onBackground;
- }
-
- public void setOnBackground(int onBackground) {
- this.onBackground = onBackground;
- }
-
- public Scheme withOnBackground(int onBackground) {
- this.onBackground = onBackground;
- return this;
- }
-
- public int getSurface() {
- return surface;
- }
-
- public void setSurface(int surface) {
- this.surface = surface;
- }
-
- public Scheme withSurface(int surface) {
- this.surface = surface;
- return this;
- }
-
- public int getOnSurface() {
- return onSurface;
- }
-
- public void setOnSurface(int onSurface) {
- this.onSurface = onSurface;
- }
-
- public Scheme withOnSurface(int onSurface) {
- this.onSurface = onSurface;
- return this;
- }
-
- public int getSurfaceVariant() {
- return surfaceVariant;
- }
-
- public void setSurfaceVariant(int surfaceVariant) {
- this.surfaceVariant = surfaceVariant;
- }
-
- public Scheme withSurfaceVariant(int surfaceVariant) {
- this.surfaceVariant = surfaceVariant;
- return this;
- }
-
- public int getOnSurfaceVariant() {
- return onSurfaceVariant;
- }
-
- public void setOnSurfaceVariant(int onSurfaceVariant) {
- this.onSurfaceVariant = onSurfaceVariant;
- }
-
- public Scheme withOnSurfaceVariant(int onSurfaceVariant) {
- this.onSurfaceVariant = onSurfaceVariant;
- return this;
- }
-
- public int getOutline() {
- return outline;
- }
-
- public void setOutline(int outline) {
- this.outline = outline;
- }
-
- public Scheme withOutline(int outline) {
- this.outline = outline;
- return this;
- }
-
- public int getOutlineVariant() {
- return outlineVariant;
- }
-
- public void setOutlineVariant(int outlineVariant) {
- this.outlineVariant = outlineVariant;
- }
-
- public Scheme withOutlineVariant(int outlineVariant) {
- this.outlineVariant = outlineVariant;
- return this;
- }
-
- public int getShadow() {
- return shadow;
- }
-
- public void setShadow(int shadow) {
- this.shadow = shadow;
- }
-
- public Scheme withShadow(int shadow) {
- this.shadow = shadow;
- return this;
- }
-
- public int getScrim() {
- return scrim;
- }
-
- public void setScrim(int scrim) {
- this.scrim = scrim;
- }
-
- public Scheme withScrim(int scrim) {
- this.scrim = scrim;
- return this;
- }
-
- public int getInverseSurface() {
- return inverseSurface;
- }
-
- public void setInverseSurface(int inverseSurface) {
- this.inverseSurface = inverseSurface;
- }
-
- public Scheme withInverseSurface(int inverseSurface) {
- this.inverseSurface = inverseSurface;
- return this;
- }
-
- public int getInverseOnSurface() {
- return inverseOnSurface;
- }
-
- public void setInverseOnSurface(int inverseOnSurface) {
- this.inverseOnSurface = inverseOnSurface;
- }
-
- public Scheme withInverseOnSurface(int inverseOnSurface) {
- this.inverseOnSurface = inverseOnSurface;
- return this;
- }
-
- public int getInversePrimary() {
- return inversePrimary;
- }
-
- public void setInversePrimary(int inversePrimary) {
- this.inversePrimary = inversePrimary;
- }
-
- public Scheme withInversePrimary(int inversePrimary) {
- this.inversePrimary = inversePrimary;
- return this;
- }
-
- @Override
- public String toString() {
- return "Scheme{"
- + "primary="
- + primary
- + ", onPrimary="
- + onPrimary
- + ", primaryContainer="
- + primaryContainer
- + ", onPrimaryContainer="
- + onPrimaryContainer
- + ", secondary="
- + secondary
- + ", onSecondary="
- + onSecondary
- + ", secondaryContainer="
- + secondaryContainer
- + ", onSecondaryContainer="
- + onSecondaryContainer
- + ", tertiary="
- + tertiary
- + ", onTertiary="
- + onTertiary
- + ", tertiaryContainer="
- + tertiaryContainer
- + ", onTertiaryContainer="
- + onTertiaryContainer
- + ", error="
- + error
- + ", onError="
- + onError
- + ", errorContainer="
- + errorContainer
- + ", onErrorContainer="
- + onErrorContainer
- + ", background="
- + background
- + ", onBackground="
- + onBackground
- + ", surface="
- + surface
- + ", onSurface="
- + onSurface
- + ", surfaceVariant="
- + surfaceVariant
- + ", onSurfaceVariant="
- + onSurfaceVariant
- + ", outline="
- + outline
- + ", outlineVariant="
- + outlineVariant
- + ", shadow="
- + shadow
- + ", scrim="
- + scrim
- + ", inverseSurface="
- + inverseSurface
- + ", inverseOnSurface="
- + inverseOnSurface
- + ", inversePrimary="
- + inversePrimary
- + '}';
- }
-
- @Override
- public boolean equals(Object object) {
- if (this == object) {
- return true;
- }
- if (!(object instanceof Scheme)) {
- return false;
- }
- if (!super.equals(object)) {
- return false;
- }
-
- Scheme scheme = (Scheme) object;
-
- if (primary != scheme.primary) {
- return false;
- }
- if (onPrimary != scheme.onPrimary) {
- return false;
- }
- if (primaryContainer != scheme.primaryContainer) {
- return false;
- }
- if (onPrimaryContainer != scheme.onPrimaryContainer) {
- return false;
- }
- if (secondary != scheme.secondary) {
- return false;
- }
- if (onSecondary != scheme.onSecondary) {
- return false;
- }
- if (secondaryContainer != scheme.secondaryContainer) {
- return false;
- }
- if (onSecondaryContainer != scheme.onSecondaryContainer) {
- return false;
- }
- if (tertiary != scheme.tertiary) {
- return false;
- }
- if (onTertiary != scheme.onTertiary) {
- return false;
- }
- if (tertiaryContainer != scheme.tertiaryContainer) {
- return false;
- }
- if (onTertiaryContainer != scheme.onTertiaryContainer) {
- return false;
- }
- if (error != scheme.error) {
- return false;
- }
- if (onError != scheme.onError) {
- return false;
- }
- if (errorContainer != scheme.errorContainer) {
- return false;
- }
- if (onErrorContainer != scheme.onErrorContainer) {
- return false;
- }
- if (background != scheme.background) {
- return false;
- }
- if (onBackground != scheme.onBackground) {
- return false;
- }
- if (surface != scheme.surface) {
- return false;
- }
- if (onSurface != scheme.onSurface) {
- return false;
- }
- if (surfaceVariant != scheme.surfaceVariant) {
- return false;
- }
- if (onSurfaceVariant != scheme.onSurfaceVariant) {
- return false;
- }
- if (outline != scheme.outline) {
- return false;
- }
- if (outlineVariant != scheme.outlineVariant) {
- return false;
- }
- if (shadow != scheme.shadow) {
- return false;
- }
- if (scrim != scheme.scrim) {
- return false;
- }
- if (inverseSurface != scheme.inverseSurface) {
- return false;
- }
- if (inverseOnSurface != scheme.inverseOnSurface) {
- return false;
- }
- if (inversePrimary != scheme.inversePrimary) {
- return false;
- }
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = super.hashCode();
- result = 31 * result + primary;
- result = 31 * result + onPrimary;
- result = 31 * result + primaryContainer;
- result = 31 * result + onPrimaryContainer;
- result = 31 * result + secondary;
- result = 31 * result + onSecondary;
- result = 31 * result + secondaryContainer;
- result = 31 * result + onSecondaryContainer;
- result = 31 * result + tertiary;
- result = 31 * result + onTertiary;
- result = 31 * result + tertiaryContainer;
- result = 31 * result + onTertiaryContainer;
- result = 31 * result + error;
- result = 31 * result + onError;
- result = 31 * result + errorContainer;
- result = 31 * result + onErrorContainer;
- result = 31 * result + background;
- result = 31 * result + onBackground;
- result = 31 * result + surface;
- result = 31 * result + onSurface;
- result = 31 * result + surfaceVariant;
- result = 31 * result + onSurfaceVariant;
- result = 31 * result + outline;
- result = 31 * result + outlineVariant;
- result = 31 * result + shadow;
- result = 31 * result + scrim;
- result = 31 * result + inverseSurface;
- result = 31 * result + inverseOnSurface;
- result = 31 * result + inversePrimary;
- return result;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeContent.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeContent.java
deleted file mode 100644
index 4c3c07c51240..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeContent.java
+++ /dev/null
@@ -1,59 +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.monet.scheme;
-
-import static java.lang.Math.max;
-
-import com.android.systemui.monet.dislike.DislikeAnalyzer;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.temperature.TemperatureCache;
-
-/**
- * A scheme that places the source color in Scheme.primaryContainer.
- *
- * <p>Primary Container is the source color, adjusted for color relativity. It maintains constant
- * appearance in light mode and dark mode. This adds ~5 tone in light mode, and subtracts ~5 tone in
- * dark mode.
- *
- * <p>Tertiary Container is an analogous color, specifically, the analog of a color wheel divided
- * into 6, and the precise analog is the one found by increasing hue. This is a scientifically
- * grounded equivalent to rotating hue clockwise by 60 degrees. It also maintains constant
- * appearance.
- */
-public class SchemeContent extends DynamicScheme {
- public SchemeContent(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.CONTENT,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), sourceColorHct.getChroma()),
- TonalPalette.fromHueAndChroma(
- sourceColorHct.getHue(),
- max(sourceColorHct.getChroma() - 32.0, sourceColorHct.getChroma() * 0.5)),
- TonalPalette.fromHct(
- DislikeAnalyzer.fixIfDisliked(
- new TemperatureCache(sourceColorHct)
- .getAnalogousColors(/* count= */ 3, /* divisions= */ 6)
- .get(2))),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(),
- sourceColorHct.getChroma() / 8.0),
- TonalPalette.fromHueAndChroma(
- sourceColorHct.getHue(), (sourceColorHct.getChroma() / 8.0) + 4.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeExpressive.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeExpressive.java
deleted file mode 100644
index 234826e2fcde..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeExpressive.java
+++ /dev/null
@@ -1,49 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** A playful theme - the source color's hue does not appear in the theme. */
-public class SchemeExpressive extends DynamicScheme {
- // NOMUTANTS--arbitrary increments/decrements, correctly, still passes tests.
- private static final double[] HUES = {0, 21, 51, 121, 151, 191, 271, 321, 360};
- private static final double[] SECONDARY_ROTATIONS = {45, 95, 45, 20, 45, 90, 45, 45, 45};
- private static final double[] TERTIARY_ROTATIONS = {120, 120, 20, 45, 20, 15, 20, 120, 120};
-
- public SchemeExpressive(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.EXPRESSIVE,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 240.0), 40.0),
- TonalPalette.fromHueAndChroma(
- DynamicScheme.getRotatedHue(sourceColorHct, HUES, SECONDARY_ROTATIONS),
- 24.0),
- TonalPalette.fromHueAndChroma(
- DynamicScheme.getRotatedHue(sourceColorHct, HUES, TERTIARY_ROTATIONS),
- 32.0),
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 15.0), 8.0),
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 15.0), 12.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFidelity.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFidelity.java
deleted file mode 100644
index dfbf56d4e5ef..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFidelity.java
+++ /dev/null
@@ -1,54 +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.monet.scheme;
-
-import com.android.systemui.monet.dislike.DislikeAnalyzer;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.temperature.TemperatureCache;
-
-/**
- * A scheme that places the source color in Scheme.primaryContainer.
- *
- * <p>Primary Container is the source color, adjusted for color relativity. It maintains constant
- * appearance in light mode and dark mode. This adds ~5 tone in light mode, and subtracts ~5 tone in
- * dark mode.
- *
- * <p>Tertiary Container is the complement to the source color, using TemperatureCache. It also
- * maintains constant appearance.
- */
-public class SchemeFidelity extends DynamicScheme {
- public SchemeFidelity(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.FIDELITY,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), sourceColorHct.getChroma()),
- TonalPalette.fromHueAndChroma(
- sourceColorHct.getHue(),
- Math.max(sourceColorHct.getChroma() - 32.0,
- sourceColorHct.getChroma() * 0.5)),
- TonalPalette.fromHct(
- DislikeAnalyzer.fixIfDisliked(
- new TemperatureCache(sourceColorHct).getComplement())),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(),
- sourceColorHct.getChroma() / 8.0),
- TonalPalette.fromHueAndChroma(
- sourceColorHct.getHue(), (sourceColorHct.getChroma() / 8.0) + 4.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFruitSalad.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFruitSalad.java
deleted file mode 100644
index aa2c979bf854..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeFruitSalad.java
+++ /dev/null
@@ -1,39 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** A playful theme - the source color's hue does not appear in the theme. */
-public class SchemeFruitSalad extends DynamicScheme {
- public SchemeFruitSalad(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.FRUIT_SALAD,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() - 50.0), 48.0),
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() - 50.0), 36.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 36.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 10.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeMonochrome.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeMonochrome.java
deleted file mode 100644
index 509ea2a1a8b3..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeMonochrome.java
+++ /dev/null
@@ -1,36 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-
-/** A monochrome theme, colors are purely black / white / gray. */
-public class SchemeMonochrome extends DynamicScheme {
- public SchemeMonochrome(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.MONOCHROME,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeNeutral.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeNeutral.java
deleted file mode 100644
index fdbde9def79d..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeNeutral.java
+++ /dev/null
@@ -1,36 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-
-/** A theme that's slightly more chromatic than monochrome, which is purely black / white / gray. */
-public class SchemeNeutral extends DynamicScheme {
- public SchemeNeutral(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.NEUTRAL,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 12.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 8.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 2.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 2.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeRainbow.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeRainbow.java
deleted file mode 100644
index 92eb27fe620c..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeRainbow.java
+++ /dev/null
@@ -1,38 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** A playful theme - the source color's hue does not appear in the theme. */
-public class SchemeRainbow extends DynamicScheme {
- public SchemeRainbow(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.RAINBOW,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 48.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0),
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 60.0), 24.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java
deleted file mode 100644
index cc6b492dadc9..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java
+++ /dev/null
@@ -1,38 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-import com.android.systemui.monet.utils.MathUtils;
-
-/** A calm theme, sedated colors that aren't particularly chromatic. */
-public class SchemeTonalSpot extends DynamicScheme {
- public SchemeTonalSpot(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.TONAL_SPOT,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 36.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0),
- TonalPalette.fromHueAndChroma(
- MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 60.0), 24.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 6.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 8.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeVibrant.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeVibrant.java
deleted file mode 100644
index 160fab77a6c3..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeVibrant.java
+++ /dev/null
@@ -1,44 +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.monet.scheme;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.palettes.TonalPalette;
-
-/** A loud theme, colorfulness is maximum for Primary palette, increased for others. */
-public class SchemeVibrant extends DynamicScheme {
- private static final double[] HUES = {0, 41, 61, 101, 131, 181, 251, 301, 360};
- private static final double[] SECONDARY_ROTATIONS = {18, 15, 10, 12, 15, 18, 15, 12, 12};
- private static final double[] TERTIARY_ROTATIONS = {35, 30, 20, 25, 30, 35, 30, 25, 25};
-
- public SchemeVibrant(Hct sourceColorHct, boolean isDark, double contrastLevel) {
- super(
- sourceColorHct,
- Variant.VIBRANT,
- isDark,
- contrastLevel,
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 200.0),
- TonalPalette.fromHueAndChroma(
- DynamicScheme.getRotatedHue(sourceColorHct, HUES, SECONDARY_ROTATIONS),
- 24.0),
- TonalPalette.fromHueAndChroma(
- DynamicScheme.getRotatedHue(sourceColorHct, HUES, TERTIARY_ROTATIONS),
- 32.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 10.0),
- TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 12.0));
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Variant.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Variant.java
deleted file mode 100644
index 99aa2deb5a60..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/Variant.java
+++ /dev/null
@@ -1,30 +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.monet.scheme;
-
-/** Themes for Dynamic Color. */
-public enum Variant {
- MONOCHROME,
- NEUTRAL,
- TONAL_SPOT,
- VIBRANT,
- EXPRESSIVE,
- FIDELITY,
- CONTENT,
- RAINBOW,
- FRUIT_SALAD
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/score/Score.java b/packages/SystemUI/monet/src/com/android/systemui/monet/score/Score.java
deleted file mode 100644
index 09ea7a39bbea..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/score/Score.java
+++ /dev/null
@@ -1,184 +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.monet.score;
-
-import com.android.systemui.monet.hct.Cam16;
-import com.android.systemui.monet.utils.ColorUtils;
-import com.android.systemui.monet.utils.MathUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Given a large set of colors, remove colors that are unsuitable for a UI theme, and rank the rest
- * based on suitability.
- *
- * <p>Enables use of a high cluster count for image quantization, thus ensuring colors aren't
- * muddied, while curating the high cluster count to a much smaller number of appropriate choices.
- */
-public final class Score {
- private static final double CUTOFF_CHROMA = 15.;
- private static final double CUTOFF_EXCITED_PROPORTION = 0.01;
- private static final double CUTOFF_TONE = 10.;
- private static final double TARGET_CHROMA = 48.;
- private static final double WEIGHT_PROPORTION = 0.7;
- private static final double WEIGHT_CHROMA_ABOVE = 0.3;
- private static final double WEIGHT_CHROMA_BELOW = 0.1;
-
- private Score() {
- }
-
- /**
- * Given a map with keys of colors and values of how often the color appears, rank the colors
- * based on suitability for being used for a UI theme.
- *
- * @param colorsToPopulation map with keys of colors and values of how often the color appears,
- * usually from a source image.
- * @return Colors sorted by suitability for a UI theme. The most suitable color is the first
- * item,
- * the least suitable is the last. There will always be at least one color returned. If all
- * the input colors were not suitable for a theme, a default fallback color will be provided.
- */
- public static List<Integer> score(Map<Integer, Integer> colorsToPopulation) {
- // Determine the total count of all colors.
- double populationSum = 0.;
- for (Map.Entry<Integer, Integer> entry : colorsToPopulation.entrySet()) {
- populationSum += entry.getValue();
- }
-
- // Turn the count of each color into a proportion by dividing by the total
- // count. Also, fill a cache of CAM16 colors representing each color, and
- // record the proportion of colors for each CAM16 hue.
- Map<Integer, Cam16> colorsToCam = new HashMap<>();
- double[] hueProportions = new double[361];
- for (Map.Entry<Integer, Integer> entry : colorsToPopulation.entrySet()) {
- int color = entry.getKey();
- double population = entry.getValue();
- double proportion = population / populationSum;
-
- Cam16 cam = Cam16.fromInt(color);
- colorsToCam.put(color, cam);
-
- int hue = (int) Math.round(cam.getHue());
- hueProportions[hue] += proportion;
- }
-
- // Determine the proportion of the colors around each color, by summing the
- // proportions around each color's hue.
- Map<Integer, Double> colorsToExcitedProportion = new HashMap<>();
- for (Map.Entry<Integer, Cam16> entry : colorsToCam.entrySet()) {
- int color = entry.getKey();
- Cam16 cam = entry.getValue();
- int hue = (int) Math.round(cam.getHue());
-
- double excitedProportion = 0.;
- for (int j = (hue - 15); j < (hue + 15); j++) {
- int neighborHue = MathUtils.sanitizeDegreesInt(j);
- excitedProportion += hueProportions[neighborHue];
- }
-
- colorsToExcitedProportion.put(color, excitedProportion);
- }
-
- // Score the colors by their proportion, as well as how chromatic they are.
- Map<Integer, Double> colorsToScore = new HashMap<>();
- for (Map.Entry<Integer, Cam16> entry : colorsToCam.entrySet()) {
- int color = entry.getKey();
- Cam16 cam = entry.getValue();
-
- double proportion = colorsToExcitedProportion.get(color);
- double proportionScore = proportion * 100.0 * WEIGHT_PROPORTION;
-
- double chromaWeight =
- cam.getChroma() < TARGET_CHROMA ? WEIGHT_CHROMA_BELOW : WEIGHT_CHROMA_ABOVE;
- double chromaScore = (cam.getChroma() - TARGET_CHROMA) * chromaWeight;
-
- double score = proportionScore + chromaScore;
- colorsToScore.put(color, score);
- }
-
- // Remove colors that are unsuitable, ex. very dark or unchromatic colors.
- // Also, remove colors that are very similar in hue.
- List<Integer> filteredColors = filter(colorsToExcitedProportion, colorsToCam);
- Map<Integer, Double> filteredColorsToScore = new HashMap<>();
- for (int color : filteredColors) {
- filteredColorsToScore.put(color, colorsToScore.get(color));
- }
-
- // Ensure the list of colors returned is sorted such that the first in the
- // list is the most suitable, and the last is the least suitable.
- List<Map.Entry<Integer, Double>> entryList = new ArrayList<>(
- filteredColorsToScore.entrySet());
- Collections.sort(entryList, new ScoredComparator());
- List<Integer> colorsByScoreDescending = new ArrayList<>();
- for (Map.Entry<Integer, Double> entry : entryList) {
- int color = entry.getKey();
- Cam16 cam = colorsToCam.get(color);
- boolean duplicateHue = false;
-
- for (Integer alreadyChosenColor : colorsByScoreDescending) {
- Cam16 alreadyChosenCam = colorsToCam.get(alreadyChosenColor);
- if (MathUtils.differenceDegrees(cam.getHue(), alreadyChosenCam.getHue()) < 15) {
- duplicateHue = true;
- break;
- }
- }
-
- if (duplicateHue) {
- continue;
- }
- colorsByScoreDescending.add(entry.getKey());
- }
-
- // Ensure that at least one color is returned.
- if (colorsByScoreDescending.isEmpty()) {
- colorsByScoreDescending.add(0xff4285F4);
- }
- return colorsByScoreDescending;
- }
-
- private static List<Integer> filter(
- Map<Integer, Double> colorsToExcitedProportion, Map<Integer, Cam16> colorsToCam) {
- List<Integer> filtered = new ArrayList<>();
- for (Map.Entry<Integer, Cam16> entry : colorsToCam.entrySet()) {
- int color = entry.getKey();
- Cam16 cam = entry.getValue();
- double proportion = colorsToExcitedProportion.get(color);
-
- if (cam.getChroma() >= CUTOFF_CHROMA
- && ColorUtils.lstarFromArgb(color) >= CUTOFF_TONE
- && proportion >= CUTOFF_EXCITED_PROPORTION) {
- filtered.add(color);
- }
- }
- return filtered;
- }
-
- static class ScoredComparator implements Comparator<Map.Entry<Integer, Double>> {
- ScoredComparator() {
- }
-
- @Override
- public int compare(Map.Entry<Integer, Double> entry1, Map.Entry<Integer, Double> entry2) {
- return -entry1.getValue().compareTo(entry2.getValue());
- }
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/temperature/TemperatureCache.java b/packages/SystemUI/monet/src/com/android/systemui/monet/temperature/TemperatureCache.java
deleted file mode 100644
index 2f2022b289c8..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/temperature/TemperatureCache.java
+++ /dev/null
@@ -1,337 +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.monet.temperature;
-
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.utils.ColorUtils;
-import com.android.systemui.monet.utils.MathUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Design utilities using color temperature theory.
- *
- * <p>Analogous colors, complementary color, and cache to efficiently, lazily, generate data for
- * calculations when needed.
- */
-public final class TemperatureCache {
- private final Hct input;
-
- private Hct precomputedComplement;
- private List<Hct> precomputedHctsByTemp;
- private List<Hct> precomputedHctsByHue;
- private Map<Hct, Double> precomputedTempsByHct;
-
- private TemperatureCache() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Create a cache that allows calculation of ex. complementary and analogous colors.
- *
- * @param input Color to find complement/analogous colors of. Any colors will have the same
- * tone,
- * and chroma as the input color, modulo any restrictions due to the other hues
- * having lower
- * limits on chroma.
- */
- public TemperatureCache(Hct input) {
- this.input = input;
- }
-
- /**
- * A color that complements the input color aesthetically.
- *
- * <p>In art, this is usually described as being across the color wheel. History of this shows
- * intent as a color that is just as cool-warm as the input color is warm-cool.
- */
- public Hct getComplement() {
- if (precomputedComplement != null) {
- return precomputedComplement;
- }
-
- double coldestHue = getColdest().getHue();
- double coldestTemp = getTempsByHct().get(getColdest());
-
- double warmestHue = getWarmest().getHue();
- double warmestTemp = getTempsByHct().get(getWarmest());
- double range = warmestTemp - coldestTemp;
- boolean startHueIsColdestToWarmest = isBetween(input.getHue(), coldestHue, warmestHue);
- double startHue = startHueIsColdestToWarmest ? warmestHue : coldestHue;
- double endHue = startHueIsColdestToWarmest ? coldestHue : warmestHue;
- double directionOfRotation = 1.;
- double smallestError = 1000.;
- Hct answer = getHctsByHue().get((int) Math.round(input.getHue()));
-
- double complementRelativeTemp = (1. - getRelativeTemperature(input));
- // Find the color in the other section, closest to the inverse percentile
- // of the input color. This is the complement.
- for (double hueAddend = 0.; hueAddend <= 360.; hueAddend += 1.) {
- double hue = MathUtils.sanitizeDegreesDouble(
- startHue + directionOfRotation * hueAddend);
- if (!isBetween(hue, startHue, endHue)) {
- continue;
- }
- Hct possibleAnswer = getHctsByHue().get((int) Math.round(hue));
- double relativeTemp =
- (getTempsByHct().get(possibleAnswer) - coldestTemp) / range;
- double error = Math.abs(complementRelativeTemp - relativeTemp);
- if (error < smallestError) {
- smallestError = error;
- answer = possibleAnswer;
- }
- }
- precomputedComplement = answer;
- return precomputedComplement;
- }
-
- /**
- * 5 colors that pair well with the input color.
- *
- * <p>The colors are equidistant in temperature and adjacent in hue.
- */
- public List<Hct> getAnalogousColors() {
- return getAnalogousColors(5, 12);
- }
-
- /**
- * A set of colors with differing hues, equidistant in temperature.
- *
- * <p>In art, this is usually described as a set of 5 colors on a color wheel divided into 12
- * sections. This method allows provision of either of those values.
- *
- * <p>Behavior is undefined when count or divisions is 0. When divisions < count, colors repeat.
- *
- * @param count The number of colors to return, includes the input color.
- * @param divisions The number of divisions on the color wheel.
- */
- public List<Hct> getAnalogousColors(int count, int divisions) {
- // The starting hue is the hue of the input color.
- int startHue = (int) Math.round(input.getHue());
- Hct startHct = getHctsByHue().get(startHue);
- double lastTemp = getRelativeTemperature(startHct);
-
- List<Hct> allColors = new ArrayList<>();
- allColors.add(startHct);
-
- double absoluteTotalTempDelta = 0.f;
- for (int i = 0; i < 360; i++) {
- int hue = MathUtils.sanitizeDegreesInt(startHue + i);
- Hct hct = getHctsByHue().get(hue);
- double temp = getRelativeTemperature(hct);
- double tempDelta = Math.abs(temp - lastTemp);
- lastTemp = temp;
- absoluteTotalTempDelta += tempDelta;
- }
-
- int hueAddend = 1;
- double tempStep = absoluteTotalTempDelta / (double) divisions;
- double totalTempDelta = 0.0;
- lastTemp = getRelativeTemperature(startHct);
- while (allColors.size() < divisions) {
- int hue = MathUtils.sanitizeDegreesInt(startHue + hueAddend);
- Hct hct = getHctsByHue().get(hue);
- double temp = getRelativeTemperature(hct);
- double tempDelta = Math.abs(temp - lastTemp);
- totalTempDelta += tempDelta;
-
- double desiredTotalTempDeltaForIndex = (allColors.size() * tempStep);
- boolean indexSatisfied = totalTempDelta >= desiredTotalTempDeltaForIndex;
- int indexAddend = 1;
- // Keep adding this hue to the answers until its temperature is
- // insufficient. This ensures consistent behavior when there aren't
- // `divisions` discrete steps between 0 and 360 in hue with `tempStep`
- // delta in temperature between them.
- //
- // For example, white and black have no analogues: there are no other
- // colors at T100/T0. Therefore, they should just be added to the array
- // as answers.
- while (indexSatisfied && allColors.size() < divisions) {
- allColors.add(hct);
- desiredTotalTempDeltaForIndex = ((allColors.size() + indexAddend) * tempStep);
- indexSatisfied = totalTempDelta >= desiredTotalTempDeltaForIndex;
- indexAddend++;
- }
- lastTemp = temp;
- hueAddend++;
-
- if (hueAddend > 360) {
- while (allColors.size() < divisions) {
- allColors.add(hct);
- }
- break;
- }
- }
-
- List<Hct> answers = new ArrayList<>();
- answers.add(input);
-
- int ccwCount = (int) Math.floor(((double) count - 1.0) / 2.0);
- for (int i = 1; i < (ccwCount + 1); i++) {
- int index = 0 - i;
- while (index < 0) {
- index = allColors.size() + index;
- }
- if (index >= allColors.size()) {
- index = index % allColors.size();
- }
- answers.add(0, allColors.get(index));
- }
-
- int cwCount = count - ccwCount - 1;
- for (int i = 1; i < (cwCount + 1); i++) {
- int index = i;
- while (index < 0) {
- index = allColors.size() + index;
- }
- if (index >= allColors.size()) {
- index = index % allColors.size();
- }
- answers.add(allColors.get(index));
- }
-
- return answers;
- }
-
- /**
- * Temperature relative to all colors with the same chroma and tone.
- *
- * @param hct HCT to find the relative temperature of.
- * @return Value on a scale from 0 to 1.
- */
- public double getRelativeTemperature(Hct hct) {
- double range = getTempsByHct().get(getWarmest()) - getTempsByHct().get(getColdest());
- double differenceFromColdest =
- getTempsByHct().get(hct) - getTempsByHct().get(getColdest());
- // Handle when there's no difference in temperature between warmest and
- // coldest: for example, at T100, only one color is available, white.
- if (range == 0.) {
- return 0.5;
- }
- return differenceFromColdest / range;
- }
-
- /**
- * Value representing cool-warm factor of a color. Values below 0 are considered cool, above,
- * warm.
- *
- * <p>Color science has researched emotion and harmony, which art uses to select colors.
- * Warm-cool
- * is the foundation of analogous and complementary colors. See: - Li-Chen Ou's Chapter 19 in
- * Handbook of Color Psychology (2015). - Josef Albers' Interaction of Color chapters 19 and
- * 21.
- *
- * <p>Implementation of Ou, Woodcock and Wright's algorithm, which uses Lab/LCH color space.
- * Return value has these properties:<br>
- * - Values below 0 are cool, above 0 are warm.<br>
- * - Lower bound: -9.66. Chroma is infinite. Assuming max of Lab chroma 130.<br>
- * - Upper bound: 8.61. Chroma is infinite. Assuming max of Lab chroma 130.
- */
- public static double rawTemperature(Hct color) {
- double[] lab = ColorUtils.labFromArgb(color.toInt());
- double hue = MathUtils.sanitizeDegreesDouble(Math.toDegrees(Math.atan2(lab[2], lab[1])));
- double chroma = Math.hypot(lab[1], lab[2]);
- return -0.5
- + 0.02
- * Math.pow(chroma, 1.07)
- * Math.cos(Math.toRadians(MathUtils.sanitizeDegreesDouble(hue - 50.)));
- }
-
- /** Coldest color with same chroma and tone as input. */
- private Hct getColdest() {
- return getHctsByTemp().get(0);
- }
-
- /**
- * HCTs for all colors with the same chroma/tone as the input.
- *
- * <p>Sorted by hue, ex. index 0 is hue 0.
- */
- private List<Hct> getHctsByHue() {
- if (precomputedHctsByHue != null) {
- return precomputedHctsByHue;
- }
- List<Hct> hcts = new ArrayList<>();
- for (double hue = 0.; hue <= 360.; hue += 1.) {
- Hct colorAtHue = Hct.from(hue, input.getChroma(), input.getTone());
- hcts.add(colorAtHue);
- }
- precomputedHctsByHue = Collections.unmodifiableList(hcts);
- return precomputedHctsByHue;
- }
-
- /**
- * HCTs for all colors with the same chroma/tone as the input.
- *
- * <p>Sorted from coldest first to warmest last.
- */
- // Prevent lint for Comparator not being available on Android before API level 24, 7.0, 2016.
- // "AndroidJdkLibsChecker" for one linter, "NewApi" for another.
- // A java_library Bazel rule with an Android constraint cannot skip these warnings without this
- // annotation; another solution would be to create an android_library rule and supply
- // AndroidManifest with an SDK set higher than 23.
- @SuppressWarnings({"AndroidJdkLibsChecker", "NewApi"})
- private List<Hct> getHctsByTemp() {
- if (precomputedHctsByTemp != null) {
- return precomputedHctsByTemp;
- }
-
- List<Hct> hcts = new ArrayList<>(getHctsByHue());
- hcts.add(input);
- Comparator<Hct> temperaturesComparator =
- Comparator.comparing((Hct arg) -> getTempsByHct().get(arg), Double::compareTo);
- Collections.sort(hcts, temperaturesComparator);
- precomputedHctsByTemp = hcts;
- return precomputedHctsByTemp;
- }
-
- /** Keys of HCTs in getHctsByTemp, values of raw temperature. */
- private Map<Hct, Double> getTempsByHct() {
- if (precomputedTempsByHct != null) {
- return precomputedTempsByHct;
- }
-
- List<Hct> allHcts = new ArrayList<>(getHctsByHue());
- allHcts.add(input);
-
- Map<Hct, Double> temperaturesByHct = new HashMap<>();
- for (Hct hct : allHcts) {
- temperaturesByHct.put(hct, rawTemperature(hct));
- }
-
- precomputedTempsByHct = temperaturesByHct;
- return precomputedTempsByHct;
- }
-
- /** Warmest color with same chroma and tone as input. */
- private Hct getWarmest() {
- return getHctsByTemp().get(getHctsByTemp().size() - 1);
- }
-
- /** Determines if an angle is between two other angles, rotating clockwise. */
- private static boolean isBetween(double angle, double a, double b) {
- if (a < b) {
- return a <= angle && angle <= b;
- }
- return a <= angle || angle <= b;
- }
-}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/ColorUtils.java b/packages/SystemUI/monet/src/com/android/systemui/monet/utils/ColorUtils.java
deleted file mode 100644
index 5a4ced0a6452..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/ColorUtils.java
+++ /dev/null
@@ -1,266 +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.monet.utils;
-
-/**
- * Color science utilities.
- *
- * <p>Utility methods for color science constants and color space conversions that aren't HCT or
- * CAM16.
- */
-public class ColorUtils {
- private ColorUtils() {
- }
-
- static final double[][] SRGB_TO_XYZ =
- new double[][]{
- new double[]{0.41233895, 0.35762064, 0.18051042},
- new double[]{0.2126, 0.7152, 0.0722},
- new double[]{0.01932141, 0.11916382, 0.95034478},
- };
-
- static final double[][] XYZ_TO_SRGB =
- new double[][]{
- new double[]{
- 3.2413774792388685, -1.5376652402851851, -0.49885366846268053,
- },
- new double[]{
- -0.9691452513005321, 1.8758853451067872, 0.04156585616912061,
- },
- new double[]{
- 0.05562093689691305, -0.20395524564742123, 1.0571799111220335,
- },
- };
-
- static final double[] WHITE_POINT_D65 = new double[]{95.047, 100.0, 108.883};
-
- /** Converts a color from RGB components to ARGB format. */
- public static int argbFromRgb(int red, int green, int blue) {
- return (255 << 24) | ((red & 255) << 16) | ((green & 255) << 8) | (blue & 255);
- }
-
- /** Converts a color from linear RGB components to ARGB format. */
- public static int argbFromLinrgb(double[] linrgb) {
- int r = delinearized(linrgb[0]);
- int g = delinearized(linrgb[1]);
- int b = delinearized(linrgb[2]);
- return argbFromRgb(r, g, b);
- }
-
- /** Returns the alpha component of a color in ARGB format. */
- public static int alphaFromArgb(int argb) {
- return (argb >> 24) & 255;
- }
-
- /** Returns the red component of a color in ARGB format. */
- public static int redFromArgb(int argb) {
- return (argb >> 16) & 255;
- }
-
- /** Returns the green component of a color in ARGB format. */
- public static int greenFromArgb(int argb) {
- return (argb >> 8) & 255;
- }
-
- /** Returns the blue component of a color in ARGB format. */
- public static int blueFromArgb(int argb) {
- return argb & 255;
- }
-
- /** Returns whether a color in ARGB format is opaque. */
- public static boolean isOpaque(int argb) {
- return alphaFromArgb(argb) >= 255;
- }
-
- /** Converts a color from ARGB to XYZ. */
- public static int argbFromXyz(double x, double y, double z) {
- double[][] matrix = XYZ_TO_SRGB;
- double linearR = matrix[0][0] * x + matrix[0][1] * y + matrix[0][2] * z;
- double linearG = matrix[1][0] * x + matrix[1][1] * y + matrix[1][2] * z;
- double linearB = matrix[2][0] * x + matrix[2][1] * y + matrix[2][2] * z;
- int r = delinearized(linearR);
- int g = delinearized(linearG);
- int b = delinearized(linearB);
- return argbFromRgb(r, g, b);
- }
-
- /** Converts a color from XYZ to ARGB. */
- public static double[] xyzFromArgb(int argb) {
- double r = linearized(redFromArgb(argb));
- double g = linearized(greenFromArgb(argb));
- double b = linearized(blueFromArgb(argb));
- return MathUtils.matrixMultiply(new double[]{r, g, b}, SRGB_TO_XYZ);
- }
-
- /** Converts a color represented in Lab color space into an ARGB integer. */
- public static int argbFromLab(double l, double a, double b) {
- double[] whitePoint = WHITE_POINT_D65;
- double fy = (l + 16.0) / 116.0;
- double fx = a / 500.0 + fy;
- double fz = fy - b / 200.0;
- double xNormalized = labInvf(fx);
- double yNormalized = labInvf(fy);
- double zNormalized = labInvf(fz);
- double x = xNormalized * whitePoint[0];
- double y = yNormalized * whitePoint[1];
- double z = zNormalized * whitePoint[2];
- return argbFromXyz(x, y, z);
- }
-
- /**
- * Converts a color from ARGB representation to L*a*b* representation.
- *
- * @param argb the ARGB representation of a color
- * @return a Lab object representing the color
- */
- public static double[] labFromArgb(int argb) {
- double linearR = linearized(redFromArgb(argb));
- double linearG = linearized(greenFromArgb(argb));
- double linearB = linearized(blueFromArgb(argb));
- double[][] matrix = SRGB_TO_XYZ;
- double x = matrix[0][0] * linearR + matrix[0][1] * linearG + matrix[0][2] * linearB;
- double y = matrix[1][0] * linearR + matrix[1][1] * linearG + matrix[1][2] * linearB;
- double z = matrix[2][0] * linearR + matrix[2][1] * linearG + matrix[2][2] * linearB;
- double[] whitePoint = WHITE_POINT_D65;
- double xNormalized = x / whitePoint[0];
- double yNormalized = y / whitePoint[1];
- double zNormalized = z / whitePoint[2];
- double fx = labF(xNormalized);
- double fy = labF(yNormalized);
- double fz = labF(zNormalized);
- double l = 116.0 * fy - 16;
- double a = 500.0 * (fx - fy);
- double b = 200.0 * (fy - fz);
- return new double[]{l, a, b};
- }
-
- /**
- * Converts an L* value to an ARGB representation.
- *
- * @param lstar L* in L*a*b*
- * @return ARGB representation of grayscale color with lightness matching L*
- */
- public static int argbFromLstar(double lstar) {
- double y = yFromLstar(lstar);
- int component = delinearized(y);
- return argbFromRgb(component, component, component);
- }
-
- /**
- * Computes the L* value of a color in ARGB representation.
- *
- * @param argb ARGB representation of a color
- * @return L*, from L*a*b*, coordinate of the color
- */
- public static double lstarFromArgb(int argb) {
- double y = xyzFromArgb(argb)[1];
- return 116.0 * labF(y / 100.0) - 16.0;
- }
-
- /**
- * Converts an L* value to a Y value.
- *
- * <p>L* in L*a*b* and Y in XYZ measure the same quantity, luminance.
- *
- * <p>L* measures perceptual luminance, a linear scale. Y in XYZ measures relative luminance, a
- * logarithmic scale.
- *
- * @param lstar L* in L*a*b*
- * @return Y in XYZ
- */
- public static double yFromLstar(double lstar) {
- return 100.0 * labInvf((lstar + 16.0) / 116.0);
- }
-
- /**
- * Converts a Y value to an L* value.
- *
- * <p>L* in L*a*b* and Y in XYZ measure the same quantity, luminance.
- *
- * <p>L* measures perceptual luminance, a linear scale. Y in XYZ measures relative luminance, a
- * logarithmic scale.
- *
- * @param y Y in XYZ
- * @return L* in L*a*b*
- */
- public static double lstarFromY(double y) {
- return labF(y / 100.0) * 116.0 - 16.0;
- }
-
- /**
- * Linearizes an RGB component.
- *
- * @param rgbComponent 0 <= rgb_component <= 255, represents R/G/B channel
- * @return 0.0 <= output <= 100.0, color channel converted to linear RGB space
- */
- public static double linearized(int rgbComponent) {
- double normalized = rgbComponent / 255.0;
- if (normalized <= 0.040449936) {
- return normalized / 12.92 * 100.0;
- } else {
- return Math.pow((normalized + 0.055) / 1.055, 2.4) * 100.0;
- }
- }
-
- /**
- * Delinearizes an RGB component.
- *
- * @param rgbComponent 0.0 <= rgb_component <= 100.0, represents linear R/G/B channel
- * @return 0 <= output <= 255, color channel converted to regular RGB space
- */
- public static int delinearized(double rgbComponent) {
- double normalized = rgbComponent / 100.0;
- double delinearized = 0.0;
- if (normalized <= 0.0031308) {
- delinearized = normalized * 12.92;
- } else {
- delinearized = 1.055 * Math.pow(normalized, 1.0 / 2.4) - 0.055;
- }
- return MathUtils.clampInt(0, 255, (int) Math.round(delinearized * 255.0));
- }
-
- /**
- * Returns the standard white point; white on a sunny day.
- *
- * @return The white point
- */
- public static double[] whitePointD65() {
- return WHITE_POINT_D65;
- }
-
- static double labF(double t) {
- double e = 216.0 / 24389.0;
- double kappa = 24389.0 / 27.0;
- if (t > e) {
- return Math.pow(t, 1.0 / 3.0);
- } else {
- return (kappa * t + 16) / 116;
- }
- }
-
- static double labInvf(double ft) {
- double e = 216.0 / 24389.0;
- double kappa = 24389.0 / 27.0;
- double ft3 = ft * ft * ft;
- if (ft3 > e) {
- return ft3;
- } else {
- return (116 * ft - 16) / kappa;
- }
- }
-}
-
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/MathUtils.java b/packages/SystemUI/monet/src/com/android/systemui/monet/utils/MathUtils.java
deleted file mode 100644
index a7622efc8567..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/MathUtils.java
+++ /dev/null
@@ -1,135 +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.monet.utils;
-
-/** Utility methods for mathematical operations. */
-public class MathUtils {
- private MathUtils() {
- }
-
- /**
- * The signum function.
- *
- * @return 1 if num > 0, -1 if num < 0, and 0 if num = 0
- */
- public static int signum(double num) {
- if (num < 0) {
- return -1;
- } else if (num == 0) {
- return 0;
- } else {
- return 1;
- }
- }
-
- /**
- * The linear interpolation function.
- *
- * @return start if amount = 0 and stop if amount = 1
- */
- public static double lerp(double start, double stop, double amount) {
- return (1.0 - amount) * start + amount * stop;
- }
-
- /**
- * Clamps an integer between two integers.
- *
- * @return input when min <= input <= max, and either min or max otherwise.
- */
- public static int clampInt(int min, int max, int input) {
- if (input < min) {
- return min;
- } else if (input > max) {
- return max;
- }
-
- return input;
- }
-
- /**
- * Clamps an integer between two floating-point numbers.
- *
- * @return input when min <= input <= max, and either min or max otherwise.
- */
- public static double clampDouble(double min, double max, double input) {
- if (input < min) {
- return min;
- } else if (input > max) {
- return max;
- }
-
- return input;
- }
-
- /**
- * Sanitizes a degree measure as an integer.
- *
- * @return a degree measure between 0 (inclusive) and 360 (exclusive).
- */
- public static int sanitizeDegreesInt(int degrees) {
- degrees = degrees % 360;
- if (degrees < 0) {
- degrees = degrees + 360;
- }
- return degrees;
- }
-
- /**
- * Sanitizes a degree measure as a floating-point number.
- *
- * @return a degree measure between 0.0 (inclusive) and 360.0 (exclusive).
- */
- public static double sanitizeDegreesDouble(double degrees) {
- degrees = degrees % 360.0;
- if (degrees < 0) {
- degrees = degrees + 360.0;
- }
- return degrees;
- }
-
- /**
- * Sign of direction change needed to travel from one angle to another.
- *
- * <p>For angles that are 180 degrees apart from each other, both directions have the same
- * travel
- * distance, so either direction is shortest. The value 1.0 is returned in this case.
- *
- * @param from The angle travel starts from, in degrees.
- * @param to The angle travel ends at, in degrees.
- * @return -1 if decreasing from leads to the shortest travel distance, 1 if increasing from
- * leads
- * to the shortest travel distance.
- */
- public static double rotationDirection(double from, double to) {
- double increasingDifference = sanitizeDegreesDouble(to - from);
- return increasingDifference <= 180.0 ? 1.0 : -1.0;
- }
-
- /** Distance of two points on a circle, represented using degrees. */
- public static double differenceDegrees(double a, double b) {
- return 180.0 - Math.abs(Math.abs(a - b) - 180.0);
- }
-
- /** Multiplies a 1x3 row vector with a 3x3 matrix. */
- public static double[] matrixMultiply(double[] row, double[][] matrix) {
- double a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2];
- double b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2];
- double c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2];
- return new double[]{a, b, c};
- }
-}
-
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/StringUtils.java b/packages/SystemUI/monet/src/com/android/systemui/monet/utils/StringUtils.java
deleted file mode 100644
index cb2b6940ab1e..000000000000
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/utils/StringUtils.java
+++ /dev/null
@@ -1,35 +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.monet.utils;
-
-/** Utility methods for string representations of colors. */
-final class StringUtils {
- private StringUtils() {
- }
-
- /**
- * Hex string representing color, ex. #ff0000 for red.
- *
- * @param argb ARGB representation of a color.
- */
- public static String hexFromArgb(int argb) {
- int red = ColorUtils.redFromArgb(argb);
- int blue = ColorUtils.blueFromArgb(argb);
- int green = ColorUtils.greenFromArgb(argb);
- return String.format("#%02x%02x%02x", red, green, blue);
- }
-}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
index b33c5449c1eb..a5e5aaa499f1 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/DarkIconDispatcher.java
@@ -26,6 +26,7 @@ import com.android.systemui.plugins.annotations.DependsOn;
import com.android.systemui.plugins.annotations.ProvidesInterface;
import java.util.ArrayList;
+import java.util.Collection;
/**
* Dispatches events to {@link DarkReceiver}s about changes in darkness, tint area and dark
@@ -78,7 +79,7 @@ public interface DarkIconDispatcher {
* @return the tint to apply to view depending on the desired tint color and
* the screen tintArea in which to apply that tint
*/
- static int getTint(ArrayList<Rect> tintAreas, View view, int color) {
+ static int getTint(Collection<Rect> tintAreas, View view, int color) {
if (isInAreas(tintAreas, view)) {
return color;
} else {
@@ -90,7 +91,7 @@ public interface DarkIconDispatcher {
* @return true if more than half of the view area are in any of the given
* areas, false otherwise
*/
- static boolean isInAreas(ArrayList<Rect> areas, View view) {
+ static boolean isInAreas(Collection<Rect> areas, View view) {
if (areas.isEmpty()) {
return true;
}
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index c4ea98ad35a9..e9b3b90cb5ee 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -73,9 +73,9 @@
<string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"Lås op med adgangskode eller fingeraftryk"</string>
<string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"Lås op med mønster eller fingeraftryk"</string>
<string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"Enhed låst af arbejdspolitik af hensyn til sikkerhed"</string>
- <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"Pinkode er påkrævet efter brug af ekstralås"</string>
- <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Adgangskode er påkrævet efter brug af ekstralås"</string>
- <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Mønster er påkrævet efter brug af ekstralås"</string>
+ <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"Pinkode er påkrævet efter brug af låsning"</string>
+ <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Adgangskode er påkrævet efter brug af låsning"</string>
+ <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Mønster er påkrævet efter brug af låsning"</string>
<string name="kg_prompt_unattended_update" msgid="8223448855578632202">"Opdateringen installeres under inaktivitet"</string>
<string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"Mere sikkerhed er påkrævet. Pinkoden er ikke blevet brugt i et stykke tid."</string>
<string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"Mere sikkerhed er påkrævet. Adgangskoden er ikke blevet brugt i et stykke tid."</string>
diff --git a/packages/SystemUI/res-product/values-zh-rTW/strings.xml b/packages/SystemUI/res-product/values-zh-rTW/strings.xml
index 8b79732f2436..f40780304f68 100644
--- a/packages/SystemUI/res-product/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-product/values-zh-rTW/strings.xml
@@ -52,7 +52,7 @@
<string name="high_temp_title" product="default" msgid="5365000411304924115">"手機溫度上升"</string>
<string name="high_temp_title" product="device" msgid="6622009907401563664">"裝置溫度上升"</string>
<string name="high_temp_title" product="tablet" msgid="9039733706606446616">"平板電腦溫度上升"</string>
- <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"手機降溫時,某些功能會受到限制。\n輕觸即可瞭解詳情"</string>
+ <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"手機降溫期間,某些功能會受到限制。\n輕觸即可瞭解詳情"</string>
<string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"裝置降溫時,某些功能會受到限制。\n輕觸即可瞭解詳情"</string>
<string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"平板電腦降溫時,某些功能會受到限制。\n輕觸即可瞭解詳情"</string>
<string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"手機會自動嘗試降溫。你仍可繼續使用手機,但運作速度可能會變慢。\n\n手機降溫後就會恢復正常運作。"</string>
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
index a33625212d34..d4b73a4e3de0 100644
--- a/packages/SystemUI/res/layout/super_notification_shade.xml
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -65,17 +65,17 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
+ <include layout="@layout/status_bar_expanded"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible" />
+
<!-- Root for all keyguard content. It was previously located within the shade. -->
<com.android.systemui.keyguard.ui.view.KeyguardRootView
android:id="@id/keyguard_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- <include layout="@layout/status_bar_expanded"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible" />
-
<!-- Shared container for the notification stack. Can be positioned by either
the keyguard_root_view or notification_panel -->
<com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index e0c25e3ca3fb..8857d083fa7e 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gesig is herken. Druk om voort te gaan."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesig is herken. Druk die ontsluitikoon om voort te gaan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Gestaaf"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gebruik PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gebruik patroon"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gebruik wagwoord"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Ontsluit met gesig"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Gesig is herken"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swiep op om weer te probeer"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ontsluit om NFC te gebruik"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Hierdie toestel behoort aan jou organisasie"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Hierdie toestel behoort aan <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Wanneer jy deel, opneem of uitsaai, het Android toegang tot enigiets wat op jou skerm sigbaar is of op jou toestel gespeel word. Wees dus versigtig met dinge soos wagwoorde, betalingbesonderhede, boodskappe, foto’s, en oudio en video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Wanneer jy ’n app deel, opneem of uitsaai, het Android toegang tot enigiets wat in daardie app gewys of gespeel word. Wees dus versigtig met dinge soos wagwoorde, betalingbesonderhede, boodskappe, foto’s, en oudio en video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Begin"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Deling word onderbreek wanneer jy apps wissel"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Deel eerder hierdie app"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Skakel terug"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Appwisselaar"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Deur jou IT-admin geblokkeer"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Skermskote is deur toestelbeleid gedeaktiveer"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Vee alles uit"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Probeer \'n ander PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Bevestig verandering vir <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swiep om meer te sien"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Laai tans aanbevelings"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Versteek hierdie mediakontrole vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent-aandag is aan"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stel versteknotasapp in Instellings"</string>
<string name="install_app" msgid="5066668100199613936">"Installeer app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index b8ac5fc74ca6..e54ab644db12 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ለመመልከት መታ ያድርጉ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"የማያ ገጽ ቀረጻን ማስቀመጥ ላይ ስህተት"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"የማያ ገፅ ቀረጻን መጀመር ላይ ስህተት"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"ሙሉ ገፅ በማሳየት ላይ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ለመውጣት፣ ከላይ ወደታች ጠረግ ያድርጉ።"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"በሙሉ ገጽ ዕይታ በማየት ላይ"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"ለመውጣት፣ ከላይ ወደታች ያንሸራትቱ።"</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"ገባኝ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ተመለስ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"መነሻ"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"መልክ ተለይቶ ታውቋል። ለመቀጠል ይጫኑ።"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"መልክ ተለይቶ ታውቋል። ለመቀጠል የመክፈቻ አዶውን ይጫኑ።"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"የተረጋገጠ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ፒን ይጠቀሙ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ሥርዓተ ጥለትን ተጠቀም"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"የይለፍ ቃልን ተጠቀም"</string>
@@ -284,7 +286,7 @@
<string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"ውሂብ ቆጣቢ በርቷል"</string>
<string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# መሣሪያ}one{# መሣሪያዎች}other{# መሣሪያዎች}}"</string>
<string name="quick_settings_flashlight_label" msgid="4904634272006284185">"የባትሪ ብርሃን"</string>
- <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"ካሜራ ስራ ላይ ነው"</string>
+ <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"ካሜራ ሥራ ላይ ነው"</string>
<string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="6105969068871138427">"የውሂብ አጠቃቀም"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="1136599216568805644">"ቀሪ ውሂብ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"በመልክ ተከፍቷል"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"መልክ ተለይቶ ታውቋል"</string>
<string name="keyguard_retry" msgid="886802522584053523">"እንደገና ለመሞከር ወደ ላይ ይጥረጉ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFCን ለመጠቀም ይክፈቱ"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ይህ መሣሪያ የድርጅትዎ ነው"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ይህ መሣሪያ ንብረትነቱ የ<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ነው"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"እርስዎ ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ Android በማያ ገጽዎ ላይ ለሚታይ ወይም በመሣሪያዎ ላይ ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ መልዕክቶች፣ ፎቶዎች እና ኦዲዮ እና ቪድዮ ላሉ ነገሮች ጥንቃቄ ያድርጉ።"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"እርስዎ ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ Android በማያ ገጽዎ ላይ ለሚታይ ወይም በመሣሪያዎ ላይ ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ መልዕክቶች፣ ፎቶዎች እና ኦዲዮ እና ቪድዮ ላሉ ነገሮች ጥንቃቄ ያድርጉ።"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ጀምር"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"መተግበሪያዎችን በሚቀያይሩበት ጊዜ ለአፍታ ማቆሞችን ማጋራት"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"በምትኩ ይህን መተግበሪያ ያጋሩ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ተመልሰው ይቀይሩ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"የመተግበሪያ መቀየሪያ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"በእርስዎ የአይቲ አስተዳዳሪ ታግዷል"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"የማያ ገፅ ቀረጻ በመሣሪያ መመሪያ ተሰናክሏል"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ሁሉንም አጽዳ"</string>
@@ -836,9 +836,9 @@
<string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"መተግበሪያዎች የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> እየተጠቀሙ ነው።"</string>
<string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">"፣ "</string>
<string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" እና "</string>
- <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ስራ ላይ እየዋለ ነው"</string>
- <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"በቅርብ ጊዜ በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ስራ ላይ ውሏል"</string>
- <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(ስራ)"</string>
+ <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ሥራ ላይ እየዋለ ነው"</string>
+ <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"በቅርብ ጊዜ በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ሥራ ላይ ውሏል"</string>
+ <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(ሥራ)"</string>
<string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"የስልክ ጥሪ"</string>
<string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(በ<xliff:g id="APPLICATION_NAME_S_">%s</xliff:g> በኩል)"</string>
<string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ሌላ ፒን ይሞክሩ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"ለ<xliff:g id="DEVICE">%s</xliff:g> ለውጥን ያረጋግጡ"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ተጨማሪ ለማየት ያንሸራትቱ"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ምክሮችን በመጫን ላይ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ሚዲያ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የዚህ ሚዲያ መቆጣጠሪያ ይደበቅ?"</string>
@@ -993,7 +995,7 @@
<string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ለኦዲዮ ውጽዓት ተገኚ የሆኑ መሣሪያዎች"</string>
<string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"የድምጽ መጠን"</string>
<string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string>
- <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ድምጽ ማውጫዎች እና ማሳያዎች"</string>
+ <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ድምፅ ማውጫዎች እና ማሳያዎች"</string>
<string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"የተጠቆሙ መሣሪያዎች"</string>
<string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ሚዲያን ወደ ሌላ መሣሪያ ለማንቀሳቀስ የተጋራውን ክፍለ ጊዜዎን ያቁሙ"</string>
<string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"አቁም"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"የረዳት ትኩረት በርቷል"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"በቅንብሮች ውስጥ ነባሪ የማስታወሻዎች መተግበሪያን ያቀናብሩ"</string>
<string name="install_app" msgid="5066668100199613936">"መተግበሪያን ጫን"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index e4657735ae85..768a8c34af8a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"حدث خطأ أثناء حفظ تسجيل محتوى الشاشة."</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"حدث خطأ في بدء تسجيل الشاشة"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"جارٍ العرض بملء الشاشة"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"للخروج، مرر بسرعة من أعلى إلى أسفل."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"للخروج، مرِّر سريعًا من أعلى الشاشة لأسفلها."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"حسنًا"</string>
<string name="accessibility_back" msgid="6530104400086152611">"رجوع"</string>
<string name="accessibility_home" msgid="5430449841237966217">"الرئيسية"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"تم التعرّف على الوجه. اضغط للمتابعة."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"تم التعرّف على الوجه. للمتابعة، اضغط على رمز فتح القفل."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"مصادقة"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استخدام رقم تعريف شخصي"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استخدام نقش"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"استخدام كلمة المرور"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"تم فتح قفل جهازك عند تقريبه من وجهك."</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"تم التعرّف على الوجه."</string>
<string name="keyguard_retry" msgid="886802522584053523">"مرِّر سريعًا للأعلى لإعادة المحاولة."</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"‏افتح قفل الشاشة لاستخدام تقنية NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"هذا الجهاز يخص مؤسستك."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"هذا الجهاز يخص <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"‏أثناء المشاركة أو التسجيل أو البثّ، يمكن لنظام Android الوصول إلى كل المحتوى المعروض على شاشتك أو الذي يتم تشغيله على جهازك، لذا يُرجى توخي الحذر بشأن المعلومات، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"‏أثناء مشاركة محتوى تطبيق أو تسجيله أو بثّه، يمكن لنظام Android الوصول إلى كل المحتوى المعروض أو الذي يتم تشغيله في ذلك التطبيق، لذا يُرجى توخي الحذر بشأن المعلومات مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"بدء"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"تتوقف المشاركة مؤقتًا عند التبديل بين التطبيقات."</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"مشاركة هذا التطبيق بدلاً من ذلك"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"الرجوع"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"التبديل بين التطبيقات"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"حظر مشرف تكنولوجيا المعلومات هذه الميزة"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ميزة \"تصوير الشاشة\" غير مفعَّلة بسبب سياسة الجهاز."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"محو الكل"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"حاوِل إدخال رقم تعريف شخصي آخر"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"تأكيد التغيير لـ <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"مرّر سريعًا لرؤية المزيد."</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"جارٍ تحميل الاقتراحات"</string>
<string name="controls_media_title" msgid="1746947284862928133">"الوسائط"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"هل تريد إخفاء عنصر التحكم في الوسائط هذا للتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>؟"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"الإعدادات"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"يتم تشغيل <xliff:g id="SONG_NAME">%1$s</xliff:g> للفنان <xliff:g id="ARTIST_NAME">%2$s</xliff:g> من تطبيق <xliff:g id="APP_LABEL">%3$s</xliff:g>."</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> من إجمالي <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قيد التشغيل"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"‫\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قيد التشغيل"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"تشغيل"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"إيقاف مؤقت"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"المقطع الصوتي السابق"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"‏ميزة لفت انتباه \"مساعد Google\" مفعّلة."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"يمكنك ضبط تطبيق تدوين الملاحظات التلقائي في \"الإعدادات\"."</string>
<string name="install_app" msgid="5066668100199613936">"تثبيت التطبيق"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 372cab8e9816..0c9d57bcbddc 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ টিপক।"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যৱহাৰ কৰক"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"আৰ্হি ব্যৱহাৰ কৰক"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"মুখাৱয়বৰ জৰিয়তে আনলক কৰা"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"মুখাৱয়ব চিনাক্ত কৰা হৈছে"</string>
<string name="keyguard_retry" msgid="886802522584053523">"পুনৰ চেষ্টা কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ব্যৱহাৰ কৰিবলৈ আনলক কৰক"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"এই ডিভাইচটো আপোনাৰ প্ৰতিষ্ঠানৰ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ৰ"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"আপুনি শ্বেয়াৰ কৰা, ৰেকৰ্ড কৰা অথবা কাষ্ট কৰাৰ সময়ত, আপোনাৰ স্ক্ৰীনখনত দৃশ্যমান হোৱা যিকোনো বস্তু অথবা আপোনাৰ ডিভাইচত প্লে’ কৰা যিকোনো সমললৈ Androidৰ এক্সেছ থাকে। গতিকে, পাছৱৰ্ড, পৰিশোধৰ সবিশেষ, বাৰ্তা, ফট’ আৰু অডিঅ’ আৰু ভিডিঅ’ৰ ক্ষেত্ৰত সাৱধান হওক।"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"আপুনি শ্বেয়াৰ কৰা, ৰেকৰ্ড কৰা অথবা কাষ্ট কৰাৰ সময়ত, সেইটো এপত দৃশ্যমান যিকোনো বস্তু অথবা আপোনাৰ ডিভাইচত প্লে’ কৰা যিকোনো সমললৈ Androidৰ এক্সেছ থাকে। গতিকে, পাছৱৰ্ড, পৰিশোধৰ সবিশেষ, বাৰ্তা, ফট’ আৰু অডিঅ’ আৰু ভিডিঅ’ৰ ক্ষেত্ৰত সাৱধান হওক।"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"আৰম্ভ কৰক"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"আপুনি এপ্‌ সলনি কৰিলে শ্বেয়াৰ কৰাটো পজ হয়"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"তাৰ সলনি এই এপ্‌টো শ্বেয়াৰ কৰক"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"উভতি যাওক"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"এপ্‌ সলনি কৰা"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ডিভাইচ সম্পৰ্কীয় নীতিয়ে স্ক্ৰীন কেপশ্বাৰ কৰাটো অক্ষম কৰিছে"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"আটাইবোৰ মচক"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"অন্য এটা পিন ব্যৱহাৰ কৰি চাওক"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>ৰ বাবে সলনি কৰাটো নিশ্চিত কৰক"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"অধিক চাবলৈ ছোৱাইপ কৰক"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"চুপাৰিছসমূহ ল’ড কৰি থকা হৈছে"</string>
<string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে এই মিডিয়া নিয়ন্ত্ৰণটো লুকুৱাবনে?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistantএ আপোনাৰ কথা শুনি আছে"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ছেটিঙত টোকাৰ ডিফ’ল্ট এপ্ ছেট কৰক"</string>
<string name="install_app" msgid="5066668100199613936">"এপ্‌টো ইনষ্টল কৰক"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index ba87178ad5f4..ebe7fbaefe84 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Baxmaq üçün toxunun"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ekran çəkimini yadda saxlayarkən xəta oldu"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ekranın yazılması ilə bağlı xəta"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Tam ekrana baxış"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Tam ekran rejimi"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Çıxmaq üçün yuxarıdan aşağı sürüşdürün."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Anladım"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Geri"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Üz tanınıb. Davam etmək üçün basın."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Üz tanınıb. \"Kiliddən çıxar\" ikonasına basıb davam edin."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Doğrulandı"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN istifadə edin"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Model istifadə edin"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Parol istifadə edin"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Üz ilə kiliddən çıxarılıb"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Üz tanınıb"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Yenidən cəhd etmək üçün yuxarı sürüşdürün"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC istifadə etmək üçün kiliddən çıxarın"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Bu cihaz təşkilatınıza məxsusdur"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> təşkilatına məxsusdur"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Paylaşım, qeydəalma və ya yayım zamanı Android-in ekranda görünən, yaxud cihazda oxudulan məlumatlara girişi olur. Parol, ödəniş detalları, mesaj, foto, habelə audio və video kimi məlumatlarla bağlı diqqətli olun."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Tətbiq paylaşdıqda, qeydə aldıqda və ya yayımladıqda Android-in həmin tətbiqdə göstərilən, yaxud oxudulan məlumatlara girişi olur. Parol, ödəniş detalları, mesaj, foto, habelə audio və video kimi məlumatlarla bağlı diqqətli olun."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Başlayın"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Tətbiqləri dəyişdikdə paylaşım durdurulur"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Bu tətbiqi paylaşın"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Geri dəyişin"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Tətbiq keçirici"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"İT admininiz tərəfindən bloklanıb"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ekran çəkimi cihaz siyasəti ilə deaktiv edilib"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hamısını silin"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Başqa PIN\'i yoxlayın"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> üzrə dəyişikliyi təsdiq edin"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Digərlərini görmək üçün sürüşdürün"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Tövsiyələr yüklənir"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün bu media nizamlayıcısı gizlədilsin?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent aktivdir"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlarda defolt qeydlər tətbiqi ayarlayın"</string>
<string name="install_app" msgid="5066668100199613936">"Tətbiqi quraşdırın"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 258ae1d2d215..104c6f0b0e77 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice je prepoznato. Pritisnite da biste nastavili."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu otključavanja za nastavak."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Identitet je potvrđen"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite šablon"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite lozinku"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Otključano je licem"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Lice je prepoznato"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Prevucite nagore da biste probali ponovo"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Otključajte da biste koristili NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ovaj uređaj pripada organizaciji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i video snimcima."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada delite, snimate ili prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i video snimcima."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Deljenje se zaustavlja kada menjate aplikacije"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Deli ovu aplikaciju"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Vrati"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Promena aplikacije"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokira IT administrator"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Snimanje ekrana je onemogućeno smernicama za uređaj"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Obriši sve"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Probajte drugi PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdite promenu za: <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Prevucite da biste videli još"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Učitavaju se preporuke"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Mediji"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Želite da sakrijete ovu kontrolu za medije za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Pomoćnik je u aktivnom stanju"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Podesite podrazumevanu aplikaciju za beleške u Podešavanjima"</string>
<string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 5f9d63ccfb4a..5fe9907e14ad 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Памылка захавання запісу экрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Памылка пачатку запісу экрана"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Прагляд у поўнаэкранным рэжыме"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Для выхаду правядзіце зверху ўніз."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Каб выйсці, правядзіце пальцам па экране зверху ўніз."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Зразумела"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"На Галоўную старонку"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Твар распазнаны. Націсніце для працягу."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Твар распазнаны. Для працягу націсніце значок разблакіроўкі."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Распазнана"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Увесці PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Выкарыстаць узор разблакіроўкі"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Выкарыстаць пароль"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Разблакіравана распазнаваннем твару"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Твар распазнаны"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Прагартайце ўверх, каб паўтарыць спробу"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Разблакіруйце, каб выкарыстоўваць NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Гэта прылада належыць вашай арганізацыі"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Гэта прылада належыць арганізацыі \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Калі адбываецца абагульванне, запіс ці трансляцыя, Android мае доступ да ўсяго змесціва, якое паказваецца на экране ці прайграецца на прыладзе. Таму прадухіліце паказ пароляў, плацежных рэквізітаў, паведамленняў, фота, відэа і аўдыя."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Калі адбываецца абагульванне, запіс ці трансляцыя змесціва праграмы, Android мае доступ да ўсяго змесціва, якое паказваецца ці прайграецца ў праграме. Таму прадухіліце паказ пароляў, плацежных рэквізітаў, паведамленняў, фота, відэа і аўдыя."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Пачаць"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Пры пераключэнні праграм абагульванне прыпыняецца"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Абагуліць гэту праграму"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Пераключыцца назад"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Пераключальнік праграм"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Заблакіравана вашым ІТ-адміністратарам"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Здыманне экрана адключана згодна з палітыкай прылады"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Ачысціць усё"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Паспрабуйце іншы PIN-код"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Пацвердзіце змяненне для прылады \"<xliff:g id="DEVICE">%s</xliff:g>\""</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Правядзіце пальцам, каб убачыць больш інфармацыі"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Загружаюцца рэкамендацыі"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Мультымедыя"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Схаваць гэту панэль мультымедыя для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Памочнік гатовы выконваць каманды"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайце ў Наладах стандартную праграму для нататак"</string>
<string name="install_app" msgid="5066668100199613936">"Усталяваць праграму"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index f2a8dbf1bc9d..93de963d8f10 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Грешка при запазването на записа на екрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"При стартирането на записа на екрана възникна грешка"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Изглед на цял екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"За изход плъзнете пръст надолу от горната част."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"За изход прекарайте пръст надолу от горната част."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Разбрах"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Начало"</string>
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицето бе разпознато. Натиснете, за да продължите."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето бе разпознато. Продължете чрез иконата за отключване."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Удостоверено"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Анулиране на удостоверяването"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Използване на ПИН"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Използване на фигура"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Използване на парола"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Отключено с лице"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Лицето бе разпознато"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Плъзнете бързо нагоре, за да опитате отново"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Плъзнете нагоре, за да изпробвате отново „Отключване с лице“"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Отключете, за да използвате NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Това устройство принадлежи на организацията ви"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Това устройство принадлежи на <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +417,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Когато споделяте, записвате или предавате, Android има достъп до всичко, което се вижда на екрана ви или се възпроизвежда на устройството ви. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Когато споделяте, записвате или предавате дадено приложение, Android има достъп до всичко, което се показва или възпроизвежда в него. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Стартиране"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Споделянето се поставя на пауза, когато превключвате приложенията"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Вместо това споделете приложението"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Превключване обратно"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Превключване на приложението"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Блокирано от системния ви администратор"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Заснемането на екрана е деактивирано от правило за устройството"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Изчистване на всички"</string>
@@ -940,6 +938,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Опитайте с друг ПИН код"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Потвърдете промяната за <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Прекарайте пръст, за да видите повече"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Препоръките се зареждат"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Мултимедия"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Скриване на мултимед. контрола за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1166,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Функцията за активиране на Асистент е включена"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартно приложение за бележки от настройките"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталиране на приложението"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 836b0edfe736..5247b470c896 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে প্রেস করুন।"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে আনলক আইকন প্রেস করুন।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"প্রমাণীকৃত"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যবহার করুন"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"প্যাটার্ন ব্যবহার করুন"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাসওয়ার্ড ব্যবহার করুন"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ফেস দেখিয়ে আনলক করা হয়েছে"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ফেস চিনে নেওয়া হয়েছে"</string>
<string name="keyguard_retry" msgid="886802522584053523">"আবার চেষ্টা করতে উপরের দিকে সোয়াইপ করুন"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ব্যবহার করতে আনলক করুন"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"এই ডিভাইসটি আপনার প্রতিষ্ঠানের"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"এই ডিভাইসটি <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>-এর"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"আপনি শেয়ার, রেকর্ড বা কাস্ট করার সময়, স্ক্রিনে দৃশ্যমান বা ডিভাইসে চালানো সব কিছুই Android অ্যাক্সেস করতে পারবে। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ে সতর্ক থাকুন।"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"আপনি কোনও অ্যাপ শেয়ার, রেকর্ড বা কাস্ট করার সময়, সেই অ্যাপে দেখা যায় বা চালানো হয় এমন সব কিছু Android অ্যাক্সেস করতে পারবে। তাই পাসওয়ার্ড, পেমেন্টের বিবরণ, মেসেজ, ফটো এবং অডিও ও ভিডিওর মতো বিষয়ে সতর্ক থাকুন।"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"শুরু করুন"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"আপনি অ্যাপ পাল্টানোর সময় শেয়ারিং পজ করা হয়"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"এর পরিবর্তে এই অ্যাপ শেয়ার করুন"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"আবার পাল্টান"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"অ্যাপ পাল্টান"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"আপনার আইটি অ্যাডমিন ব্লক করেছেন"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ডিভাইস নীতির কারণে স্ক্রিন ক্যাপচার করার প্রসেস বন্ধ করা আছে"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"সব মুছে দিন"</string>
@@ -435,7 +435,7 @@
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"সব নীরব বিজ্ঞপ্তি মুছুন"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'বিরক্ত করবে না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"এখন শুরু করুন"</string>
- <string name="empty_shade_text" msgid="8935967157319717412">"কোনো বিজ্ঞপ্তি নেই"</string>
+ <string name="empty_shade_text" msgid="8935967157319717412">"কোনও বিজ্ঞপ্তি নেই"</string>
<string name="no_unseen_notif_text" msgid="395512586119868682">"নতুন কোনও বিজ্ঞপ্তি নেই"</string>
<string name="unlock_to_see_notif_text" msgid="7439033907167561227">"পুরনো বিজ্ঞপ্তি দেখতে আনলক করুন"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"আপনার অভিভাবক এই ডিভাইস ম্যানেজ করেন"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"আরেকটি পিন লিখে চেষ্টা করুন"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>-এর জন্য পরিবর্তন কনফার্ম করুন"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"আরও দেখতে সোয়াইপ করুন"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"সাজেশন লোড করা হচ্ছে"</string>
<string name="controls_media_title" msgid="1746947284862928133">"মিডিয়া"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর মিডিয়া কন্ট্রোল লুকিয়ে রাখতে চান?"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"সেটিংস"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="ARTIST_NAME">%2$s</xliff:g>-এর <xliff:g id="SONG_NAME">%1$s</xliff:g> গানটি <xliff:g id="APP_LABEL">%3$s</xliff:g> অ্যাপে চলছে"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="TOTAL_TIME">%2$s</xliff:g>টির মধ্যে <xliff:g id="ELAPSED_TIME">%1$s</xliff:g>টি"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> চলছে"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> এখন চালু রয়েছে"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"চালান"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"পজ করুন"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"আগের ট্র্যাক"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"অ্যাসিস্ট্যান্ট আপনার কথা শোনার জন্য চালু করা আছে"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"\'সেটিংস\' থেকে ডিফল্ট নোট নেওয়ার অ্যাপ সেট করুন"</string>
<string name="install_app" msgid="5066668100199613936">"অ্যাপ ইনস্টল করুন"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index db902ef0b2b2..be365e933a3a 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Dodirnite da vidite"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Greška prilikom pohranjivanja snimka ekrana"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Greška pri pokretanju snimanja ekrana"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Prikazuje se cijeli ekran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Da izađete, prevucite odozgo nadolje."</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Prikazivanje preko cijelog ekrana"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Da izađete, prevucite s vrha nadolje."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Razumijem"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Nazad"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Dugme za početnu stranicu"</string>
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice prepoznato. Pritisnite da nastavite."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu za otklj. da nastavite."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificirano"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkaži autentifikaciju"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristi PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristi uzorak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristi lozinku"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Otključano je licem"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Lice je prepoznato"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Prevucite prema gore da pokušate ponovo"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Prijeđite prstom prema gore da biste ponovo isprobali otključavanje licem"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Otključajte da koristite NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ovaj uređaj pripada vašoj organizaciji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +417,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na ekranu ili što se reproducira na uređaju. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Dijeljenje se pauzira kada promijenite aplikaciju"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Umjesto toga, dijeli aplikaciju"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Vrati se"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Promjena aplikacije"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokirao je vaš IT administrator"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Snimanje ekrana je onemogućeno pravilima uređaja"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Očisti sve"</string>
@@ -940,6 +938,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Pokušajte s drugim PIN-om"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdite promjenu za uređaj <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Prevucite da vidite više"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Učitavanje preporuka"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Mediji"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Sakriti kontrolu medija za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1166,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Pažnja Asistenta je uključena"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u Postavkama"</string>
<string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 7eefa4fbee87..97a74dfb4d7d 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toca per veure-la"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"S\'ha produït un error en desar la gravació de la pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"S\'ha produït un error en iniciar la gravació de pantalla"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Mode de pantalla completa"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Visualització en pantalla completa"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Per sortir, llisca cap avall des de la part superior."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entesos"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Enrere"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"S\'ha reconegut la cara. Prem per continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"S\'ha reconegut la cara. Prem la icona per continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticat"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilitza el PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utilitza el patró"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilitza la contrasenya"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"S\'ha desbloquejat amb la cara"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"S\'ha reconegut la cara"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Llisca cap a dalt per tornar-ho a provar"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloqueja per utilitzar l\'NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Aquest dispositiu pertany a la teva organització"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Aquest dispositiu pertany a <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi al dispositiu. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi a l\'aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Inicia"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"La compartició es posa en pausa quan canvies d\'aplicació"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Comparteix aquesta aplicació"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Torna a canviar"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Canvi d\'aplicació"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloquejat per l\'administrador de TI"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Les captures de pantalla estan desactivades per la política de dispositius"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Esborra-ho tot"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prova un altre PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirma el canvi per a <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Llisca per veure\'n més"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Carregant les recomanacions"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimèdia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Amagar aquest control multimèdia per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"L\'Assistent està activat"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defineix l\'aplicació de notes predeterminada a Configuració"</string>
<string name="install_app" msgid="5066668100199613936">"Instal·la l\'aplicació"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 4a070fbafe84..0dbe5c6858c8 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Klepnutím nahrávku zobrazíte"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Při ukládání záznamu obrazovky došlo k chybě"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Při spouštění nahrávání obrazovky došlo k chybě"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Zobrazení celé obrazovky"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Zobrazování přes celou obrazovku"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Režim ukončíte přejetím prstem shora dolů."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Rozumím"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Zpět"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Obličej rozpoznán. Pokračujte stisknutím."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obličej rozpoznán. Klepněte na ikonu odemknutí."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ověřeno"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použít kód PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použít gesto"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použít heslo"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Odemknuto obličejem"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Obličej rozpoznán"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Přejetím nahoru to zkusíte znovu"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC vyžaduje odemknutou obrazovku"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Toto zařízení patří vaší organizaci"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Toto zařízení patří organizaci <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Během sdílení, nahrávání nebo odesílání má Android přístup k veškerému obsahu, který je viditelný na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Během sdílení, nahrávání nebo odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Začít"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Když přepnete aplikace, sdílení se pozastaví"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Sdílet aplikaci"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Přepnout zpět"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Přepnutí aplikace"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokováno administrátorem IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Záznam obrazovky je zakázán zásadami zařízení"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Smazat vše"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Zkuste jiný PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Ověřte změnu v zařízení <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Přejetím prstem zobrazíte další položky"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Načítání doporučení"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Média"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Skrýt toto ovládání médií aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Pozornost Asistenta je zapnutá"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Výchozí aplikaci pro poznámky nastavíte v Nastavení"</string>
<string name="install_app" msgid="5066668100199613936">"Nainstalovat aplikaci"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 2893b1e94a0e..4556f813a7d8 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -120,7 +120,7 @@
<string name="screenrecord_start_error" msgid="2200660692479682368">"Skærmoptagelsen kunne ikke startes"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visning i fuld skærm"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Stryg ned fra toppen for at afslutte."</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"OK, det er forstået"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tilbage"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Hjem"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Menu"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansigt genkendt. Tryk for at fortsætte."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansigt genkendt. Tryk på oplåsningsikonet for at fortsætte."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Godkendt"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Brug pinkode"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Brug mønster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Brug adgangskode"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Låst op via ansigtsgenkendelse"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Ansigtet er genkendt"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Stryg opad for at prøve igen"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Lås op for at bruge NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Denne enhed tilhører din organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Denne enhed tilhører <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Når du deler, optager eller caster, har Android adgang til alt, der er synligt på din skærm eller afspilles på din enhed. Vær derfor forsigtig med ting såsom adgangskoder, betalingsoplysninger, beskeder, billeder, lyd og video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Når du deler, optager eller caster en app, har Android adgang til alt, der vises eller afspilles i den pågældende app. Vær derfor forsigtig med ting såsom adgangskoder, betalingsoplysninger, beskeder, billeder, lyd og video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Start"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Delingen sættes på pause, når du skifter apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Del denne app i stedet"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Skift tilbage"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Skift app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokeret af din it-administrator"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Screenshots er deaktiveret af enhedspolitikken"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Ryd alle"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prøv en anden pinkode"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Bekræft ændring på <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Stryg for at se mere"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Indlæser anbefalinger"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medie"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Vil du skjule denne mediefunktion for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent lytter"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Angiv standardapp til noter i Indstillinger"</string>
<string name="install_app" msgid="5066668100199613936">"Installer app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index b52754117dcf..d8e753bb3aa4 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Fehler beim Speichern der Bildschirmaufzeichnung"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Fehler beim Start der Bildschirmaufzeichnung"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Vollbildmodus wird aktiviert"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Zum Beenden von oben nach unten wischen"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Zum Beenden von oben nach unten wischen."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ok"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Zurück"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startbildschirm"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gesicht erkannt. Tippe, um fortzufahren."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesicht erkannt. Tippe zum Fortfahren auf das Symbol „Entsperren“."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifiziert"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN verwenden"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Muster verwenden"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Passwort verwenden"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Gerät mit Gesicht entsperrt"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Gesicht erkannt"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Zum Wiederholen nach oben wischen"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Zur Verwendung von NFC entsperren"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Dieses Gerät gehört deiner Organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Dieses Gerät gehört <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Beim Teilen, Aufnehmen oder Streamen hat Android Zugriff auf alle Inhalte, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden. Sei also vorsichtig mit Informationen wie Passwörtern, Zahlungsdetails, Nachrichten, Fotos sowie Audio- und Videoinhalten."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Beim Teilen, Aufnehmen oder Streamen einer App hat Android Zugriff auf alle Inhalte, die in dieser App sichtbar sind oder von ihr wiedergegeben werden. Sei also vorsichtig mit Informationen wie Passwörtern, Zahlungsdetails, Nachrichten, Fotos sowie Audio- und Videoinhalten."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Starten"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Das Teilen wird pausiert, wenn du zwischen Apps wechselst"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Stattdessen diese App teilen"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Zurückwechseln"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"App wechseln"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Vom IT-Administrator blockiert"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Bildschirmaufnahme ist durch die Geräterichtlinien deaktiviert"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Alle löschen"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Andere PIN ausprobieren"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Änderung für <xliff:g id="DEVICE">%s</xliff:g> bestätigen"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Wischen, um weitere zu sehen"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Empfehlungen werden geladen"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medien"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Mediensteuerung für <xliff:g id="APP_NAME">%1$s</xliff:g> ausblenden?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant-Aktivierung an"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standard-Notizen-App in den Einstellungen einrichten"</string>
<string name="install_app" msgid="5066668100199613936">"App installieren"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index e23cbb8b5a34..596dbdf1977a 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Το πρόσωπο αναγνωρίστηκε. Πατήστε για συνέχεια."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Το πρόσωπο αναγνωρ. Πατήστε το εικον. ξεκλειδ. για συνέχεια."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ολοκληρώθηκε ο έλεγχος ταυτότητας"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Χρήση PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Χρήση μοτίβου"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Χρήση κωδικού πρόσβασης"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Ξεκλείδωμα με αναγνώριση προσώπου"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Το πρόσωπο αναγνωρίστηκε"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Σύρετε προς τα πάνω για να δοκιμάσετε ξανά"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ξεκλείδωμα για χρήση του NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Αυτή η συσκευή ανήκει στον οργανισμό σας."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Αυτή η συσκευή ανήκει στον οργανισμό <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -936,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Δοκιμάστε άλλο PIN."</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Επιβεβαίωση αλλαγής για <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Σύρετε για να δείτε περισσότερα."</string>
+ <string name="retry_face" msgid="416380073082560186">"Επανάληψη ελέγχου ταυτότητας προσώπου"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Φόρτωση προτάσεων"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Μέσα"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Απόκρυψη στοιχ. ελέγχου μέσων για <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
@@ -1162,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Ο Βοηθός βρίσκεται σε αναμονή"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ορίστε την προεπιλεγμένη εφαρμογή σημειώσεων στις Ρυθμίσεις"</string>
<string name="install_app" msgid="5066668100199613936">"Εγκατάσταση εφαρμογής"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Μικρόφωνο και Κάμερα"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"Πρόσφατη χρήση εφαρμογής"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"Εμφάνιση πρόσφατης πρόσβασης"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"Τέλος"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"Ανάπτυξη και εμφάνιση επιλογών"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"Σύμπτυξη"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"Κλείσιμο αυτής της εφαρμογής"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> έκλεισε"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"Διαχείριση υπηρεσίας"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"Διαχείριση πρόσβασης"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"Χρησιμοποιείται από την τηλεφωνική κλήση"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"Χρησιμοποιήθηκε πρόσφατα στην τηλεφωνική κλήση"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"Χρησιμοποιείται από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"Χρησιμοποιήθηκε πρόσφατα από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"Χρησιμοποιείται από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"Χρησιμοποιήθηκε πρόσφατα από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"Χρησιμοποιείται από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"Χρησιμοποιήθηκε πρόσφατα από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 809873974955..161037254e80 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Unlocked by face"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Face recognised"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swipe up to try again"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Unlock to use NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"This device belongs to your organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"This device belongs to <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"When you’re sharing, recording or casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Start"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Sharing pauses when you switch apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Share this app instead"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Switch back"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"App switch"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blocked by your IT admin"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Screen capturing is disabled by device policy"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Try another PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirm change for <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe to see more"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Hide this media control for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant attention on"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index d20838262722..bf5051f409f9 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognized. Press to continue."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognized. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel Authentication"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Unlocked by face"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Face recognized"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swipe up to try again"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Swipe up to try Face Unlock again"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Unlock to use NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"This device belongs to your organization"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"This device belongs to <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -936,6 +938,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Try another PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirm change for <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe to see more"</string>
+ <string name="retry_face" msgid="416380073082560186">"Retry face authentication"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Hide this media control for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1162,4 +1165,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant attention on"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Microphone &amp; 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>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"Expand and show options"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"Collapse"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"Close this app"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"<xliff:g id="APP_NAME">%1$s</xliff:g> closed"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"Manage service"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"Manage access"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"In use by phone call"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"Recently used in phone call"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"In use by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"Recently used by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"In use by <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"Recently used by <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"In use by <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"Recently used by <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 809873974955..161037254e80 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Unlocked by face"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Face recognised"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swipe up to try again"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Unlock to use NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"This device belongs to your organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"This device belongs to <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"When you’re sharing, recording or casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Start"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Sharing pauses when you switch apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Share this app instead"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Switch back"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"App switch"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blocked by your IT admin"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Screen capturing is disabled by device policy"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Try another PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirm change for <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe to see more"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Hide this media control for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant attention on"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 809873974955..161037254e80 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Face recognised. Press to continue."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Unlocked by face"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Face recognised"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swipe up to try again"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Unlock to use NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"This device belongs to your organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"This device belongs to <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"When you’re sharing, recording or casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Start"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Sharing pauses when you switch apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Share this app instead"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Switch back"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"App switch"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blocked by your IT admin"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Screen capturing is disabled by device policy"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Try another PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirm change for <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe to see more"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Hide this media control for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant attention on"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string>
<string name="install_app" msgid="5066668100199613936">"Install app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 8a321e2434d8..22e054a1b598 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‎Face recognized. Press to continue.‎‏‎‎‏‎"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎Face recognized. Press the unlock icon to continue.‎‏‎‎‏‎"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎Authenticated‎‏‎‎‏‎"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎Cancel Authentication‎‏‎‎‏‎"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‏‎Use PIN‎‏‎‎‏‎"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎Use pattern‎‏‎‎‏‎"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‏‏‎Use password‎‏‎‎‏‎"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎Unlocked by face‎‏‎‎‏‎"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎Face recognized‎‏‎‎‏‎"</string>
<string name="keyguard_retry" msgid="886802522584053523">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‎Swipe up to try again‎‏‎‎‏‎"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎Swipe up to try Face Unlock again‎‏‎‎‏‎"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎Unlock to use NFC‎‏‎‎‏‎"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎This device belongs to your organization‎‏‎‎‏‎"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎This device belongs to ‎‏‎‎‏‏‎<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -936,6 +938,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎Try another PIN‎‏‎‎‏‎"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‎Confirm change for ‎‏‎‎‏‏‎<xliff:g id="DEVICE">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‎Swipe to see more‎‏‎‎‏‎"</string>
+ <string name="retry_face" msgid="416380073082560186">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎Retry face authentication‎‏‎‎‏‎"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎Loading recommendations‎‏‎‎‏‎"</string>
<string name="controls_media_title" msgid="1746947284862928133">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎Media‎‏‎‎‏‎"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎Hide this media control for ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
@@ -1162,4 +1165,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‎‏‏‎Assistant attention on‎‏‎‎‏‎"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‎Set default notes app in Settings‎‏‎‎‏‎"</string>
<string name="install_app" msgid="5066668100199613936">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎Install app‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎Microphone &amp; 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>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎Expand and show options‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎Collapse‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎Close this app‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ closed‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‏‏‎‏‎‎‎Manage service‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎Manage access‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎In use by phone call‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎Recently used in phone call‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎In use by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎Recently used by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‏‏‏‎In use by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (‎‏‎‎‏‏‎<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎Recently used by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (‎‏‎‎‏‏‎<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎In use by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (‎‏‎‎‏‏‎<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="PROXY_LABEL">%3$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎Recently used by ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ (‎‏‎‎‏‏‎<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="PROXY_LABEL">%3$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index a6edfd56711b..2fe63c9d83fa 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rostro reconocido. Presiona para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rostro reconocido. Presiona el desbloqueo para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticación"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Se desbloqueó con el rostro"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Se reconoció el rostro"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Desliza el dedo hacia arriba para volver a intentarlo"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Desliza hacia arriba para volver a probar Desbloqueo facial"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloquea el dispositivo para usar NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertenece a tu organización"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +417,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Cuando compartas, grabes o transmitas contenido, Android podrá acceder a todo lo que sea visible en la pantalla o que reproduzcas en el dispositivo. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Cuando compartas, grabes o transmitas una app, Android podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Iniciar"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"El uso compartido se detiene al cambiar de app"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Compartir esta app en su lugar"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Cambiar de cuenta"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Cambio de app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqueada por tu administrador de TI"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"La captura de pantalla está inhabilitada debido a la política del dispositivo"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Cerrar todo"</string>
@@ -940,6 +938,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prueba con otro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirmar cambio para <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Desliza el dedo para ver más elementos"</string>
+ <string name="retry_face" msgid="416380073082560186">"Vuelve a intentar la autenticación facial"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Cargando recomendaciones"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Contenido multimedia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"¿Ocultar control multimedia para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1165,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistente está prestando atención"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la app de notas predeterminada en Configuración"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Micrófono y cámara"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"Uso reciente de una app"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"Ver accesos recientes"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"Listo"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"Expandir y mostrar opciones"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"Contraer"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"Cerrar esta app"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"<xliff:g id="APP_NAME">%1$s</xliff:g> cerrada"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"Administrar servicio"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"Administrar acceso"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"En uso por una llamada telefónica"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"Uso reciente en una llamada telefónica"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"En uso por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"Uso reciente en <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"En uso por <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"Uso reciente en <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"En uso por <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"Uso reciente en <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 2fb76cda3a6f..540a0a352042 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Toca para verla"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"No se ha podido guardar la grabación de pantalla"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"No se ha podido empezar a grabar la pantalla"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Modo de pantalla completa"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Para salir, desliza el dedo de arriba abajo."</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Visualización en pantalla completa"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Para salir, desliza de arriba abajo."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Entendido"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atrás"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Inicio"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Cara reconocida. Pulsa para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Cara reconocida. Pulsa el icono de desbloquear para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Se ha autenticado"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Desbloqueado con la cara"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Cara reconocida"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Desliza el dedo hacia arriba para volverlo a intentar"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloquea para usar el NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertenece a tu organización"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -936,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prueba con otro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirma el cambio de <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Desliza el dedo para ver más"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Cargando recomendaciones"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimedia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"¿Ocultar este control multimedia para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1162,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"El Asistente está activado"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la aplicación de notas predeterminada en Ajustes"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index b300e78505da..3b73e29f7c32 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Nägu tuvastati. Vajutage jätkamiseks."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nägu tuvastati. Jätkamiseks vajutage avamise ikooni."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenditud"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Kasuta PIN-koodi"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Kasuta mustrit"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Kasuta parooli"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Avati näoga"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Nägu tuvastati"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Uuesti proovimiseks pühkige üles"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC kasutamiseks avage."</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"See seade kuulub teie organisatsioonile"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Selle seadme omanik on <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kui jagate, salvestate või kannate üle, on Androidil juurdepääs kõigele, mis on teie ekraanikuval nähtaval või mida teie seadmes esitatakse. Seega olge ettevaatlik selliste andmetega nagu paroolid, makseteave, sõnumid, fotod ning heli ja video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kui jagate, salvestate või kannate rakendust üle, on Androidil juurdepääs kõigele, mida selles rakenduses kuvatakse või esitatakse. Seega olge paroolide, makseteabe, sõnumite, fotode, heli ja videoga ettevaatlik."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Alusta"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Rakenduste vahetamisel jagamine peatatakse"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Jaga hoopis seda rakendust"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Lülitu tagasi"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Rakenduse vahetamine"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokeeris teie IT-administraator"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ekraanikuva jäädvustamine on seadmereeglitega keelatud"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tühjenda kõik"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Proovige muud PIN-koodi"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Kinnitage seadme <xliff:g id="DEVICE">%s</xliff:g> muudatus"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Pühkige sõrmega, et näha rohkem"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Soovituste laadimine"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Meedia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Kas peita see rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> meediajuhik?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent on aktiveeritud"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Määrake seadetes märkmete vaikerakendus."</string>
<string name="install_app" msgid="5066668100199613936">"Installi rakendus"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 8fd391c3ca20..a6489a58d9bc 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Sakatu ikusteko"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Errore bat gertatu da pantaila-grabaketa gordetzean"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Errore bat gertatu da pantaila grabatzen hastean"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Pantaila osoko ikuspegia"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Pantaila osoa ikusgai"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Irteteko, pasatu hatza goitik behera."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ados"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Atzera"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ezagutu da aurpegia. Sakatu aurrera egiteko."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ezagutu da aurpegia. Aurrera egiteko, sakatu desblokeatzeko ikonoa."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikatuta"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Erabili PINa"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Erabili eredua"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Erabili pasahitza"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Aurpegiaren bidez desblokeatu da"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Ezagutu da aurpegia"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Berriro saiatzeko, pasatu hatza gora"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desblokea ezazu NFCa erabiltzeko"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Gailu hau zure erakundearena da"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Gailu hau <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> erakundearena da"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Edukia partekatzen, grabatzen edo igortzen ari zarenean, pantailan ikusgai dagoen edo gailuan erreproduzitzen ari den guztia atzi dezake Android-ek. Beraz, kontuz ibili pasahitzekin, ordainketen xehetasunekin, mezuekin, argazkiekin, audioekin eta bideoekin, besteak beste."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Aplikazio bat partekatzen, grabatzen edo igortzen ari zarenean, aplikazio horretan ikusgai dagoen edo bertan erreproduzitzen ari den guztia atzi dezake Android-ek. Beraz, kontuz ibili pasahitzekin, ordainketen xehetasunekin, mezuekin, argazkiekin, audioekin eta bideoekin, besteak beste."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Hasi"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Partekatzea pausatu egiten da aplikazioz aldatzean"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Partekatu aplikazioa"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Itzuli"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Aplikazioz aldatzeko aukera"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IKT saileko administratzaileak blokeatu du"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Pantaila-kapturak egiteko aukera desgaituta dago, gailu-gidalerroei jarraikiz"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Garbitu guztiak"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Saiatu beste PIN batekin"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Berretsi <xliff:g id="DEVICE">%s</xliff:g> gailuaren aldaketa"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Pasatu hatza aukera gehiago ikusteko"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Gomendioak kargatzen"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimedia-edukia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Multimedia kontrolatzeko aukerak (<xliff:g id="APP_NAME">%1$s</xliff:g>) ezkutatu?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Laguntzailea zerbitzuak arreta jarrita dauka"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ezarri oharren aplikazio lehenetsia ezarpenetan"</string>
<string name="install_app" msgid="5066668100199613936">"Instalatu aplikazioa"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 4d3b3f00a2ea..3ac7be9759ac 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"چهره شناسایی شد. برای ادامه، فشار دهید."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چهره شناسایی شد. برای ادامه، نماد قفل‌گشایی را فشار دهید."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"راستی‌آزمایی‌شده"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استفاده از پین"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استفاده از الگو"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"استفاده از گذرواژه"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"قفل با چهره باز شد"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"چهره شناسایی شد"</string>
<string name="keyguard_retry" msgid="886802522584053523">"برای امتحان مجدد، انگشتتان را تند به‌بالا بکشید"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"‏برای استفاده از NFC، قفل را باز کنید"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"این دستگاه به سازمان شما تعلق دارد"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"این دستگاه به <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> تعلق دارد"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"‏وقتی درحال هم‌رسانی، ضبط، یا پخش محتوا هستید، Android به همه محتوایی که در صفحه‌تان نمایان است یا در دستگاهتان پخش می‌شود دسترسی دارد. درنتیجه مراقب چیزهایی مثل گذرواژه‌ها، جزئیات پرداخت، پیام‌ها، عکس‌ها، و صدا و تصویر باشید."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"‏وقتی درحال هم‌رسانی، ضبط، یا پخش محتوای برنامه‌ای هستید، Android به همه محتوایی که در آن برنامه نمایان است یا پخش می‌شود دسترسی دارد. درنتیجه مراقب چیزهایی مثل گذرواژه‌ها، جزئیات پرداخت، پیام‌ها، عکس‌ها، و صدا و تصویر باشید."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"شروع"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"وقتی برنامه‌ها را تغییر می‌دهید، هم‌رسانی متوقف می‌شود"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"درعوض هم‌رسانی این برنامه"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"تغییر به حالت قبل"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"تغییر برنامه"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"سرپرست فناوری اطلاعات آن را مسدود کرده است"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"«ضبط صفحه‌نمایش» به‌دلیل خط‌مشی دستگاه غیرفعال است"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"پاک کردن همه موارد"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"پین دیگری را امتحان کنید"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"تأیید تغییر مربوط به <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"برای دیدن موارد بیشتر، تند بکشید"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"درحال بار کردن توصیه‌ها"</string>
<string name="controls_media_title" msgid="1746947284862928133">"رسانه"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"این کنترل رسانه برای <xliff:g id="APP_NAME">%1$s</xliff:g> پنهان شود؟"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"تنظیمات"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g> از <xliff:g id="ARTIST_NAME">%2$s</xliff:g> ازطریق <xliff:g id="APP_LABEL">%3$s</xliff:g> پخش می‌شود"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> از <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> در حال اجرا است"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> درحال اجرا است"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"پخش"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"توقف موقت"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"آهنگ قبلی"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"توجه «دستیار» روشن است"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"برنامه پیش‌فرض یادداشت را در «تنظیمات» تنظیم کنید"</string>
<string name="install_app" msgid="5066668100199613936">"نصب برنامه"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index f3b95de8c5d5..39b6de943699 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Kasvot tunnistettu. Jatka painamalla."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Kasvot tunnistettu. Jatka lukituksen avauskuvakkeella."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Todennettu"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Käytä PIN-koodia"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Käytä kuviota"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Käytä salasanaa"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Avattu kasvojen avulla"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Kasvot tunnistettu"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Yritä uudelleen pyyhkäisemällä ylös"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Avaa lukitus, jotta voit käyttää NFC:tä"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Organisaatiosi omistaa tämän laitteen"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> omistaa tämän laitteen"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kun jaat, tallennat tai striimaat, Android saa pääsyn kaikkeen näytölläsi näkyvään tai laitteellasi toistettuun sisältöön. Ole siis varovainen, kun lisäät salasanoja, maksutietoja, viestejä, kuvia, audiota tai videoita."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kun jaat, tallennat tai striimaat, Android saa pääsyn kaikkeen sovelluksella näkyvään tai toistettuun sisältöön. Ole siis varovainen, kun lisäät salasanoja, maksutietoja, viestejä, kuvia, audiota tai videoita."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Aloita"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Jakaminen keskeytyy, kun vaihdat sovelluksia"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Jaa tämä sovellus"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Vaihda takaisin"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Sovelluksen vaihto"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IT-järjestelmänvalvojasi estämä"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Kuvakaappaus on poistettu käytöstä laitekäytännön perusteella"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tyhjennä kaikki"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Kokeile toista PIN-koodia"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Vahvista muutos: <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Pyyhkäise nähdäksesi lisää"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Ladataan suosituksia"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Piilotetaanko mediaohjain (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant on aktiivinen"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Aseta oletusmuistiinpanosovellus Asetuksista"</string>
<string name="install_app" msgid="5066668100199613936">"Asenna sovellus"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8a74f8a7d1ff..d2a5ae564c96 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Erreur d\'enregistrement de l\'écran"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Une erreur s\'est produite lors du démarrage de l\'enregistrement d\'écran"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Affichage plein écran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Pour quitter, balayez vers le bas à partir du haut."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Pour quitter, balayez du haut vers le bas."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Précédent"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Domicile"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Visage reconnu. Appuyez pour continuer."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur Déverrouiller pour continuer."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un NIP"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Déverrouillé avec le visage"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Visage reconnu"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Balayez l\'écran vers le haut pour réessayer"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Déverrouillez l\'écran pour utiliser la CCP"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Cet appareil appartient à votre organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Lorsque vous partagez, enregistrez ou diffusez, Android a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Par conséquent, soyez prudent avec les mots de passe, les détails du paiement, les messages, les photos et les contenus audio et vidéo."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Lorsque vous partagez, enregistrez ou diffusez une application, Android a accès à tout ce qui est visible sur votre écran ou lu sur cette application. Par conséquent, soyez prudent avec les mots de passe, les détails du paiement, les messages, les photos et les contenus audio et vidéo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Commencer"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Le partage s\'interrompt lorsque vous changez d\'application"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Partager plutôt cette application"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Revenir en arrière"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Commutateur d\'application"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloquée par votre administrateur informatique"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"La fonctionnalité de capture d\'écran est désactivée par l\'application Device Policy"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Essayez un autre NIP"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirmer la modification pour <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Balayez l\'écran pour en afficher davantage"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Chargement des recommandations…"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Commandes multimédias"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Masquer ce contrôleur de contenu multimédia pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant à l\'écoute"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir l\'application de prise de notes par défaut dans les Paramètres"</string>
<string name="install_app" msgid="5066668100199613936">"Installer l\'application"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 5fe8f558d123..9ec1184282a9 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Visage reconnu. Appuyez pour continuer."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur l\'icône de déverrouillage pour continuer."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un code PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Déverrouillé par le visage"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Visage reconnu"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Balayez l\'écran vers le haut pour réessayer"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Déverrouillez l\'écran pour pouvoir utiliser le NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Cet appareil appartient à votre organisation"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Cet appareil appartient à <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Lorsque vous partagez, enregistrez ou castez, Android a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages, photos et contenus audio et vidéo."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Lorsque vous partagez, enregistrez ou castez une appli, Android a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages et contenus audio et vidéo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Commencer"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Le partage est suspendu pendant le changement d\'application"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Partager cette application à la place"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Revenir"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Changement d\'application"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqué par votre administrateur informatique"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"La capture d\'écran est désactivée conformément aux règles relatives à l\'appareil"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Essayez un autre code PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirmer la modification pour <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Balayer l\'écran pour voir plus d\'annonces"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Chargement des recommandations"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimédia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Masquer cette commande multimédia pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant à l\'écoute"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir une appli de notes par défaut dans les paramètres"</string>
<string name="install_app" msgid="5066668100199613936">"Installer l\'appli"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 804aeca026af..95c0e8481253 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Recoñeceuse a cara. Preme para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Recoñeceuse a cara. Preme a icona de desbloquear."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contrasinal"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Usouse o desbloqueo facial"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Recoñeceuse a cara"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Pasa o dedo cara arriba para tentalo de novo"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloquea o dispositivo para utilizar a NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertence á túa organización."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertence a <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Cando compartes, gravas ou emites contido, Android ten acceso a todo o que se vexa na pantalla ou se reproduza no teu dispositivo. Polo tanto, debes ter coidado con determinada información, como os contrasinais, os detalles de pago, as mensaxes e as fotos, así como o contido de audio e de vídeo."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Cando compartes, gravas ou emites unha aplicación, Android ten acceso a todo o que se vexa ou se reproduza nela. Polo tanto, debes ter coidado con determinada información, como os contrasinais, os detalles de pago, as mensaxes e as fotos, así como o contido de audio e de vídeo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Iniciar"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Cando cambias de aplicación, ponse en pausa o uso compartido"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Compartir esta aplicación"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Volver"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Cambio de aplicación"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"O teu administrador de TI bloqueou esta aplicación"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"A política do dispositivo desactivou a opción de capturar a pantalla"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Eliminar todo"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Proba con outro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirma o cambio para <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Pasar o dedo para ver máis"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Cargando recomendacións"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Contido multimedia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Queres ocultar este control multimedia para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"A atención do Asistente está activada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Establece a aplicación de notas predeterminada en Configuración"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index cfd5a360c85d..3000b578e64c 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"જોવા માટે ટૅપ કરો"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"સ્ક્રીન રેકોર્ડિંગ સાચવવામાં ભૂલ આવી"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"સ્ક્રીનને રેકૉર્ડ કરવાનું શરૂ કરવામાં ભૂલ"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"પૂર્ણ સ્ક્રીન પર જુઓ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"બહાર નીકળવા માટે, ટોચ પરથી નીચે સ્વાઇપ કરો."</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"પૂર્ણ સ્ક્રીન જોઈ રહ્યાં છે"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"બહાર નીકળવા માટે, સૌથી ઉપરથી નીચેની તરફ સ્વાઇપ કરો."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"સમજાઈ ગયું"</string>
<string name="accessibility_back" msgid="6530104400086152611">"પાછળ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"હોમ"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ચહેરો ઓળખ્યો. આગળ વધવા માટે દબાવો."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ચહેરો ઓળખ્યો. આગળ વધવા \'અનલૉક કરો\' આઇકન દબાવો."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"પ્રમાણિત"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"પિનનો ઉપયોગ કરો"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"પૅટર્નનો ઉપયોગ કરો"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"પાસવર્ડનો ઉપયોગ કરો"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ચહેરા દ્વારા અનલૉક કર્યું"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ચહેરો ઓળખ્યો"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ફરી પ્રયાસ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFCનો ઉપયોગ કરવા માટે અનલૉક કરો"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"આ ડિવાઇસ તમારી સંસ્થાની માલિકીનું છે"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"આ ડિવાઇસ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ની માલિકીનું છે"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"જ્યારે તમે શેર, રેકોર્ડ અથવા કાસ્ટ કરી રહ્યાં હો, ત્યારે તમારી સ્ક્રીન પર દેખાતી હોય કે તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી બધી વસ્તુનો ઍક્સેસ Android પાસે હોય છે. તેથી પાસવર્ડ, ચુકવણીની વિગતો, મેસેજ, ફોટા અને ડિવાઇસ પર વાગી રહેલા ઑડિયો તથા વીડિયો જેવી બાબતોને લઈને સાવચેત રહો."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"જ્યારે તમે કોઈ ઍપ શેર, રેકોર્ડ અથવા કાસ્ટ કરી રહ્યાં હો, ત્યારે તે ઍપ પર બતાવવામાં કે ચલાવવામાં આવતી હોય તેવી બધી વસ્તુનો ઍક્સેસ Android પાસે હોય છે. તેથી પાસવર્ડ, ચુકવણીની વિગતો, મેસેજ, ફોટા અને ડિવાઇસ પર વાગી રહેલા ઑડિયો તથા વીડિયો જેવી બાબતોને લઈને સાવચેત રહો."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"શરૂ કરો"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"તમે ઍપ સ્વિચ કરો ત્યારે શેરિંગ થોભી જાય છે"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"તેના બદલે આ ઍપ શેર કરો"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"પાછળ સ્વિચ કરો"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ઍપ સ્વિચ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"તમારા IT ઍડમિન દ્વારા બ્લૉક કરાયેલી"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ડિવાઇસ પૉલિસી અનુસાર સ્ક્રીન કૅપ્ચર કરવાની સુવિધા બંધ કરવામાં આવી છે"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"બધુ સાફ કરો"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"બીજા પિનને અજમાવી જુઓ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> માટે ફેરફાર કન્ફર્મ કરો"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"વધુ જોવા માટે સ્વાઇપ કરો"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"સુઝાવ લોડ કરી રહ્યાં છીએ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"મીડિયા"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"શું <xliff:g id="APP_NAME">%1$s</xliff:g> માટે મીડિયાના નિયંત્રણો છુપાવીએ?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant સક્રિય છે"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"સેટિંગમાં નોંધની ડિફૉલ્ટ ઍપ સેટ કરો"</string>
<string name="install_app" msgid="5066668100199613936">"ઍપ ઇન્સ્ટૉલ કરો"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 194321af397e..5898a7e34ba9 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरे की पहचान हो गई. जारी रखने के लिए टैप करें."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरे की पहचान हो गई. जारी रखने के लिए अनलॉक आइकॉन को टैप करें."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"पुष्टि हो गई"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन इस्तेमाल करें"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पैटर्न इस्तेमाल करें"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड इस्तेमाल करें"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"चेहरे से अनलॉक किया गया"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"चेहरे की पहचान हो गई"</string>
<string name="keyguard_retry" msgid="886802522584053523">"फिर से कोशिश करने के लिए ऊपर की ओर स्वाइप करें"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"एनएफ़सी इस्तेमाल करने के लिए स्क्रीन को अनलॉक करें"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"इस डिवाइस का मालिकाना हक आपके संगठन के पास है"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"इस डिवाइस का मालिकाना हक <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> के पास है"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"शेयर, रिकॉर्ड या कास्ट करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"किसी ऐप्लिकेशन को शेयर, रिकॉर्ड या कास्ट करते समय, Android के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"शुरू करें"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ऐप्लिकेशन स्विच करते समय शेयर करने की प्रोसेस रुक जाती है"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"इसके बजाय, यह ऐप्लिकेशन शेयर करें"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"वापस जाएं"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ऐप्लिकेशन स्विच करें"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"आपके आईटी एडमिन ने स्क्रीन कैप्चर करने की सुविधा पर रोक लगाई है"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"डिवाइस से जुड़ी नीति के तहत स्क्रीन कैप्चर करने की सुविधा बंद है"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सभी को हटाएं"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"कोई और पिन आज़माएं"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> में बदलाव के लिए पुष्टि करें"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ज़्यादा देखने के लिए स्वाइप करें"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"सुझाव लोड हो रहे हैं"</string>
<string name="controls_media_title" msgid="1746947284862928133">"मीडिया"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए, इस मीडिया कंट्रोल को छिपाना है?"</string>
@@ -1156,7 +1158,7 @@
<string name="call_from_work_profile_action" msgid="2937701298133010724">"वर्क प्रोफ़ाइल पर स्विच करें"</string>
<string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"वर्क प्रोफ़ाइल वाला फ़ोन ऐप्लिकेशन इंस्टॉल करें"</string>
<string name="call_from_work_profile_close" msgid="5830072964434474143">"रद्द करें"</string>
- <string name="lock_screen_settings" msgid="6152703934761402399">"लॉक स्क्रीन को कस्टमाइज़ करें"</string>
+ <string name="lock_screen_settings" msgid="6152703934761402399">"लॉक स्क्रीन को पसंद के मुताबिक बनाएं"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"लॉक स्क्रीन को पसंद के मुताबिक बनाने के लिए अनलॉक करें"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"वाई-फ़ाई उपलब्ध नहीं है"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कैमरे का ऐक्सेस नहीं है"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant आपकी बातें सुन रही है"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग में जाकर, नोट लेने की सुविधा देने वाले ऐप्लिकेशन को डिफ़ॉल्ट के तौर पर सेट करें"</string>
<string name="install_app" msgid="5066668100199613936">"ऐप्लिकेशन इंस्टॉल करें"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 7fbc100fc585..d7c9b7632b44 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Lice je prepoznato. Pritisnite da biste nastavili."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice je prepoznato. Pritisnite ikonu otključavanja da biste nastavili."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikacija izvršena"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkaži autentifikaciju"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite uzorak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite zaporku"</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Otključano licem"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Lice je prepoznato"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Prijeđite prstom prema gore za ponovni pokušaj"</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Prijeđite prstom prema gore da biste ponovo isprobali otključavanje licem"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Otključajte da biste upotrijebili NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ovaj uređaj pripada vašoj organizaciji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ovaj uređaj pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +417,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kad dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kad dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Dijeljenje pauza tijekom prebacivanja aplikacija"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Umjesto toga podijelite ovu aplikaciju"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Promjena računa"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Prekidač aplikacije"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokirao vaš IT administrator"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Snimanje zaslona onemogućeno je u skladu s pravilima za uređaje"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši sve"</string>
@@ -940,6 +938,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Pokušajte s drugim PIN-om"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdite promjenu za uređaj <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Prijeđite prstom da vidite više"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Učitavanje preporuka"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Mediji"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Želite li sakriti kontroler medija za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -949,7 +949,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g>, <xliff:g id="ARTIST_NAME">%2$s</xliff:g> reproducira se putem aplikacije <xliff:g id="APP_LABEL">%3$s</xliff:g>"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> od <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvodi"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"Reproduciraj"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"Pauziraj"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"Prethodni zapis"</string>
@@ -1166,4 +1166,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Pažnja Asistenta je aktivirana"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u postavkama"</string>
<string name="install_app" msgid="5066668100199613936">"Instalacija"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 1c46c441a04f..5ee176dbd000 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Arc felismerve. Koppintson a folytatáshoz."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Arc felismerve. A folytatáshoz koppintson a Feloldásra."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Hitelesítve"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-kód használata"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Minta használata"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Jelszó használata"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Zárolás arccal feloldva"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Arc felismerve"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Az újrapróbálkozáshoz csúsztassa felfelé az ujját"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Az NFC használatához oldja fel a képernyőzárat"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ez az eszköz az Ön szervezetének tulajdonában van"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ez az eszköz a(z) <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tulajdonában van"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Amikor Ön megosztást, rögzítést vagy átküldést végez, az Android a képernyőn látható vagy az eszközön lejátszott minden tartalomhoz hozzáfér. Ezért legyen elővigyázatos a jelszavakkal, a fizetési adatokkal, az üzenetekkel, a fotókkal, valamint a hang- és videófelvételekkel."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Amikor Ön megoszt, rögzít vagy átküld egy alkalmazást, az Android az adott alkalmazásban látható vagy lejátszott minden tartalomhoz hozzáfér. Ezért legyen elővigyázatos a jelszavakkal, a fizetési adatokkal, az üzenetekkel, a fotókkal, valamint a hang- és videófelvételekkel."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Indítás"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"A megosztás szünetel alkalmazásváltáskor"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Inkább ennek az appnak a megosztása"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Visszaváltás"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Alkalmazásváltás"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Rendszergazda által letiltva"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"A képernyőfelvételt eszközszabályzat tiltja"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Az összes törlése"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Próbálkozzon másik kóddal"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"A(z) <xliff:g id="DEVICE">%s</xliff:g> módosításának megerősítése"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Továbbiak megtekintéséhez csúsztasson"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Javaslatok betöltése…"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Média"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Elrejti ezt a(z) <xliff:g id="APP_NAME">%1$s</xliff:g>-médiavezérlőt?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"A Segéd figyel"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Állítson be alapértelmezett jegyzetkészítő alkalmazást a Beállításokban"</string>
<string name="install_app" msgid="5066668100199613936">"Alkalmazás telepítése"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index afd8b66dc859..ecd904bde209 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -118,9 +118,9 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Հպեք՝ դիտելու համար"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Չհաջողվեց պահել էկրանի տեսագրությունը"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Չհաջողվեց սկսել տեսագրումը"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Լիաէկրան դիտում"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Դուրս գալու համար վերևից սահահարվածեք դեպի ներքև:"</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"Պարզ է"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Լիաէկրան դիտակերպ"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Դուրս գալու համար վերևից մատը սահեցրեք դեպի ներքև։"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"Եղավ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Հետ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Տուն"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Ցանկ"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Դեմքը ճանաչվեց։ Սեղմեք շարունակելու համար։"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Դեմքը ճանաչվեց։ Սեղմեք ապակողպման պատկերակը։"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Նույնականացված է"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Օգտագործել PIN կոդ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Օգտագործել նախշ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Օգտագործել գաղտնաբառ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Ապակողպվեց դեմքով"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Դեմքը ճանաչվեց"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Սահեցրեք վերև՝ նորից փորձելու համար"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ապակողպեք՝ NFC-ն օգտագործելու համար"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Այս սարքը պատկանում է ձեր ընկերությանը"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Այս սարքը պատկանում է «<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>» կազմակերպությանը"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Երբ դուք ցուցադրում, տեսագրում կամ հեռարձակում եք էկրանը, Android-ին հասանելի է լինում այն ամենը, ինչ տեսանելի է ձեր էկրանին և նվագարկվում է ձեր սարքում։ Ուստի ուշադիր եղեք այնպիսի բաների հետ, ինչպիսիք են գաղտնաբառերը, վճարային տվյալները, հաղորդագրությունները, լուսանկարները, աուդիո և վիդեո բովանդակությունը։"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Երբ դուք ցուցադրում, տեսագրում կամ հեռարձակում եք որևէ հավելվածի էկրանը, Android-ին հասանելի է լինում այն ամենը, ինչ ցուցադրվում է կամ նվագարկվում այդ հավելվածում։ Ուստի ուշադիր եղեք այնպիսի բաների հետ, ինչպիսիք են գաղտնաբառերը, վճարային տվյալները, հաղորդագրությունները, լուսանկարները, աուդիո և վիդեո բովանդակությունը։"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Սկսել"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Երբ անցում եք կատարում մեկ այլ հավելվածի, ընթացիկ հավելվածի համատեղ օգտագործումը դադարեցվում է"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Փոխարենը կիսվել այս հավելվածով"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Վերադառնալ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Հավելվածների փոխանջատիչ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Արգելափակվել է ձեր ՏՏ ադմինիստրատորի կողմից"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Էկրանի տեսագրումն անջատված է սարքի կանոնների համաձայն"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Մաքրել բոլորը"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Փորձեք մեկ այլ PIN կոդ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Հաստատեք փոփոխությունը <xliff:g id="DEVICE">%s</xliff:g> սարքի համար"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Սահեցրեք մատը՝ ավելին իմանալու համար"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Բեռնման խորհուրդներ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Մեդիա"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Թաքցնե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g>-ի մեդիա աշխատաշրջանի կառավարման տարրը։"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Օգնականը լսում է"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Կարգավորեք նշումների կանխադրված հավելված Կարգավորումներում"</string>
<string name="install_app" msgid="5066668100199613936">"Տեղադրել հավելվածը"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index f5564ba4b446..5ac5d4117c67 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -120,7 +120,7 @@
<string name="screenrecord_start_error" msgid="2200660692479682368">"Terjadi error saat memulai perekaman layar"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Melihat layar penuh"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Untuk keluar, geser layar ke bawah dari atas."</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"Mengerti"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"Oke"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Kembali"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Utama"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Menu"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Wajah dikenali. Tekan untuk melanjutkan."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dikenali. Tekan ikon buka kunci untuk melanjutkan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Diautentikasi"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan pola"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan sandi"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Kunci dibuka dengan wajah"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Wajah dikenali"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Geser ke atas untuk mencoba lagi"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Buka kunci untuk menggunakan NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Perangkat ini milik organisasi Anda"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Perangkat ini milik <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Jika Anda membagikan, merekam, atau mentransmisikan, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Jika Anda membagikan, merekam, atau mentransmisikan suatu aplikasi, Android akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Mulai"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Berbagi akan dijeda saat Anda beralih aplikasi"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Bagikan aplikasi ini"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Beralih kembali"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Beralih aplikasi"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Diblokir oleh admin IT Anda"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Pengambilan screenshot dinonaktifkan oleh kebijakan perangkat"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hapus semua"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Coba PIN lain"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Konfirmasi perubahan untuk <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Geser untuk melihat selengkapnya"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Memuat rekomendasi"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Sembunyikan kontrol media untuk <xliff:g id="APP_NAME">%1$s</xliff:g> ini?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asisten sedang memerhatikan"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setel aplikasi catatan default di Setelan"</string>
<string name="install_app" msgid="5066668100199613936">"Instal aplikasi"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 647d1c49af71..923a5f3e9cca 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Villa við að vista skjáupptöku"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Villa við að hefja upptöku skjás"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Notar allan skjáinn"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Strjúktu niður frá efri brún til að hætta."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Strjúktu niður frá efsta hluta skjásins til að hætta."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ég skil"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Til baka"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Heim"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Andlitið var greint. Ýttu til að halda áfram."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Andlitið var greint. Ýttu á opnunartáknið til að halda áfr."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Auðkennt"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Nota PIN-númer"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Nota mynstur"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Nota aðgangsorð"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Opnað með andliti"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Andlitið var greint"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Strjúktu upp til að reyna aftur"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Taktu úr lás til að nota NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Þetta tæki tilheyrir fyrirtækinu þínu"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Þetta tæki tilheyrir <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Þegar þú deilir, tekur upp eða varpar hefur Android aðgang að öllu sem sést á skjánum eða spilast í tækinu. Passaðu því upp á aðgangsorð, greiðsluupplýsingar, skilaboð, myndir, hljóð og myndskeið."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Þegar þú deilir, tekur upp eða varpar forriti hefur Android aðgang að öllu sem sést eða spilast í viðkomandi forriti. Passaðu því upp á aðgangsorð, greiðsluupplýsingar, skilaboð, myndir, hljóð og myndskeið."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Byrja"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Hlé er gert á samnýtingu þegar þú skiptir um forrit"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Deila frekar þessu forriti"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Skipta til baka"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Skipta um forrit"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Útilokað af kerfisstjóra"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Slökkt er á skjáupptöku í tækjareglum"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hreinsa allt"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prófaðu annað PIN-númer"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Staðfesta breytingu fyrir <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Strjúktu til að sjá meira"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Hleður tillögum"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Margmiðlunarefni"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Fela þessa efnisstýringu fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Hjálparinn er að hlusta"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stilltu sjálfgefið glósuforrit í stillingunum"</string>
<string name="install_app" msgid="5066668100199613936">"Setja upp forrit"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 3b60f427e211..82dd72aef70d 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Volto riconosciuto. Premi per continuare."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Volto riconosciuto. Premi l\'icona Sblocca e continua."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticazione eseguita"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilizza PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usa sequenza"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilizza password"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Sbloccato con il volto"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Volto riconosciuto"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Scorri verso l\'alto per riprovare"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Sblocca per usare NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Questo dispositivo appartiene alla tua organizzazione"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Questo dispositivo appartiene a <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quando condividi, registri o trasmetti, Android ha accesso a qualsiasi elemento visibile sul tuo schermo o in riproduzione sul tuo dispositivo. Presta quindi attenzione a password, dettagli sui pagamenti, messaggi, foto, audio e video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quando condividi, registri o trasmetti un\'app, Android ha accesso a qualsiasi elemento visualizzato o riprodotto sull\'app. Presta quindi attenzione a password, dettagli sui pagamenti, messaggi, foto, audio e video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Inizia"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"La condivisione viene messa in pausa quando cambi app"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Condividi invece questa app"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Torna indietro"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Cambio app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloccata dall\'amministratore IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"L\'acquisizione schermo è disattivata dai criteri relativi ai dispositivi"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Cancella tutto"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prova con un altro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Conferma modifica per <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Scorri per vedere altro"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Caricamento dei consigli"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Contenuti multimediali"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Nascondere questo controllo multimediale per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"L\'assistente è attivo"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Imposta l\'app per le note predefinita nelle Impostazioni"</string>
<string name="install_app" msgid="5066668100199613936">"Installa app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 121e5be22a2e..ad17584821e0 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"שגיאה בשמירה של הקלטת המסך"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"שגיאה בהפעלה של הקלטת המסך"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"צפייה במסך מלא"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"כדי לצאת, מחליקים למטה מהחלק העליון של המסך."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"הבנתי"</string>
<string name="accessibility_back" msgid="6530104400086152611">"חזרה"</string>
<string name="accessibility_home" msgid="5430449841237966217">"בית"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"הפנים זוהו. יש ללחוץ כדי להמשיך."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"הפנים זוהו. להמשך יש ללחוץ על סמל ביטול הנעילה."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"מאומת"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"שימוש בקוד אימות"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"שימוש בקו ביטול נעילה"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"שימוש בסיסמה"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"הנעילה בוטלה באמצעות זיהוי הפנים"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"הפנים זוהו"</string>
<string name="keyguard_retry" msgid="886802522584053523">"יש להחליק למעלה כדי לנסות שוב"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"‏יש לבטל את הנעילה כדי להשתמש ב-NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"המכשיר הזה שייך לארגון שלך"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"המכשיר הזה שייך לארגון <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"‏בזמן שיתוף, הקלטה או העברה (cast) תהיה ל-Android גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"‏בזמן שיתוף, הקלטה או העברה (cast) של אפליקציה, תהיה ל-Android גישה לכל מה שגלוי באפליקציה או מופעל מהאפליקציה. מומלץ להיזהר עם סיסמאות, פרטי תשלום, הודעות, תמונות, אודיו וסרטונים."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"התחלה"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"השיתוף מושהה כשמחליפים אפליקציות"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"שיתוף של האפליקציה הזו במקום"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"חזרה למשימה הקודמת"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"החלפת אפליקציה"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"‏האפשרות נחסמה על ידי אדמין ב-IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"צילום המסך מושבת בגלל מדיניות המכשיר"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכול"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"יש לנסות קוד אימות אחר"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"יש לאשר את השינוי עבור <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"יש להחליק כדי להציג עוד פריטים"</string>
+ <string name="retry_face" msgid="416380073082560186">"איך מנסים שוב לזהות את הפנים לצורך אימות"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ההמלצות בטעינה"</string>
<string name="controls_media_title" msgid="1746947284862928133">"מדיה"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"להסתיר את בקר המדיה הזה לאפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"‏Assistant מאזינה"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"צריך להגדיר את אפליקציית ברירת המחדל לפתקים ב\'הגדרות\'"</string>
<string name="install_app" msgid="5066668100199613936">"התקנת האפליקציה"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"מיקרופון ומצלמה"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"נעשה שימוש לאחרונה באפליקציה"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"צפייה בהרשאות הגישה האחרונות"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"סיום"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"הרחבה והצגת האפשרויות"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"כיווץ"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"סגירת האפליקציה הזו"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"אפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> סגורה"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"ניהול השירות"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"ניהול הרשאות הגישה"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"בשימוש על ידי שיחת טלפון"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"נעשה שימוש לאחרונה על ידי שיחת טלפון"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"בשימוש על ידי <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"נעשה שימוש לאחרונה על ידי <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"בשימוש על ידי <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"נעשה שימוש לאחרונה על ידי <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"בשימוש על ידי <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"נעשה שימוש לאחרונה על ידי <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 383d9f481952..34239f35a854 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"顔を認識しました。押して続行してください。"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"顔を認識しました。ロック解除アイコンを押して続行します。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"認証済み"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN を使用"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"パターンを使用"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"パスワードを使用"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"顔でロック解除しました"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"顔を認識しました"</string>
<string name="keyguard_retry" msgid="886802522584053523">"上にスワイプしてもう一度お試しください"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC を使用するには、ロックを解除してください"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"これは組織が所有するデバイスです"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"これは <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> が所有するデバイスです"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"共有、録画、キャスト中は、画面に表示される内容やデバイスで再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"アプリの共有、録画、キャスト中は、そのアプリで表示または再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"開始"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"アプリを切り替えるときに共有を一時停止します"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"代わりにこのアプリを共有する"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"切り替える"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"アプリの切り替え"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IT 管理者によりブロックされました"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"デバイス ポリシーに基づき、画面のキャプチャが無効になりました"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"すべて消去"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"別の PIN をお試しください"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>の変更を確認する"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"スワイプすると他の構造が表示されます"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"候補を読み込んでいます"</string>
<string name="controls_media_title" msgid="1746947284862928133">"メディア"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> のこのコントロールを非表示にしますか?"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g>(アーティスト名: <xliff:g id="ARTIST_NAME">%2$s</xliff:g>)が <xliff:g id="APP_LABEL">%3$s</xliff:g> で再生中"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g>/<xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> を実行しています"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> を実行中"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"再生"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"一時停止"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"前のトラック"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"アシスタントは起動済みです"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"[設定] でデフォルトのメモアプリを設定してください"</string>
<string name="install_app" msgid="5066668100199613936">"アプリをインストール"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 943b288558c6..deaa8e2392e4 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ამოცნობილია სახით. დააჭირეთ გასაგრძელებლად."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ამოცნობილია სახით. გასაგრძელებლად დააჭირეთ განბლოკვის ხატულას."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ავტორიზებულია"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-კოდის გამოყენება"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ნიმუშის გამოყენება"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"პაროლის გამოყენება"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"განიბლოკა სახით"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"სახე ამოცნობილია"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ხელახლა საცდელად გადაფურცლეთ ზემოთ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"განბლოკეთ NFC-ის გამოსაყენებლად"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ამ მოწყობილობას ფლობს თქვენი ორგანიზაცია"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ამ მოწყობილობას ფლობს <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"გაზიარებისას, ჩაწერისას ან ტრანსლირებისას, Android-ს წვდომა აქვს ყველაფერზე, რაც ჩანს თქვენს ეკრანზე ან უკრავს თქვენს მოწყობილობაზე. ამიტომ იყავით ფრთხილად ისეთ ინფორმაციასთან, როგორიცაა პაროლები, გადახდის დეტალები, შეტყობინებები, ფოტოები, აუდიო და ვიდეო."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"აპის გაზიარებისას, ჩაწერისას ან ტრანსლირებისას, Android-ს წვდომა აქვს ყველაფერზე, რაც ჩანს ან იკვრება აპში. ამიტომ იყავით ფრთხილად ისეთ ინფორმაციასთან, როგორიცაა პაროლები, გადახდის დეტალები, შეტყობინებები, ფოტოები, აუდიო და ვიდეო."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"დაწყება"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"აპების გადართვისას გაზიარება პაუზდება"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"სანაცვლოდ ამ აპის გაზიარება"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"უკან გადართვა"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"აპის გადამრთველი"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"დაბლოკილია თქვენი IT-ადმინისტრატორის მიერ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ეკრანის აღბეჭდვა გამორთულია მოწყობილობის წესების თანახმად"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ყველას გასუფთავება"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"სხვა PIN-კოდის ცდა"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"დაადასტურეთ ცვლილება <xliff:g id="DEVICE">%s</xliff:g>-ისთვის"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"გადაფურცლეთ მეტის სანახავად"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"მიმდინარეობს რეკომენდაციების ჩატვირთვა"</string>
<string name="controls_media_title" msgid="1746947284862928133">"მედია"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"დაიმალოს მედიის ეს კონტროლერი <xliff:g id="APP_NAME">%1$s</xliff:g> აპში?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"ასისტენტის ყურადღების ფუნქცია ჩართულია"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"დააყენეთ ნაგულისხმევი შენიშვნების აპი პარამეტრებში"</string>
<string name="install_app" msgid="5066668100199613936">"აპის ინსტალაცია"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index a80dcfbb936b..70b1ffe2cae1 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Бет танылды. Жалғастыру үшін басыңыз."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Бет танылды. Жалғастыру үшін құлыпты ашу белгішесін басыңыз."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификацияланған"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодын пайдалану"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Өрнекті пайдалану"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Құпия сөзді пайдалану"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Бетпен ашылды."</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Бет танылды."</string>
<string name="keyguard_retry" msgid="886802522584053523">"Әрекетті қайталау үшін жоғары сырғытыңыз."</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC пайдалану үшін құлыпты ашыңыз."</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Бұл құрылғы ұйымыңызға тиесілі."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Бұл құрылғы <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ұйымына тиесілі."</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлісу, жазу не трансляциялау кезінде Android жүйесі экраныңызда көрінетін не құрылғыңызда ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Қолданба экранын бөлісу, жазу не трансляциялау кезінде Android жүйесі онда көрінетін не ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Бастау"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Қолданба ауыстырғанда, бөлісу кідіртіледі."</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Орнына осы қолданбаны бөлісу"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Қайта ауысу"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Қолданба ауыстыру"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Әкімшіңіз бөгеген"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Құрылғы саясатына байланысты экранды түсіру өшірілді."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Барлығын тазарту"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Басқа PIN кодын енгізіңіз"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> құрылғысындағы өзгерісті растау"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Толығырақ ақпарат алу үшін сырғытыңыз."</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Жүктеуге қатысты ұсыныстар"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Мультимедиа"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін медиа контроллері жасырылсын ба?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant қосулы."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден әдепкі жазба қолданбасын орнатыңыз."</string>
<string name="install_app" msgid="5066668100199613936">"Қолданбаны орнату"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 702b9cba0bb4..0ffb83ab6c15 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"បានស្គាល់មុខ។ សូមចុច ដើម្បីបន្ត។"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"បានស្គាល់មុខ។ សូមចុចរូបដោះសោ ដើម្បីបន្ត។"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"បាន​ផ្ទៀងផ្ទាត់"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ប្រើកូដ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ប្រើ​លំនាំ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ប្រើពាក្យសម្ងាត់"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"បានដោះសោដោយប្រើមុខ"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"បានស្គាល់មុខ"</string>
<string name="keyguard_retry" msgid="886802522584053523">"អូសឡើងលើ ដើម្បី​ព្យាយាម​ម្ដងទៀត"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"ដោះសោ ដើម្បីប្រើ NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ឧបករណ៍​នេះគឺជា​កម្មសិទ្ធិរបស់​ស្ថាប័ន​អ្នក"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ឧបករណ៍នេះ​គឺជា​កម្មសិទ្ធិ​របស់ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"នៅពេលអ្នកកំពុងចែករំលែក ថត ឬភ្ជាប់, Android មានសិទ្ធិចូលប្រើអ្វីៗដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬចាក់នៅលើឧបករណ៍របស់អ្នក។ ដូច្នេះ សូមប្រុងប្រយ័ត្នចំពោះអ្វីៗដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ សារ រូបថត ព្រមទាំងសំឡេង និងវីដេអូ។"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"នៅពេលអ្នកកំពុងចែករំលែក ថត ឬភ្ជាប់កម្មវិធី, Android មានសិទ្ធិចូលប្រើអ្វីៗដែលបង្ហាញ ឬចាក់នៅលើកម្មវិធីនោះ។ ដូច្នេះ សូមប្រុងប្រយ័ត្នចំពោះអ្វីៗដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ សារ រូបថត ព្រមទាំងសំឡេង និងវីដេអូ។"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ចាប់ផ្ដើម"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ការចែករំលែក​ផ្អាក នៅពេលដែល​អ្នកប្ដូរ​កម្មវិធី"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ចែករំលែក​កម្មវិធីនេះ​ជំនួសវិញ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ប្ដូរទៅវិញ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ការប្ដូរ​កម្មវិធី"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"បានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រង​ផ្នែកព័ត៌មានវិទ្យា​របស់អ្នក"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ការថតអេក្រង់ត្រូវបានបិទ​ដោយគោលការណ៍ឧបករណ៍"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"សម្អាត​ទាំងអស់"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"សាកល្បងប្រើ​កូដ PIN ផ្សេងទៀត"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"បញ្ជាក់​ការផ្លាស់ប្ដូរ​សម្រាប់ <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"អូសដើម្បី​មើលច្រើនទៀត"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"កំពុងផ្ទុក​ការណែនាំ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"មេឌៀ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"លាក់ផ្ទាំង​គ្រប់គ្រង​មេឌៀនេះសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"ភាពប្រុងប្រៀប​របស់ Google Assistant ត្រូវបានបើក"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"កំណត់កម្មវិធីកំណត់ចំណាំលំនាំដើមនៅក្នុងការកំណត់"</string>
<string name="install_app" msgid="5066668100199613936">"ដំឡើង​កម្មវិធី"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 544af6a7c787..3f89e3e59328 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಒತ್ತಿ."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಅನ್‌ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ಪಿನ್ ಬಳಸಿ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ಪ್ಯಾಟರ್ನ್ ಬಳಸಿ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ಪಾಸ್‌ವರ್ಡ್ ಬಳಸಿ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ಮುಖದ ಮೂಲಕ ಅನ್‌ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ಬಳಸಲು ಅನ್‌ಲಾಕ್ ಮಾಡಿ"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ಈ ಸಾಧನವು ನಿಮ್ಮ ಸಂಸ್ಥೆಗೆ ಸೇರಿದೆ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ಈ ಸಾಧನವು <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ಗೆ ಸೇರಿದೆ"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ನೀವು ಹಂಚಿಕೊಳ್ಳುತ್ತಿರುವಾಗ, ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುತ್ತಿರುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿರುವಾಗ, ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುತ್ತಿರುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ಆ ಆ್ಯಪ್‌ನಲ್ಲಿ ತೋರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ಪ್ರಾರಂಭಿಸಿ"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ನೀವು ಆ್ಯಪ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿದಾಗ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗುತ್ತದೆ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ಬದಲಿಗೆ ಈ ಆ್ಯಪ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ಮರಳಿ ಬದಲಿಸಿ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ಆ್ಯಪ್ ಸ್ವಿಚ್"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ಸಾಧನ ನೀತಿಯಿಂದ ಸ್ಕ್ರೀನ್ ಕ್ಯಾಪ್ಚರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ಮತ್ತೊಂದು ಪಿನ್ ಅನ್ನು ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ಸಾಧನಕ್ಕಾಗಿ ಬದಲಾವಣೆಯನ್ನು ದೃಢೀಕರಿಸಿ"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ಇನ್ನಷ್ಟು ನೋಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
+ <string name="retry_face" msgid="416380073082560186">"ಮುಖದ ದೃಢೀಕರಣವನ್ನು ಮರುಪ್ರಯತ್ನಿಸಿ"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ಶಿಫಾರಸುಗಳು ಲೋಡ್ ಆಗುತ್ತಿವೆ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ಮಾಧ್ಯಮ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಈ ಮಾಧ್ಯಮ ಕಂಟ್ರೋಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಬೇಕೆ?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ನಿಮ್ಮ ಮಾತನ್ನು ಆಲಿಸುತ್ತಿದೆ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string>
<string name="install_app" msgid="5066668100199613936">"ಆ್ಯಪ್ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"ಮೈಕ್ರೊಫೋನ್ ಮತ್ತು ಕ್ಯಾಮರಾ"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ ಬಳಕೆ"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"ಇತ್ತೀಚಿನ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನೋಡಿ"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"ಮುಗಿದಿದೆ"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"ಆಯ್ಕೆಗಳನ್ನು ವಿಸ್ತೃತಗೊಳಿಸಿ ಮತ್ತು ತೋರಿಸಿ"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"ಕುಗ್ಗಿಸಿ"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"ಈ ಆ್ಯಪ್‌ ಅನ್ನು ಮುಚ್ಚಿ"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"ಸೇವೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"ಫೋನ್ ಕರೆ ಮೂಲಕ ಬಳಕೆಯಲ್ಲಿದೆ"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"ಫೋನ್ ಕರೆಯಲ್ಲಿ ಇತ್ತೀಚಿಗೆ ಬಳಸಲಾಗಿದೆ"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಂದ ಬಳಕೆಯಲ್ಲಿದೆ"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"ಇತ್ತೀಚೆಗೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಇದನ್ನು ಬಳಸಿದೆ"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಂದ ಬಳಕೆಯಲ್ಲಿದೆ (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"ಇತ್ತೀಚೆಗೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಇದನ್ನು ಬಳಸಿದೆ (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಂದ ಬಳಕೆಯಲ್ಲಿದೆ (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"ಇತ್ತೀಚೆಗೆ <xliff:g id="APP_NAME">%1$s</xliff:g> ಇದನ್ನು ಬಳಸಿದೆ (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index bd58c0fed370..3b92dbb0e1f7 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"얼굴이 인식되었습니다. 계속하려면 누르세요."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"얼굴이 인식되었습니다. 계속하려면 아이콘을 누르세요."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"인증됨"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN 사용"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"패턴 사용"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"비밀번호 사용"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"얼굴 인식으로 잠금 해제되었습니다."</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"얼굴이 인식되었습니다."</string>
<string name="keyguard_retry" msgid="886802522584053523">"위로 스와이프하여 다시 시도해 주세요"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"잠금 해제하여 NFC 사용"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"내 조직에 속한 기기입니다."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>에 속한 기기입니다."</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"공유, 녹화 또는 전송 중에 Android가 화면에 표시되거나 기기에서 재생되는 모든 항목에 액세스할 수 있습니다. 따라서 비밀번호, 결제 세부정보, 메시지, 사진, 오디오 및 동영상 등이 노출되지 않도록 주의하세요."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"앱을 공유, 녹화 또는 전송할 때는 Android가 해당 앱에 표시되거나 재생되는 모든 항목에 액세스할 수 있으므로 비밀번호, 결제 세부정보, 메시지, 사진, 오디오 및 동영상 등이 노출되지 않도록 주의하세요."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"시작"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"앱을 전환할 때 공유를 일시중지합니다."</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"대신 이 앱 공유"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"다시 전환"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"앱 전환"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IT 관리자에 의해 차단됨"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"기기 정책에 의해 화면 캡처가 사용 중지되었습니다."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"모두 지우기"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"다른 PIN으로 다시 시도"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> 변경 확인"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"자세히 보려면 스와이프하세요."</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"추천 제어 기능 로드 중"</string>
<string name="controls_media_title" msgid="1746947284862928133">"미디어"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 미디어 컨트롤을 숨길까요?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"어시스턴트가 대기 중임"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"설정에서 기본 메모 앱 설정"</string>
<string name="install_app" msgid="5066668100199613936">"앱 설치"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 054aa2ea8e34..dff688cf7da2 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Жүз таанылды. Улантуу үчүн басыңыз."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Жүз таанылды. Улантуу үчүн кулпусун ачуу сүрөтчөсүн басыңыз."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аныктыгы текшерилди"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодду колдонуу"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Графикалык ачкычты колдонуу"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Сырсөз колдонуу"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Түзмөгүңүздү жүзүңүз менен ачтыңыз"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Жүз таанылды"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Кайталоо үчүн экранды өйдө сүрүңүз"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC колдонуу үчүн түзмөктүн кулпусун ачыңыз"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Бул түзмөк уюмуңузга таандык"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Бул түзмөк төмөнкүгө таандык: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлүшүп, жаздырып же тышкы экранга чыгарып жатканда Android экраныңыздагы бардык маалыматты же түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Баштоо"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Колдонмо которулганда бөлүшүү тындырылат"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Анын ордуна бул колдонмону бөлүшүү"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Кайра которулуу"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Колдонмону которуу"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IT администраторуңуз бөгөттөп койгон"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Түзмөк саясаты экрандагыны тартып алууну өчүрүп койгон"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Баарын тазалап салуу"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Башка PIN кодду колдонуңүз"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> түзмөгү үчүн өзгөртүүнү ырастаңыз"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Дагы көрүү үчүн экранды сүрүп коюңуз"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Сунуштар жүктөлүүдө"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Медиа"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> \'да ушул медиа башкарууну жашырасызбы?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Жардамчы иштетилди"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден демейки кыска жазуулар колдонмосун тууралаңыз"</string>
<string name="install_app" msgid="5066668100199613936">"Колдонмону орнотуу"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 66bd9e3636fc..2df96ad1b991 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດເພື່ອສືບຕໍ່."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອສືບຕໍ່."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ໃຊ້ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ໃຊ້ຮູບແບບ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ໃຊ້ລະຫັດຜ່ານ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ປົດລັອກດ້ວຍໃບໜ້າແລ້ວ"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ຈຳແນກໜ້າໄດ້ແລ້ວ"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ປັດຂຶ້ນເພື່ອລອງໃໝ່"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"ປົດລັອກເພື່ອໃຊ້ NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ອຸປະກອນນີ້ເປັນຂອງອົງການທ່ານ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ອຸ​ປະ​ກອນ​ນີ້​ເປັນ​ຂອງ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ເມື່ອທ່ານກຳລັງແບ່ງປັນ, ບັນທຶກ ຫຼື ສົ່ງສັນຍານ, Android ຈະມີສິດເຂົ້າເຖິງທຸກສິ່ງທີ່ປາກົດຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ຫຼິ້ນຢູ່ອຸປະກອນຂອງທ່ານ. ດັ່ງນັ້ນ, ໃຫ້ລະມັດລະວັງສິ່ງຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຂໍ້ຄວາມ, ຮູບພາບ ພ້ອມທັງສຽງ ແລະ ວິດີໂອ."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ເມື່ອທ່ານກຳລັງແບ່ງປັນ, ບັນທຶກ ຫຼື ສົ່ງສັນຍານແອັບ, Android ຈະມີສິດເຂົ້າເຖິງທຸກສິ່ງທີ່ສະແດງ ຫຼື ຫຼິ້ນຢູ່ແອັບດັ່ງກ່າວ. ດັ່ງນັ້ນ, ໃຫ້ລະມັດລະວັງສິ່ງຕ່າງໆ ເຊັ່ນ: ລະຫັດຜ່ານ, ລາຍລະອຽດການຈ່າຍເງິນ, ຂໍ້ຄວາມ, ຮູບພາບ ພ້ອມທັງສຽງ ແລະ ວິດີໂອ."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ເລີ່ມ"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ການແບ່ງປັນຈະຢຸດຊົ່ວຄາວເມື່ອທ່ານປ່ຽນແອັບ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ແບ່ງປັນແອັບນີ້ແທນ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ປ່ຽນກັບຄືນ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ປ່ຽນແອັບ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ຖືກບລັອກໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ການຖ່າຍຮູບໜ້າຈໍຖືກປິດການນຳໃຊ້ໄວ້ໂດຍນະໂຍບາຍອຸປະກອນ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ລຶບລ້າງທັງໝົດ"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ລອງໃຊ້ PIN ອື່ນ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"ຢືນຢັນການປ່ຽນແປງສຳລັບ <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ປັດເພື່ອເບິ່ງເພີ່ມເຕີມ"</string>
+ <string name="retry_face" msgid="416380073082560186">"ລອງການພິສູດຢືນຢັນດ້ວຍໃບໜ້າຄືນໃໝ່"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ກຳລັງໂຫຼດຄຳແນະນຳ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ມີເດຍ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"ເຊື່ອງຕົວຄວບຄຸມມີເດຍນີ້ສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"ການເອີ້ນໃຊ້ຜູ້ຊ່ວຍເປີດຢູ່"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ຕັ້ງຄ່າແອັບຈົດບັນທຶກເລີ່ມຕົ້ນໃນການຕັ້ງຄ່າ"</string>
<string name="install_app" msgid="5066668100199613936">"ຕິດຕັ້ງແອັບ"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"ໄມໂຄຣໂຟນ ແລະ ກ້ອງຖ່າຍຮູບ"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"ການໃຊ້ແອັບຫຼ້າສຸດ"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"ເບິ່ງສິດເຂົ້າເຖິງຫຼ້າສຸດ"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"ແລ້ວໆ"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"ຂະຫຍາຍ ແລະ ສະແດງຕົວເລືອກ"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"ຫຍໍ້ລົງ"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"ປິດແອັບນີ້"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"ປິດ <xliff:g id="APP_NAME">%1$s</xliff:g> ແລ້ວ"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"ຈັດການບໍລິການ"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"ຈັດການສິດເຂົ້າເຖິງ"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"ໃຊ້ຢູ່ໂດຍການໂທ"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"ໃຊ້ຫຼ້າສຸດໃນການໂທ"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"ໃຊ້ຢູ່ໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"ໃຊ້ຫຼ້າສຸດໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"ໃຊ້ຢູ່ໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"ໃຊ້ຫຼ້າສຸດໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"ໃຊ້ຢູ່ໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"ໃຊ້ຫຼ້າສຸດໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index c93506f98aa5..8f3185a2cacd 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Veidas atpažintas. Paspauskite, jei norite tęsti."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Veidas atpažintas. Tęskite paspaudę atrakinimo piktogramą."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikuota"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Naudoti PIN kodą"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Naudoti atrakinimo piešinį"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Naudoti slaptažodį"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Atrakinta pagal veidą"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Veidas atpažintas"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Jei norite bandyti dar kartą, perbraukite aukštyn"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Norėdami naudoti NFC, atrakinkite"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Šis įrenginys priklauso jūsų organizacijai"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Šis įrenginys priklauso „<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>“"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kai bendrinate, įrašote ar perduodate turinį, „Android“ gali pasiekti viską, kas rodoma ekrane ar leidžiama įrenginyje. Todėl būkite atsargūs naudodami slaptažodžius, išsamią mokėjimo metodo informaciją, pranešimus, nuotraukas ir garso bei vaizdo įrašus."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kai bendrinate, įrašote ar perduodate programą, „Android“ gali pasiekti viską, kas rodoma ar leidžiama programoje. Todėl būkite atsargūs naudodami slaptažodžius, išsamią mokėjimo metodo informaciją, pranešimus, nuotraukas ir garso bei vaizdo įrašus."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pradėti"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Bendrinimas pristabdomas, kai perjungiate programas"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Bendrinti šią programą"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Perjungti atgal"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Programų jungiklis"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Užblokavo jūsų IT administratorius"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ekrano fiksavimo funkcija išjungta vadovaujantis įrenginio politika"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Viską išvalyti"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Išbandykite kitą PIN kodą"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Patvirtinti <xliff:g id="DEVICE">%s</xliff:g> pakeitimą"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Perbraukite, kad peržiūrėtumėte daugiau"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Įkeliamos rekomendacijos"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medija"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Slėpti šį programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ medijos valdiklį?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Padėjėjas klauso"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nustatykite numatytąją užrašų programą Nustatymuose"</string>
<string name="install_app" msgid="5066668100199613936">"Įdiegti programą"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index dcd54c499c5f..50e920ca9cc1 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Seja atpazīta. Nospiediet, lai turpinātu."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Seja atpazīta. Lai turpinātu, nospiediet atbloķēšanas ikonu."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikācija veikta"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Izmantot PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Izmantot kombināciju"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Izmantot paroli"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Ierīce atbloķēta pēc sejas"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Seja atpazīta"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Velciet augšup, lai mēģinātu vēlreiz"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Atbloķējiet ierīci, lai izmantotu NFC."</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Šī ierīce pieder jūsu organizācijai."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Šī ierīce pieder organizācijai <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kopīgošanas, ierakstīšanas vai apraides laikā Android var piekļūt visam, kas tiek rādīts jūsu ekrānā vai atskaņots jūsu ierīcē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Lietotnes kopīgošanas, ierakstīšanas vai apraides laikā Android var piekļūt visam, kas tiek rādīts vai atskaņots attiecīgajā lietotnē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Sākt"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Pārslēdzot lietotnes, tiek pārtraukta kopīgošana."</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Tā vietā kopīgot šo lietotni"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Pārslēgties uz iepriekšējo"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Lietotņu pārslēgšana"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloķējis jūsu IT administrators"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ierīces politika ir atspējojusi ekrānuzņēmumu izveidi"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Dzēst visu"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Izmēģiniet citu PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Izmaiņu apstiprināšana ierīcei <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Velciet, lai skatītu citus vienumus"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Notiek ieteikumu ielāde"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multivide"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Vai paslēpt šo lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> multivides vadīklu?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistents klausās"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Iestatījumos iestatiet noklusējuma piezīmju lietotni."</string>
<string name="install_app" msgid="5066668100199613936">"Instalēt lietotni"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index e83bf8165ffd..9b364c432cd3 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицето е препознаено. Притиснете за да продолжите."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето е препознаено. Притиснете ја иконата за отклучување за да продолжите."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Проверена"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користи PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користи шема"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користи лозинка"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Отклучено со лице"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Лицето е препознаено"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Повлечете нагоре за да се обидете повторно"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Отклучете за да користите NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Уредов е во сопственост на организацијата"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Уредов е во сопственост на <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Кога споделувате, снимате или емитувате, Android има пристап до сѐ што е видливо на вашиот екран или пуштено на вашиот уред. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Кога споделувате, снимате или емитувате апликација, Android има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Започни"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Споделувањето се паузира кога се префрлате на друга апликација"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Наместо тоа, споделете ја апликацијава"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Враќање"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Префрлање на друга апликација"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Блокирано од IT-администраторот"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Снимањето на екранот е оневозможено со правила на уредот"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Избриши сѐ"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Обидете се со друг PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Потврдете ја промената за <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Повлечете за да видите повеќе"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Се вчитуваат препораки"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Аудиовизуелни содржини"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Да се скријат контролите за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Вниманието на „Помошникот“ е вклучено"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Поставете стандардна апликација за белешки во „Поставки“"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталирајте ја апликацијата"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index c8fbde84853b..b446c67636ee 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അമർത്തുക."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"പരിശോധിച്ചുറപ്പിച്ചു"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"പിൻ ഉപയോഗിക്കുക"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"പാറ്റേൺ ഉപയോഗിക്കുക"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"പാസ്‌വേഡ് ഉപയോഗിക്കുക"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"മുഖം ഉപയോഗിച്ച് അൺലോക്ക് ചെയ്‌തു"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"മുഖം തിരിച്ചറിഞ്ഞു"</string>
<string name="keyguard_retry" msgid="886802522584053523">"വീണ്ടും ശ്രമിക്കാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ഉപയോഗിക്കാൻ അൺലോക്ക് ചെയ്യുക"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ഈ ഉപകരണം നിങ്ങളുടെ സ്ഥാപനത്തിന്റേതാണ്"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ഈ ഉപകരണം <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> എന്ന സ്ഥാപനത്തിന്റേതാണ്"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"പങ്കിടുമ്പോൾ, റെക്കോർഡ് ചെയ്യുമ്പോൾ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യുമ്പോൾ, Android-ന് നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ഉപകരണത്തിൽ പ്ലേ ചെയ്യുന്നതോ ആയ ഏത് കാര്യത്തിലേക്കും ആക്സസ് ഉണ്ട്. അതിനാൽ പാസ്‍വേഡുകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, ഓഡിയോ, വീഡിയോ എന്നിവ പോലുള്ള കാര്യങ്ങൾ നൽകുമ്പോൾ സൂക്ഷിക്കുക."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ഒരു ആപ്പ് പങ്കിടുമ്പോൾ, റെക്കോർഡ് ചെയ്യുമ്പോൾ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യുമ്പോൾ, Android-ന് ആ ആപ്പിൽ കാണിക്കുന്ന അല്ലെങ്കിൽ പ്ലേ ചെയ്യുന്ന എല്ലാത്തിലേക്കും ആക്സസ് ഉണ്ട്. അതിനാൽ പാസ്‍വേഡുകൾ, പേയ്‌മെന്റ് വിശദാംശങ്ങൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, ഓഡിയോ, വീഡിയോ എന്നിവ പോലുള്ള കാര്യങ്ങൾ നൽകുമ്പോൾ സൂക്ഷിക്കുക."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ആരംഭിക്കുക"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"നിങ്ങൾ ആപ്പുകൾ മാറുമ്പോൾ പങ്കിടൽ താൽക്കാലികമായി നിർത്തും"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"പകരം ഈ ആപ്പ് പങ്കിടുക"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"മടങ്ങുക"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ആപ്പ് മാറുക"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"നിങ്ങളുടെ ഐടി അഡ്‌മിൻ ബ്ലോക്ക് ചെയ്‌തു"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ഉപകരണ നയം, സ്ക്രീൻ ക്യാപ്‌ചർ ചെയ്യൽ പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"എല്ലാം മായ്‌ക്കുക"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"മറ്റൊരു പിൻ പരീക്ഷിക്കുക"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> എന്നതിനുള്ള മാറ്റം സ്ഥിരീകരിക്കുക"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"കൂടുതൽ കാണാൻ സ്വൈപ്പ് ചെയ്യുക"</string>
+ <string name="retry_face" msgid="416380073082560186">"മുഖം പരിശോധിച്ചുറപ്പിക്കാൻ വീണ്ടും ശ്രമിക്കുക"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"നിർദ്ദേശങ്ങൾ ലോഡ് ചെയ്യുന്നു"</string>
<string name="controls_media_title" msgid="1746947284862928133">"മീഡിയ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനുള്ള ഈ മീഡിയാ കൺട്രോൾ മറയ്ക്കണോ?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant സജീവമാണ്"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ക്രമീകരണത്തിൽ കുറിപ്പുകൾക്കുള്ള ഡിഫോൾട്ട് ആപ്പ് സജ്ജീകരിക്കുക"</string>
<string name="install_app" msgid="5066668100199613936">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യൂ"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"മൈക്രോഫോണും ക്യാമറയും"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"അടുത്തിടെയുള്ള ആപ്പ് ഉപയോഗം"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"അടുത്തിടെയുള്ള ആക്‌സസ് കാണുക"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"പൂർത്തിയായി"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"വികസിപ്പിച്ച് ഓപ്ഷനുകൾ കാണിക്കുക"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"ചുരുക്കുക"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"ഈ ആപ്പ് അടയ്ക്കുക"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"<xliff:g id="APP_NAME">%1$s</xliff:g> അടച്ചു"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"സേവനം മാനേജ് ചെയ്യുക"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"ആക്‌സസ് മാനേജ് ചെയ്യുക"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"ഫോൺ കോളിൽ ഉപയോഗിക്കുന്നു"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"ഫോൺ കോളിൽ അടുത്തിടെ ഉപയോഗിച്ചു"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"<xliff:g id="APP_NAME">%1$s</xliff:g> ഉപയോഗിക്കുന്നു"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"<xliff:g id="APP_NAME">%1$s</xliff:g> അടുത്തിടെ ഉപയോഗിച്ചു"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>) ഉപയോഗിക്കുന്നു"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>) അടുത്തിടെ ഉപയോഗിച്ചു"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) ഉപയോഗിക്കുന്നു"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) അടുത്തിടെ ഉപയോഗിച്ചു"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 15745ff24304..f5cb6c56d59f 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Дэлгэцийн бичлэгийг хадгалахад алдаа гарлаа"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Дэлгэцийн бичлэгийг эхлүүлэхэд алдаа гарлаа"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Бүтэн дэлгэцээр үзэж байна"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Гарахаар бол дээрээс нь доош нь чирнэ үү."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Гарах бол дээрээс доош шударна уу."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"Ойлголоо"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Буцах"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Гэрийн"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Царайг таньсан. Үргэлжлүүлэхийн тулд дарна уу."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Царайг таньсан. Үргэлжлүүлэх бол түгжээг тайлах дүрсийг дар."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Баталгаажуулагдсан"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ПИН ашиглах"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Хээ ашиглах"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Нууц үг ашиглах"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Царайгаар түгжээг тайлсан"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Царайг таньсан"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Дахин оролдохын тулд дээш шударна уу"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC-г ашиглахын тулд түгжээг тайлна уу"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Энэ төхөөрөмж танай байгууллагад харьяалагддаг"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Энэ төхөөрөмж <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>-д харьяалагддаг"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Таныг хуваалцаж, бичлэг хийж эсвэл дамжуулж байх үед Android таны дэлгэцэд харуулсан эсвэл төхөөрөмжид тань тоглуулсан аливаа зүйлд хандах эрхтэй. Тиймээс нууц үг, төлбөрийн дэлгэрэнгүй, мессеж, зураг, аудио болон видео зэрэг зүйлд болгоомжтой хандаарай."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Таныг хуваалцаж, бичлэг хийж эсвэл дамжуулж байх үед Android тухайн аппад харуулсан эсвэл тоглуулсан аливаа зүйлд хандах эрхтэй. Тиймээс нууц үг, төлбөрийн дэлгэрэнгүй, мессеж, зураг, аудио болон видео зэрэг бусад зүйлд болгоомжтой хандаарай."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Эхлүүлэх"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Таныг аппууд сэлгэх үед хуваалцахыг түр зогсооно"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Оронд нь энэ аппыг хуваалцах"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Буцаж сэлгэх"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Апп сэлгэх"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Таны IT админ блоклосон"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Төхөөрөмжийн бодлогоор дэлгэцийн зураг авахыг идэвхгүй болгосон"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Бүгдийг арилгах"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Өөр ПИН ашиглах"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>-н өөрчлөлтийг баталгаажуулна уу"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Илүү ихийг харахын тулд шударна уу"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Зөвлөмжүүдийг ачаалж байна"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Медиа"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Энэ медиа хяналтыг <xliff:g id="APP_NAME">%1$s</xliff:g>-д нуух уу?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Туслах анхаарлаа хандуулж байна"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Тохиргоонд тэмдэглэлийн өгөгдмөл апп тохируулна уу"</string>
<string name="install_app" msgid="5066668100199613936">"Аппыг суулгах"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a52d217871c6..646128a1e925 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"पाहण्यासाठी टॅप करा"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"स्क्रीन रेकॉर्डिंग सेव्ह करताना एरर आली"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रीन रेकॉर्डिंग सुरू करताना एरर आली"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"पूर्ण स्क्रीनवर पाहत आहात"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"पूर्ण स्क्रीन पाहत आहात"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"बाहेर पडण्यासाठी, वरून खाली स्वाइप करा."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"समजले"</string>
<string name="accessibility_back" msgid="6530104400086152611">"मागे"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी प्रेस करा."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन प्रेस करा."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ऑथेंटिकेशन केलेले"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन वापरा"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पॅटर्न वापरा"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड वापरा"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"चेहऱ्याने अनलॉक केले आहे"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"चेहरा ओळखला आहे"</string>
<string name="keyguard_retry" msgid="886802522584053523">"पुन्हा प्रयत्न करण्यासाठी वर स्‍वाइप करा"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC वापरण्यासाठी स्क्रीन अनलॉक करा"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"हे डिव्हाइस तुमच्या संस्थेचे आहे"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> चे आहे"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"तुम्ही शेअर, रेकॉर्ड किंवा कास्ट करत असताना, Android ला तुमच्या स्क्रीनवर दाखवलेल्या किंवा डिव्हाइसवर प्ले केलेल्या कोणत्याही गोष्टीचा अ‍ॅक्सेस असतो. त्यामुळे पासवर्ड, पेमेंट तपशील, मेसेज, फोटो आणि ऑडिओ व व्हिडिओ यांसारख्या गोष्टींबाबत सावधगिरी बाळगा."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"तुम्ही एखादे अ‍ॅप शेअर, रेकॉर्ड किंवा कास्ट करत असताना, Android ला त्या अ‍ॅपवर दाखवलेल्या किंवा प्ले केलेल्या कोणत्याही गोष्टीचा अ‍ॅक्सेस असतो. त्यामुळे पासवर्ड, पेमेंट तपशील, मेसेज, फोटो आणि ऑडिओ व व्हिडिओ यांसारख्या गोष्टींबाबत सावधगिरी बाळगा."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"सुरुवात करा"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"तुम्ही ॲप्स स्विच करता, तेव्हा शेअरिंग थांबते"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"त्याऐवजी हे अ‍ॅप शेअर करा"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"परत स्विच करा"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"अ‍ॅप स्विच"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"तुमच्या आयटी ॲडमिनने ब्लॉक केले आहे"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"डिव्हाइस धोरणाने स्‍क्रीन कॅप्‍चर करणे बंद केले आहे"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सर्व साफ करा"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"दुसरा पिन वापरून पहा"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> च्या बदलांची निश्चिती करा"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"अधिक पाहण्यासाठी स्वाइप करा"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"शिफारशी लोड करत आहे"</string>
<string name="controls_media_title" msgid="1746947284862928133">"मीडिया"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी हा मीडिया नियंत्रक लपवायचा आहे का?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant चे लक्ष हे आता अ‍ॅक्टिव्ह आहे"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग्ज मध्ये डीफॉल्ट टिपा अ‍ॅप सेट करा"</string>
<string name="install_app" msgid="5066668100199613936">"अ‍ॅप इंस्टॉल करा"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 3da42a54c497..1c708d5094d7 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Wajah dicam. Tekan untuk meneruskan."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dicam. Tekan ikon buka kunci untuk meneruskan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Disahkan"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan corak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan kata laluan"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Dibuka kunci dengan wajah"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Wajah dicam"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Leret ke atas untuk mencuba lagi"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Buka kunci untuk menggunakan NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Peranti ini milik organisasi anda"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Peranti ini milik <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Apabila anda membuat perkongsian, rakaman atau penghantaran, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Apabila anda berkongsi, merakam atau menghantar apl, Android boleh mengakses apa-apa sahaja yang ditunjukan atau dimainkan pada apl tersebut. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Mula"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Perkongsian dijeda apabila anda menukar apl"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Sebaliknya kongsi apl ini"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Tukar kembali"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Tukar apl"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Disekat oleh pentadbir IT anda"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Tangkapan skrin dilumpuhkan oleh dasar peranti"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Kosongkan semua"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Cuba PIN lain"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Sahkan perubahan untuk <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Leret untuk melihat selanjutnya"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Memuatkan cadangan"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Sembunyikan kawalan media ini untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Perhatian pembantu dihidupkan"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Tetapkan apl nota lalai dalam Tetapan"</string>
<string name="install_app" msgid="5066668100199613936">"Pasang apl"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index c258862513e3..a60515002a1c 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -137,7 +137,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"မျက်နှာ စကင်ဖတ်နေသည်"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ပို့ရန်"</string>
<string name="cancel" msgid="1089011503403416730">"မလုပ်တော့"</string>
- <string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုပါ"</string>
+ <string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုရန်"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ထပ်စမ်းကြည့်ရန်"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန် တို့ပါ"</string>
<string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"ထပ်စမ်းကြည့်ပါ"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် နှိပ်ပါ။"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ။"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"အထောက်အထားစိစစ်ပြီးပြီ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ပင်နံပါတ်သုံးရန်"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ပုံစံကို သုံးရန်"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"စကားဝှက် သုံးရန်"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"မျက်နှာဖြင့် ဖွင့်လိုက်သည်"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"မျက်နှာ မှတ်မိသည်"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ထပ်စမ်းကြည့်ရန် အပေါ်သို့ပွတ်ဆွဲပါ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ကို အသုံးပြုရန် လော့ခ်ဖွင့်ပါ"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ဤစက်ကို သင့်အဖွဲ့အစည်းက ပိုင်ဆိုင်သည်"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ဤစက်ကို <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> က ပိုင်ဆိုင်သည်"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"မျှဝေ၊ ရုပ်သံဖမ်း (သို့) ကာစ်လုပ်သည့်အခါ Android သည် သင့်ဖန်သားပြင်တွင် မြင်နိုင်သည့် (သို့) သင့်စက်တွင် ဖွင့်ထားသည့် အရာအားလုံးကို တွေ့နိုင်သည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"အက်ပ်တစ်ခုဖြင့် မျှဝေ၊ ရုပ်သံဖမ်း (သို့) ကာစ်လုပ်သည့်အခါ Android သည် ယင်းအက်ပ်တွင် ပြထားသည့် (သို့) ဖွင့်ထားသည့် အရာအားလုံးကို တွေ့နိုင်သည်။ ထို့ကြောင့် စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့အရာများကို ဂရုစိုက်ပါ။"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"စတင်ရန်"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"အက်ပ်ပြောင်းချိန်တွင် မျှဝေခြင်းကို ခဏရပ်သည်"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"၎င်းအစား ဤအက်ပ်ကို မျှဝေရန်"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ပြန်ပြောင်းရန်"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"အက်ပ်ပြောင်းစနစ်"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"သင်၏ IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ကိရိယာ မူဝါဒက ဖန်သားပြင်ပုံဖမ်းခြင်းကို ပိတ်ထားသည်"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"အားလုံးရှင်းရန်"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"နောက်ပင်နံပါတ်တစ်ခု စမ်းကြည့်ရန်"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> အတွက် အပြောင်းအလဲကို အတည်ပြုပါ"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ပိုကြည့်ရန် ပွတ်ဆွဲပါ"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"အကြံပြုချက်များ ဖွင့်နေသည်"</string>
<string name="controls_media_title" msgid="1746947284862928133">"မီဒီယာ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် ဤမီဒီယာထိန်းချုပ်မှု ဖျောက်ထားမလား။"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"ဆက်တင်များ"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="ARTIST_NAME">%2$s</xliff:g> ၏ <xliff:g id="SONG_NAME">%1$s</xliff:g> ကို <xliff:g id="APP_LABEL">%3$s</xliff:g> တွင် ဖွင့်ထားသည်"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="TOTAL_TIME">%2$s</xliff:g> အနက် <xliff:g id="ELAPSED_TIME">%1$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပွင့်နေပါသည်"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> လုပ်ဆောင်နေသည်"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"ဖွင့်ရန်"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"ခဏရပ်ရန်"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"ယခင် တစ်ပုဒ်"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant နားထောင်နေသည်"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ဆက်တင်များတွင် မူရင်းမှတ်စုများအက်ပ် သတ်မှတ်ပါ"</string>
<string name="install_app" msgid="5066668100199613936">"အက်ပ် ထည့်သွင်းရန်"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 9277d523f145..c7681ff84b49 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -120,7 +120,7 @@
<string name="screenrecord_start_error" msgid="2200660692479682368">"Feil ved start av skjermopptaket"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Visning i fullskjerm"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Sveip ned fra toppen for å avslutte."</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"Skjønner"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"Greit"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Tilbake"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Startside"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Meny"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansiktet er gjenkjent. Trykk for å fortsette."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet er gjenkjent. Trykk på lås opp-ikon for å fortsette"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentisert"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Bruk PIN-kode"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Bruk mønster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Bruk passord"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Låst opp med ansiktet"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Ansiktet er gjenkjent"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Sveip opp for å prøve igjen"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Lås opp for å bruke NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Denne enheten tilhører organisasjonen din"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Denne enheten tilhører <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Når du deler, tar opp eller caster noe, har Android tilgang til alt som vises på skjermen eller spilles av på enheten. Derfor bør du være forsiktig med for eksempel passord, betalingsopplysninger, meldinger, bilder, lyd og video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Når du deler, tar opp eller caster en app, har Android tilgang til alt som vises eller spilles av i den aktuelle appen. Derfor bør du være forsiktig med for eksempel passord, betalingsopplysninger, meldinger, bilder, lyd og video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Begynn"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Delingen settes på pause når du bytter app"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Del denne appen i stedet"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Bytt tilbake"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Appbytte"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokkert av IT-administratoren"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Skjermdumper er deaktivert av enhetsinnstillingene"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Fjern alt"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Prøv en annen PIN-kode"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Bekreft endringen for <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Sveip for å se flere"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Laster inn anbefalinger"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medier"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Vil du skjule denne mediekontrollen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistentoppmerksomhet er på"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Du kan velge en standardapp for notater i Innstillinger"</string>
<string name="install_app" msgid="5066668100199613936">"Installer appen"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 9f9bf85b25f7..581f1ca35aee 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"हेर्नका लागि ट्याप गर्नुहोस्"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"स्क्रिन रेकर्डिङ सेभ गर्ने क्रममा त्रुटि भयो"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रिन रेकर्ड गर्न थाल्ने क्रममा त्रुटि भयो"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"पूरा पर्दा हेर्दै"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"बाहिर निस्कन, माथिबाट तल स्वाइप गर्नुहोस्।"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"फुल स्क्रिन हेरिँदै छ"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"बाहिरिन सिरानबाट तलतिर स्वाइप गर्नुहोस्।"</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"बुझेँ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"पछाडि"</string>
<string name="accessibility_home" msgid="5430449841237966217">"गृह"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"अनुहार पहिचान गरियो। जारी राख्न थिच्नुहोस्।"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"अनुहार पहिचान गरियो। जारी राख्न अनलक आइकनमा थिच्नुहोस्।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"प्रमाणीकरण गरियो"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN प्रयोग गर्नुहोस्"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ढाँचा प्रयोग गर्नुहोस्"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड प्रयोग गर्नुहोस्"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"अनुहार प्रयोग गरी अनलक गरियो"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"अनुहार पहिचान गरियो"</string>
<string name="keyguard_retry" msgid="886802522584053523">"फेरि प्रयास गर्न माथितिर स्वाइप गर्नुहोस्"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC प्रयोग गर्न स्क्रिन अनलक गर्नुहोस्"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> को स्वामित्वमा छ"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"तपाईंले सेयर गर्दा, रेकर्ड गर्दा वा कास्ट गर्दा Android ले तपाईंको स्क्रिनमा देखिने वा डिभाइसमा प्ले गरिने सबै कुरा हेर्न तथा प्रयोग गर्न सक्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"तपाईंले कुनै एप सेयर गर्दा, रेकर्ड गर्दा वा कास्ट गर्दा Android ले उक्त एपमा देखाइने वा प्ले गरिने सबै कुरा हेर्न तथा प्रयोग गर्न सक्छ। त्यसैले पासवर्ड, भुक्तानीसम्बन्धी विवरण, म्यासेज, फोटो र अडियो तथा भिडियो जस्ता कुरा हेर्दा वा प्ले गर्दा सावधानी अपनाउनुहोला।"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"सुरु गर्नुहोस्"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"तपाईंले एपहरू बदल्दा सेयर गर्ने प्रक्रिया पज हुन्छ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"यसको साटो यो एप सेयर गर्नुहोस्"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"पछाडि जानुहोस्"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"एप बदल्नुहोस्"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"तपाईंका IT एड्मिनले ब्लक गर्नुभएको छ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"डिभाइसको नीतिका कारण स्क्रिन क्याप्चर गर्ने सुविधा अफ गरिएको छ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"सबै हटाउनुहोस्"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"अर्को PIN प्रयोग गरी हेर्नु…"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> का हकमा गरिएको परिवर्तन पुष्टि गर्नुहोस्"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"थप हेर्न स्वाइप गर्नुहोस्"</string>
+ <string name="retry_face" msgid="416380073082560186">"फेरि अनुहारमार्फत प्रमाणीकरण गरी हेर्नुहोस्"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"सिफारिसहरू लोड गर्दै"</string>
<string name="controls_media_title" msgid="1746947284862928133">"मिडिया"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> का हकमा यो मिडिया कन्ट्रोल लुकाउने हो?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"सहायकले सुनिरहेको छ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिङमा गई नोट बनाउने डिफल्ट एप तोक्नुहोस्"</string>
<string name="install_app" msgid="5066668100199613936">"एप इन्स्टल गर्नुहोस्"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"माइक्रोफोन तथा क्यामेरा"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"एपको हालसालैको प्रयोग"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"हालसालै एक्सेस गर्ने एप हेर्नुहोस्"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"पूरा भयो"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"एक्स्पान्ड गरियोस् र विकल्पहरू देखाइयोस्"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"कोल्याप्स गर्नुहोस्"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"यो एप बन्द गर्नुहोस्"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"<xliff:g id="APP_NAME">%1$s</xliff:g> बन्द गरिएको छ"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"सेवा व्यवस्थित गर्नुहोस्"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"अनुमतिहरू व्यवस्थित गर्नुहोस्"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"फोन कलमा प्रयोग भइरहेको छ"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"फोन कलमा हालसालै प्रयोग गरिएको"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले प्रयोग गरिरहेको छ"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले हालसालै प्रयोग गरेको"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>) ले प्रयोग गरिरहेको छ"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>) ले हालसालै प्रयोग गरेको"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) ले प्रयोग गरिरहेको छ"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) ले हालसालै प्रयोग गरेको"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 5c8ba847e906..30abc4f197ae 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Gezicht herkend. Druk om door te gaan."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gezicht herkend. Druk op het ontgrendelicoon."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Geverifieerd"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Pincode gebruiken"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Patroon gebruiken"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Wachtwoord gebruiken"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Ontgrendeld via gezicht"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Gezicht herkend"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swipe omhoog om het opnieuw te proberen"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ontgrendel het apparaat om NFC te gebruiken"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Dit apparaat is eigendom van je organisatie"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Dit apparaat is eigendom van <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Als je deelt, opneemt of cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Als je deelt, opneemt of cast, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Starten"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Delen wordt onderbroken als je schakelt tussen apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"In plaats daarvan deze app delen"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Terugschakelen"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"App schakelen"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Geblokkeerd door je IT-beheerder"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Schermopname staat uit vanwege apparaatbeleid"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Alles wissen"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Andere pincode proberen"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Bevestig de wijziging voor <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swipe om meer te zien"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Aanbevelingen laden"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Deze mediabediening verbergen voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent-aandacht aan"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standaard notitie-app instellen in Instellingen"</string>
<string name="install_app" msgid="5066668100199613936">"App installeren"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index e41e7c21e616..a6ebb388f2b7 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଦବାନ୍ତୁ।"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ପ୍ରାମାଣିକତା ହୋଇଛି"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ପାସ୍‌ୱାର୍ଡ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ଫେସ ମାଧ୍ୟମରେ ଅନଲକ କରାଯାଇଛି"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ପୁଣି ଚେଷ୍ଟା କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ବ୍ୟବହାର କରିବାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ଏହି ଡିଭାଇସଟି ଆପଣଙ୍କ ସଂସ୍ଥାର ଅଟେ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ଏହି ଡିଭାଇସଟି <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ର ଅଟେ"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ଆପଣ ସେୟାର, ରେକର୍ଡ କିମ୍ବା କାଷ୍ଟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ଆପଣ ଏକ ଆପ ସେୟାର, ରେକର୍ଡ କିମ୍ବା କାଷ୍ଟ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ଆରମ୍ଭ କରନ୍ତୁ"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ଆପଣ ଆପ୍ସ ସୁଇଚ କଲେ ସେୟାରିଂ ବିରତ ହୁଏ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ଏହା ପରିବର୍ତ୍ତେ ଏହି ଆପ ସେୟାର କରନ୍ତୁ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ପୁଣି ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ଆପ ସୁଇଚ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ବ୍ଲକ କରାଯାଇଛି"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ଡିଭାଇସ ନୀତି ଦ୍ୱାରା ସ୍କ୍ରିନ କେପଚରିଂକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ସବୁ ଖାଲି କରନ୍ତୁ"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ଅନ୍ୟ ଏକ PIN ଚେଷ୍ଟା କରି ଦେଖନ୍ତୁ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ପାଇଁ ପରିବର୍ତ୍ତନ ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ଅଧିକ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ସୁପାରିଶଗୁଡ଼ିକ ଲୋଡ୍ କରାଯାଉଛି"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ମିଡିଆ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଏହି ମିଡିଆ ନିୟନ୍ତ୍ରଣକୁ ଲୁଚାଇବେ?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ଆଟେନସନ ଚାଲୁ ଅଛି"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ସେଟିଂସରେ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ ସେଟ କରନ୍ତୁ"</string>
<string name="install_app" msgid="5066668100199613936">"ଆପ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index cc6377558dae..d0c02d679f58 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋ ਗਈ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਿੰਗ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖੋ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"ਬਾਹਰ ਜਾਣ ਲਈ, ਉਪਰੋਂ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।"</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"ਸਮਝ ਲਿਆ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ਪਿੱਛੇ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"ਘਰ"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਦਬਾਓ।"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ਪਿੰਨ ਵਰਤੋ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ਪੈਟਰਨ ਵਰਤੋ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ਪਾਸਵਰਡ ਵਰਤੋ"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ਚਿਹਰੇ ਰਾਹੀਂ ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ"</string>
<string name="keyguard_retry" msgid="886802522584053523">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਉੱਤੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ਵਰਤਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ਇਹ ਡੀਵਾਈਸ ਤੁਹਾਡੀ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ਇਹ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਂਝਾ ਕਰਨ, ਰਿਕਾਰਡ ਕਰਨ, ਜਾਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਂਝਾ ਕਰਨ, ਰਿਕਾਰਡ ਕਰਨ, ਜਾਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਉਸ ਐਪ \'ਤੇ ਦਿਖਾਈ ਗਈ ਜਾਂ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਸੰਬੰਧੀ ਸਾਵਧਾਨ ਰਹੋ।"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ਸ਼ੁਰੂ ਕਰੋ"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ਐਪਾਂ ਸਵਿੱਚ ਕਰਨ \'ਤੇ ਸਾਂਝਾਕਰਨ ਰੁਕ ਜਾਂਦਾ ਹੈ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ਇਸਦੀ ਬਜਾਏ ਇਹ ਐਪ ਸਾਂਝੀ ਕਰੋ"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ਵਾਪਸ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ਐਪ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ਡੀਵਾਈਸ ਨੀਤੀ ਦੇ ਕਾਰਨ ਸਕ੍ਰੀਨ ਕੈਪਚਰ ਕਰਨਾ ਬੰਦ ਹੈ"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ਕੋਈ ਹੋਰ ਪਿੰਨ ਵਰਤ ਕੇ ਦੇਖੋ"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ਲਈ ਤਬਦੀਲੀ ਦੀ ਤਸਦੀਕ ਕਰੋ"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"ਹੋਰ ਦੇਖਣ ਲਈ ਸਵਾਈਪ ਕਰੋ"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"ਸਿਫ਼ਾਰਸ਼ਾਂ ਲੋਡ ਹੋ ਰਹੀਆਂ ਹਨ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"ਮੀਡੀਆ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਇਹ ਮੀਡੀਆ ਕੰਟਰੋਲ ਲੁਕਾਉਣਾ ਹੈ?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ਧਿਆਨ ਸੁਵਿਧਾ ਨੂੰ ਚਾਲੂ ਹੈ"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਨੂੰ ਸੈੱਟ ਕਰੋ"</string>
<string name="install_app" msgid="5066668100199613936">"ਐਪ ਸਥਾਪਤ ਕਰੋ"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 21018f9976cb..e5cc4c4f6abe 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Podczas zapisywania nagrania ekranu wystąpił błąd"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Błąd podczas rozpoczynania rejestracji zawartości ekranu"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Włączony pełny ekran"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Aby wyjść, przesuń palcem z góry na dół."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Aby wyjść, przesuń palcem z góry na dół."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Wróć"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Ekran główny"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Twarz rozpoznana. Kliknij, aby kontynuować."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Twarz rozpoznana. Aby kontynuować, kliknij ikonę odblokowywania."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Uwierzytelniono"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Użyj kodu PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Użyj wzoru"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Użyj hasła"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Odblokowano skanem twarzy"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Twarz rozpoznana"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Przesuń w górę, by spróbować ponownie"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Odblokuj, by użyć komunikacji NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"To urządzenie należy do Twojej organizacji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Właściciel tego urządzenia: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Rozpocznij"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Udostępnianie zostanie wstrzymane, gdy przełączysz aplikacje"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Udostępnij tę aplikację"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Wróć"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Przełączanie aplikacji"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Zablokowane przez administratora IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Zrzuty ekranu są wyłączone zgodnie z zasadami dotyczącymi urządzeń"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Usuń wszystkie"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Wpisz inny kod PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potwierdź zmianę dotyczącą urządzenia <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Przesuń palcem, by zobaczyć więcej"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Wczytuję rekomendacje"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimedia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ukryć sterowanie multimediami w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asystent jest aktywny"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ustaw domyślną aplikację do obsługi notatek w Ustawieniach"</string>
<string name="install_app" msgid="5066668100199613936">"Zainstaluj aplikację"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 82015ea8136a..8e4dcdf7e58b 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Pressione para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Desbloqueado pelo rosto"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Rosto reconhecido"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Deslize para cima para tentar novamente"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloqueie para usar a NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertence à sua organização"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertence à organização <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quando você compartilha, grava ou transmite a tela, o Android tem acesso a todas as informações visíveis nela ou reproduzidas no dispositivo. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quando você compartilha, grava ou transmite um app, o Android tem acesso a todas as informações visíveis ou reproduzidas nele. Tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Início"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"O compartilhamento é pausado na troca de apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Compartilhar este app"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Voltar"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Troca de app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Ação bloqueada pelo administrador de TI"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"A captura de tela foi desativada pela política do dispositivo"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Remover tudo"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Tente usar outro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirme a mudança para <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Deslize para ver mais"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Carregando recomendações"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Mídia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ocultar este controle de mídia para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Atenção do Assistente ativada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 45853b9923d4..e0697545e9a9 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -39,9 +39,9 @@
<string name="usb_audio_device_prompt_warn" msgid="2504972133361130335">"Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB. A utilização da app <xliff:g id="APPLICATION">%1$s</xliff:g> neste dispositivo pode impedir a audição de chamadas, notificações e alarmes."</string>
<string name="usb_audio_device_prompt" msgid="7944987408206252949">"A utilização da app <xliff:g id="APPLICATION">%1$s</xliff:g> neste dispositivo pode impedir a audição de chamadas, notificações e alarmes."</string>
<string name="usb_accessory_permission_prompt" msgid="717963550388312123">"Permitir que a app <xliff:g id="APPLICATION">%1$s</xliff:g> aceda ao acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
- <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
- <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nEsta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string>
- <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
+ <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
+ <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nEsta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string>
+ <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
<string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"Nenhuma das aplicações instaladas funciona com o acessório USB. Saiba mais acerca do acessório em <xliff:g id="URL">%1$s</xliff:g>"</string>
<string name="title_usb_accessory" msgid="1236358027511638648">"Acessório USB"</string>
<string name="label_view" msgid="6815442985276363364">"Ver"</string>
@@ -150,6 +150,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Prima para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Prima ícone de desbloqueio para continuar"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
+ <string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar palavra-passe"</string>
@@ -319,7 +320,7 @@
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmara do dispositivo?"</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Pretende desbloquear a câmara e o microfone?"</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Quer desbloquear a câmara e o microfone?"</string>
<string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar o seu microfone."</string>
<string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara."</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara ou microfone."</string>
@@ -362,6 +363,7 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Desbloqueado com o rosto"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Rosto reconhecido"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Deslize rapidamente para cima para tentar novamente."</string>
+ <string name="accesssibility_keyguard_retry" msgid="8880238862712870676">"Deslize para cima para tentar o Desbloqueio facial novamente"</string>
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloquear para utilizar o NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertence à sua entidade."</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertence à entidade <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
@@ -385,7 +387,7 @@
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pendente"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todas as apps e dados desta sessão serão eliminados."</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"Bem-vindo de volta, convidado!"</string>
- <string name="guest_wipe_session_message" msgid="3393823610257065457">"Pretende continuar a sessão?"</string>
+ <string name="guest_wipe_session_message" msgid="3393823610257065457">"Quer continuar a sessão?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Recomeçar"</string>
<string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Sim, continuar"</string>
<string name="guest_notification_app_name" msgid="2110425506754205509">"Modo convidado"</string>
@@ -936,6 +938,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Experimente outro PIN."</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirme a alteração para <xliff:g id="DEVICE">%s</xliff:g>."</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Deslize rapidamente para ver mais."</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"A carregar recomendações…"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Multimédia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ocultar controlo de multimédia para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1073,7 +1077,7 @@
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para mudar de rede, desligue a Ethernet"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Para melhorar a experiência do dispositivo, as apps e os serviços podem continuar a procurar redes Wi-Fi em qualquer altura, mesmo quando o Wi-Fi está desativado. Pode alterar esta opção nas definições de procura de Wi-Fi. "<annotation id="link">"Alterar"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Desativar o modo de avião"</string>
- <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"A app <xliff:g id="APPNAME">%1$s</xliff:g> pretende adicionar o seguinte mosaico às Definições rápidas"</string>
+ <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"A app <xliff:g id="APPNAME">%1$s</xliff:g> quer adicionar o seguinte mosaico às Definições rápidas"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar mosaico"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicion. mosaico"</string>
<string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecione utilizador"</string>
@@ -1162,4 +1166,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Atenção do Assistente ativada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Predefina a app de notas nas Definições"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 82015ea8136a..8e4dcdf7e58b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Rosto reconhecido. Pressione para continuar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Desbloqueado pelo rosto"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Rosto reconhecido"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Deslize para cima para tentar novamente"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Desbloqueie para usar a NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Este dispositivo pertence à sua organização"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Este dispositivo pertence à organização <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quando você compartilha, grava ou transmite a tela, o Android tem acesso a todas as informações visíveis nela ou reproduzidas no dispositivo. Portanto, tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quando você compartilha, grava ou transmite um app, o Android tem acesso a todas as informações visíveis ou reproduzidas nele. Tenha cuidado com senhas, detalhes de pagamento, mensagens, fotos, áudios e vídeos."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Início"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"O compartilhamento é pausado na troca de apps"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Compartilhar este app"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Voltar"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Troca de app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Ação bloqueada pelo administrador de TI"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"A captura de tela foi desativada pela política do dispositivo"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Remover tudo"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Tente usar outro PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirme a mudança para <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Deslize para ver mais"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Carregando recomendações"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Mídia"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ocultar este controle de mídia para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Atenção do Assistente ativada"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string>
<string name="install_app" msgid="5066668100199613936">"Instalar o app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index bc6a5fd6ada3..069f8310cc82 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Chipul a fost recunoscut. Apasă pentru a continua."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Chip recunoscut. Apasă pictograma Deblocare ca să continui."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificat"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Folosește PIN-ul"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Folosește modelul"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Folosește parola"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"S-a deblocat folosind fața"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Chipul a fost recunoscut"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Glisează pentru a încerca din nou"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Deblochează pentru a folosi NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Dispozitivul aparține organizației tale"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Acest dispozitiv aparține organizației <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Când permiți accesul, înregistrezi sau proiectezi, Android are acces la orice este vizibil pe ecran sau se redă pe dispozitiv. Prin urmare, ai grijă cu parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Când permiți accesul, înregistrezi sau proiectezi o aplicație, Android are acces la orice se afișează pe ecran sau se redă în aplicație. Prin urmare, ai grijă cu informații cum ar fi parolele, detaliile de plată, mesajele, fotografiile și conținutul audio și video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Începe"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Trimiterea se oprește când comuți între aplicații"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Trimite această aplicație"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Revino"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Comutator pentru aplicații"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blocată de administratorul IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Capturile de ecran sunt dezactivate de politica privind dispozitivele"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Șterge toate notificările"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Încearcă alt cod PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Confirmă schimbarea pentru <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Glisează pentru a vedea mai multe"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Se încarcă recomandările"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ascunzi comanda media pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistentul este atent"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setează aplicația prestabilită de note din Setări"</string>
<string name="install_app" msgid="5066668100199613936">"Instalează aplicația"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 80b0d0fac060..63054801c167 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лицо распознано. Нажмите, чтобы продолжить."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицо распознано. Нажмите на значок разблокировки."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификация выполнена"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Использовать графический ключ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Использовать пароль"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Разблокировано сканированием лица"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Лицо распознано"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Чтобы повторить попытку, проведите вверх"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Чтобы использовать NFC, разблокируйте устройство."</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Это устройство принадлежит вашей организации"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Этим устройством владеет организация \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Когда вы демонстрируете, транслируете экран или записываете видео с него, система Android получает доступ ко всему, что видно или воспроизводится на устройстве. Поэтому будьте осторожны с паролями, сведениями о способах оплаты, сообщениями, фотографиями, аудио- и видеозаписями."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Когда вы демонстрируете, записываете или транслируете экран приложения, система Android получает доступ ко всему, что видно или воспроизводится в нем. Поэтому будьте осторожны с паролями, сведениями о способах оплаты, сообщениями, фотографиями, аудио- и видеозаписями."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Начать"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Общий доступ прерывается при переключении приложений"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Открыть доступ к этому приложению"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Переключиться обратно"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Переключение приложений"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Заблокировано вашим администратором"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Запись экрана отключена в соответствии с правилами для устройства."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Очистить все"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Введите другой PIN-код"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Подтвердите изменения для устройства \"<xliff:g id="DEVICE">%s</xliff:g>\""</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Проведите по экрану, чтобы увидеть больше"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Загрузка рекомендаций…"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Медиа"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Скрыть этот элемент в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Ассистент готов слушать"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартное приложение для заметок в настройках."</string>
<string name="install_app" msgid="5066668100199613936">"Установить приложение"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 8989b7ef0b90..4bdb7e53441f 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -120,7 +120,7 @@
<string name="screenrecord_start_error" msgid="2200660692479682368">"තිර පටිගත කිරීම ආරම්භ කිරීමේ දෝෂයකි"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"මුළු තිරය බලමින්"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"ඉවත් වීමට, ඉහළ සිට පහළට ස්වයිප් කරන්න"</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"වැටහුණි"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"තේරුණා"</string>
<string name="accessibility_back" msgid="6530104400086152611">"ආපසු"</string>
<string name="accessibility_home" msgid="5430449841237966217">"මුල් පිටුව"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"මෙනුව"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට ඔබන්න."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"සත්‍යාපනය විය"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN භාවිත කරන්න"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"රටාව භාවිත කරන්න"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"මුරපදය භාවිත කරන්න"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"මුහුණ මගින් අගුලු හරින ලදි"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"මුහුණ හඳුනා ගන්නා ලදි"</string>
<string name="keyguard_retry" msgid="886802522584053523">"නැවත උත්සාහ කිරීමට ඉහළට ස්වයිප් කරන්න"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC භාවිත කිරීමට අගුලු හරින්න"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"මෙම උපාංගය ඔබේ සංවිධානයට අයිතිය"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"මෙම උපාංගය <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> සංවිධානයට අයිතිය"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ඔබ බෙදා ගන්නා විට, පටිගත කරන විට, හෝ විකාශය කරන විට, Android හට ඔබේ තිරයේ පෙනෙන හෝ ඔබේ උපාංගයේ වාදනය වන ඕනෑම දෙයකට ප්‍රවේශය ඇත. ඒ නිසා මුරපද, ගෙවීම් විස්තර, පණිවුඩ, ඡායාරූප, සහ ශ්‍රව්‍ය සහ දෘශ්‍ය වැනි දේවල් පිළිබඳ ප්‍රවේශම් වන්න."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"ඔබ යෙදුමක් බෙදා ගන්නා විට, පටිගත කරන විට හෝ විකාශය කරන විට, Android හට එම යෙදුමේ පෙන්වන හෝ වාදනය කරන ඕනෑම දෙයකට ප්‍රවේශය ඇත. ඒ නිසා මුරපද, ගෙවීම් විස්තර, පණිවුඩ, ඡායාරූප, සහ ශ්‍රව්‍ය සහ දෘශ්‍ය වැනි දේවල් පිළිබඳ ප්‍රවේශම් වන්න."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"අරඹන්න"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"ඔබ යෙදුම් මාරු කරන විට බෙදා ගැනීම විරාම වේ"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"ඒ වෙනුවට මෙම යෙදුම බෙදා ගන්න"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"ආපසු මාරු වන්න"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"යෙදුම් මාරුව"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ඔබේ IT පරිපාලක විසින් අවහිර කර ඇත"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"උපාංග ප්‍රතිපත්තිය මගින් තිර ග්‍රහණය කිරීම අබල කර ඇත"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"සියල්ල හිස් කරන්න"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"තවත් PIN එකක් උත්සාහ කරන්න"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> සඳහා වෙනස තහවුරු කරන්න"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"තව බැලීමට ස්වයිප් කරන්න"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"නිර්දේශ පූරණය කරමින්"</string>
<string name="controls_media_title" msgid="1746947284862928133">"මාධ්‍ය"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා මෙම මාධ්‍ය පාලනය වසන්නද?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"සහයක අවධානය යොමු කරයි"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"සැකසීම් තුළ පෙරනිමි සටහන් යෙදුම සකසන්න"</string>
<string name="install_app" msgid="5066668100199613936">"යෙදුම ස්ථාපනය කරන්න"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index e743d5604afc..92a115e19f99 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Tvár bola rozpoznaná. Pokračujte stlačením."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Tvár bola rozpoznaná. Pokračujte stlačením ikony odomknutia"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Overené"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použiť PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použiť vzor"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použiť heslo"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Odomknuté tvárou"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Tvár bola rozpoznaná"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Potiahnutím nahor to skúste znova"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Ak chcete použiť NFC, odomknite"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Toto zariadenie patrí vašej organizácii"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Toto zariadení patrí organizácii <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Počas zdieľania, nahrávania alebo prenosu bude mať Android prístup k všetkému, čo sa zobrazuje na obrazovke alebo prehráva v zariadení. Preto zvýšte pozornosť v prípade položiek, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Počas zdieľania, nahrávania alebo prenosu v aplikácii bude mať Android prístup k všetkému zobrazovanému alebo prehrávaného obsahu v danej aplikácii. Preto zvýšte pozornosť v prípade položiek, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Začať"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Zdieľanie sa pozastaví, keď prepnete aplikácie"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Zdieľať radšej túto aplikáciu"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Prepnúť späť"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Prepnutie aplikácie"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokované vaším správcom IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Snímanie obrazovky je zakázané pravidlami pre zariadenie"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Vymazať všetko"</string>
@@ -940,6 +940,7 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Skúste iný PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potvrdenie zmeny zariadenia <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Potiahnutím zobrazíte ďalšie položky"</string>
+ <string name="retry_face" msgid="416380073082560186">"Znova skúsiť overenie tvárou"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Načítavajú sa odporúčania"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Médiá"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Chcete tento ovládač médií pre <xliff:g id="APP_NAME">%1$s</xliff:g> skryť?"</string>
@@ -1166,4 +1167,22 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Pozornosť Asistenta je zapnutá"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavte predvolenú aplikáciu na poznámky v Nastaveniach"</string>
<string name="install_app" msgid="5066668100199613936">"Inštalovať aplikáciu"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Mikrofón a kamera"</string>
+ <string name="privacy_dialog_summary" msgid="2458769652125995409">"Nedávne využitie aplikácie"</string>
+ <string name="privacy_dialog_more_button" msgid="7610604080293562345">"Zobraziť nedávny prístup"</string>
+ <string name="privacy_dialog_done_button" msgid="4504330708531434263">"Hotovo"</string>
+ <string name="privacy_dialog_expand_action" msgid="9129262348628331377">"Rozbaliť a zobraziť možnosti"</string>
+ <string name="privacy_dialog_collapse_action" msgid="277419962019466347">"Zbaliť"</string>
+ <string name="privacy_dialog_close_app_button" msgid="8006250171305878606">"Zavrieť túto aplikáciu"</string>
+ <string name="privacy_dialog_close_app_message" msgid="1316408652526310985">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> je zatvorená"</string>
+ <string name="privacy_dialog_manage_service" msgid="8320590856621823604">"Spravovať službu"</string>
+ <string name="privacy_dialog_manage_permissions" msgid="2543451567190470413">"Spravovať prístup"</string>
+ <string name="privacy_dialog_active_call_usage" msgid="7858746847946397562">"Využíva telefonický hovor"</string>
+ <string name="privacy_dialog_recent_call_usage" msgid="1214810644978167344">"Nedávno využil telefonický hovor"</string>
+ <string name="privacy_dialog_active_app_usage" msgid="631997836335929880">"Využíva <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_recent_app_usage" msgid="4883417856848222450">"Nedávno využila aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="privacy_dialog_active_app_usage_1" msgid="9047570143069220911">"Využíva <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_1" msgid="2551340497722370109">"Nedávno využila aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>)"</string>
+ <string name="privacy_dialog_active_app_usage_2" msgid="2770926061339921767">"Využíva <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
+ <string name="privacy_dialog_recent_app_usage_2" msgid="2874689735085367167">"Nedávno využila aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 90d62cb6b101..58c1284f5be7 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Obraz je prepoznan. Pritisnite za nadaljevanje."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obraz je prepoznan. Za nadaljevanje pritisnite ikono za odklepanje."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Preverjena pristnost"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Uporabi kodo PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Uporabi vzorec"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Uporabi geslo"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Odklenjeno z obrazom"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Obraz je prepoznan"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Povlecite navzgor za vnovičen poskus"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Odklenite napravo, če želite uporabljati NFC."</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Ta naprava pripada vaši organizaciji"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Ta naprava pripada organizaciji <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Pri deljenju, snemanju ali predvajanju ima Android dostop do vsega, kar je prikazano na zaslonu ali se predvaja v napravi. Zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Pri deljenju, snemanju ali predvajanju aplikacije ima Android dostop do vsega, kar je prikazano ali predvajano v tej aplikaciji, zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Začni"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Deljenje se začasno zaustavi ob preklopu aplikacije"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Delite to aplikacijo"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Preklopite nazaj"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Preklop aplikacije"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokiral skrbnik za IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Zajemanje zaslonske slike je onemogočil pravilnik za naprave."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši vse"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Poskusite z drugo kodo PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Potrdite spremembo za napravo <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Če si želite ogledati več, povlecite"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Nalaganje priporočil"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Predstavnost"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Želite skriti ta nadzor predstavnosti za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Zaznavanje pomočnika je vklopljeno."</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavite privzeto aplikacijo za zapiske v nastavitvah."</string>
<string name="install_app" msgid="5066668100199613936">"Namesti aplikacijo"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 3677bdee43b0..547159a6812b 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Gabim gjatë ruajtjes së regjistrimit të ekranit"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Gabim gjatë nisjes së regjistrimit të ekranit"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Po shikon ekranin e plotë"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Për të dalë, rrëshqit nga lart poshtë."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Për të dalë, rrëshqit shpejt poshtë."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"E kuptova"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Prapa"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Faqja bazë"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Fytyra u njoh. Shtyp për të vazhduar."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Fytyra u njoh. Shtyp ikonën e shkyçjes për të vazhduar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"U vërtetua"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Përdor kodin PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Përdor motivin"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Përdor fjalëkalimin"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"U shkyç me fytyrë"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Fytyra u njoh"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Rrëshqit lart për të provuar përsëri"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Shkyçe për të përdorur NFC-në"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Kjo pajisje i përket organizatës sate"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Kjo pajisje i përket <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kur ti ndan, regjistron ose transmeton, Android ka qasje te çdo gjë e dukshme në ekranin tënd ose që po luhet në pajisjen tënde. Prandaj, ki kujdes me gjërat si fjalëkalimet, detajet e pagesave, mesazhet, fotografitë, si dhe audion dhe videon."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kur ti ndan, regjistron ose transmeton një aplikacion, Android ka qasje te çdo gjë e dukshme në ekranin tënd ose që po luhet në atë aplikacion. Prandaj, ki kujdes me gjërat si fjalëkalimet, detajet e pagesave, mesazhet, fotografitë, si dhe audion dhe videon."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Nis"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Ndarja vendoset në pauzë kur ndërron aplikacionet"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Ndaj më mirë këtë aplikacion"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Kthehu përsëri"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Ndërrimi i aplikacionit"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"U bllokua nga administratori yt i teknologjisë së informacionit"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Regjistrimi i ekranit është çaktivizuar nga politika e pajisjes."</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Pastroji të gjitha"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Provo një kod tjetër PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Konfirmo ndryshimin për <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Rrëshqit shpejt për të shikuar më shumë"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Po ngarkon rekomandimet"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Të fshihet kontrolluesi i medias për <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Vëmendja e \"Asistentit\" aktive"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Cakto aplikacionin e parazgjedhur të shënimeve te \"Cilësimet\""</string>
<string name="install_app" msgid="5066668100199613936">"Instalo aplikacionin"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 19d30658509d..54a9909f486f 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Лице је препознато. Притисните да бисте наставили."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лице препознато. Притисните икону откључавања за наставак."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Идентитет је потврђен"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користите PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користите шаблон"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користите лозинку"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Откључано је лицем"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Лице је препознато"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Превуците нагоре да бисте пробали поново"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Откључајте да бисте користили NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Овај уређај припада организацији"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Овај уређај припада организацији <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видео снимцима."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Када делите, снимате или пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видео снимцима."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Покрени"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Дељење се зауставља када мењате апликације"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Дели ову апликацију"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Врати"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Промена апликације"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Блокира ИТ администратор"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Снимање екрана је онемогућено смерницама за уређај"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Обриши све"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Пробајте други PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Потврдите промену за: <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Превуците да бисте видели још"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Учитавају се препоруке"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Медији"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Желите да сакријете ову контролу за медије за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Помоћник је у активном стању"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Подесите подразумевану апликацију за белешке у Подешавањима"</string>
<string name="install_app" msgid="5066668100199613936">"Инсталирај апликацију"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ae199e9ebb10..929e6529d089 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ansiktet har identifierats. Tryck för att fortsätta."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet har identifierats. Tryck på ikonen lås upp."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentiserad"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Använd pinkod"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Använd mönster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Använd lösenord"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Upplåst med ansiktslås"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Ansiktet har identifierats"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Svep uppåt om du vill försöka igen"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Lås upp om du vill använda NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Den här enheten tillhör organisationen"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Den här enheten tillhör <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"När du delar, spelar in eller castar har Android åtkomst till allt som visas på skärmen eller spelas upp på enheten. Var försiktig med sådant som lösenord, betalningsuppgifter, meddelanden, foton och ljud och video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"När du delar, spelar in eller castar en app har Android åtkomst till allt som visas eller spelas upp i appen. Var försiktig med sådant som lösenord, betalningsuppgifter, meddelanden, foton och ljud och video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Börja"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Delningen pausas när du byter appar"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Dela den här appen i stället"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Byt tillbaka"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Appbyte"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blockeras av IT-administratören"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Skärminspelning är inaktiverat av enhetspolicyn"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Rensa alla"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Testa en annan pinkod"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Bekräfta ändring av <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Svep om du vill se mer"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Rekommendationer läses in"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Vill du dölja denna mediastyrning för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistenten är aktiverad"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ställ in en standardapp för anteckningar i inställningarna"</string>
<string name="install_app" msgid="5066668100199613936">"Installera appen"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index abed50d4981c..763369368d75 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Uso umetambuliwa. Bonyeza ili uendelee."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Uso umetambuliwa. Bonyeza aikoni ya kufungua ili uendelee."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Umethibitishwa"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Tumia PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Tumia mchoro"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Tumia nenosiri"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Imefunguliwa kwa kutumia uso"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Uso umetambuliwa"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Telezesha kidole juu ili ujaribu tena"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Fungua ili utumie NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Kifaa hiki kinamilikiwa na shirika lako"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Kifaa hiki kinamilikiwa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Unaposhiriki, kurekodi au kutuma, Android inaweza kufikia kitu chochote kitakachoonekana kwenye skrini yako au kuchezwa kwenye kifaa chako. Kwa hivyo kuwa mwangalifu na vitu kama vile manenosiri, maelezo ya malipo, ujumbe, picha na sauti na video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Unaposhiriki, kurekodi au kutuma programu, Android inaweza kufikia kitu chochote kitakachoonekana au kuchezwa kwenye programu hiyo. Kwa hivyo kuwa mwangalifu na vitu kama vile manenosiri, maelezo ya malipo, ujumbe, picha na sauti na video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Anza"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Itasitisha kushiriki unapobadilisha programu"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Shiriki programu hii badala yake"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Rejea"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Kubadilisha programu"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Umezuiwa na msimamizi wako wa TEHAMA"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Mchakato wa kurekodi skrini umezimwa na sera ya kifaa"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Futa zote"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Jaribu PIN nyingine"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Thibitisha mabadiliko kwenye <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Telezesha kidole ili uone zaidi"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Inapakia mapendekezo"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Maudhui"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ungependa kuficha kidhibiti hiki kwenye <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Programu ya Mratibu imewashwa"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Teua programu chaguomsingi ya madokezo katika Mipangilio"</string>
<string name="install_app" msgid="5066668100199613936">"Sakinisha programu"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 8d930a5f8d2a..fabeab4fa39e 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -119,8 +119,8 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"ஸ்கிரீன் ரெக்கார்டிங்கைச் சேமிப்பதில் பிழை ஏற்பட்டது"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"ஸ்கிரீன் ரெக்கார்டிங்கைத் தொடங்குவதில் பிழை"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"முழுத் திரையில் காட்டுகிறது"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"வெளியேற, மேலிருந்து கீழே ஸ்வைப் செய்யவும்"</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"புரிந்தது"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"வெளியேற, மேலிருந்து கீழே ஸ்வைப் செய்யவும்."</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"சரி"</string>
<string name="accessibility_back" msgid="6530104400086152611">"பின்செல்"</string>
<string name="accessibility_home" msgid="5430449841237966217">"முகப்பு"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"மெனு"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அழுத்தவும்."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அன்லாக் ஐகானை அழுத்தவும்."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"அங்கீகரிக்கப்பட்டது"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"பின்னைப் பயன்படுத்து"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"பேட்டர்னைப் பயன்படுத்து"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"கடவுச்சொல்லைப் பயன்படுத்து"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"முகத்தால் அன்லாக் செய்யப்பட்டது"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"முகம் அங்கீகரிக்கப்பட்டது"</string>
<string name="keyguard_retry" msgid="886802522584053523">"மீண்டும் முயல மேல்நோக்கி ஸ்வைப் செய்யவும்"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFCயைப் பயன்படுத்த அன்லாக் செய்யவும்"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"இந்த சாதனம் உங்கள் நிறுவனத்துக்கு சொந்தமானது"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"இந்த சாதனம் <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> நிறுவனத்துக்கு சொந்தமானது"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"நீங்கள் பகிரும்போதோ ரெக்கார்டு செய்யும்போதோ அலைபரப்பும்போதோ உங்கள் திரையில் காட்டப்படுகின்ற அல்லது சாதனத்தில் பிளே செய்யப்படுகின்ற அனைத்தையும் Android அணுக முடியும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"நீங்கள் ஓர் ஆப்ஸைப் பகிரும்போதோ ரெக்கார்டு செய்யும்போதோ அலைபரப்பும்போதோ அந்த ஆப்ஸில் காட்டப்படுகின்ற அல்லது பிளே செய்யப்படுகின்ற அனைத்தையும் Android அணுக முடியும். எனவே கடவுச்சொற்கள், பேமெண்ட் விவரங்கள், மெசேஜ்கள், படங்கள், ஆடியோ, வீடியோ போன்றவை குறித்துக் கவனத்துடன் இருங்கள்."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"தொடங்கு"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"பகிர்தல் ஆப்ஸிற்கு இடையே மாறும்போது இடைநிறுத்தப்படும்"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"அதற்குப் பதிலாக இந்த ஆப்ஸைப் பகிர்"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"முந்தையதற்கு மாறு"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ஆப்ஸிற்கு இடையே மாறுதல்"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"உங்கள் IT நிர்வாகி தடுத்துள்ளார்"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"\'திரையைப் படமெடுத்தல்\' சாதனக் கொள்கையின்படி முடக்கப்பட்டுள்ளது"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"எல்லாவற்றையும் அழி"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"வேறு பின்னைப் பயன்படுத்தவும்"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> ஐ மாற்றுவதை உறுதிப்படுத்தவும்"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"மேலும் பார்க்க ஸ்வைப் செய்யவும்"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"பரிந்துரைகளை ஏற்றுகிறது"</string>
<string name="controls_media_title" msgid="1746947284862928133">"மீடியா"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸுக்கான இந்த மீடியா கட்டுப்பாடுகளை மறைக்கவா?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"அசிஸ்டண்ட்டின் கவனம் இயக்கத்தில் உள்ளது"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"குறிப்பு எடுப்பதற்கான இயல்புநிலை ஆப்ஸை அமைப்புகளில் அமையுங்கள்"</string>
<string name="install_app" msgid="5066668100199613936">"ஆப்ஸை நிறுவுங்கள்"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index f90a43546a90..4e1a95526f5e 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"ముఖం గుర్తించబడింది. కొనసాగించడానికి నొక్కండి."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ముఖం గుర్తించబడింది. కొనసాగడానికి అన్‌లాక్ చిహ్నం నొక్కండి."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ప్రామాణీకరించబడింది"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"పిన్‌ను ఉపయోగించండి"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ఆకృతిని ఉపయోగించండి"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"పాస్‌వర్డ్‌ను ఉపయోగించండి"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ముఖం ద్వారా అన్‌లాక్ చేయబడింది"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"ముఖం గుర్తించబడింది"</string>
<string name="keyguard_retry" msgid="886802522584053523">"మళ్ళీ ప్రయత్నించడానికి పైకి స్వైప్ చేయండి"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFCని ఉపయోగించడానికి అన్‌లాక్ చేయండి"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"ఈ పరికరం మీ సంస్థకు చెందినది"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>కు చెందినది"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"మీరు షేర్ చేస్తున్నప్పుడు, రికార్డ్ చేస్తున్నప్పుడు, లేదా ప్రసారం చేస్తున్నప్పుడు, మీ స్క్రీన్‌పై కనిపించే దేనికైనా లేదా మీ పరికరంలో ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, మెసేజ్‌లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"మీరు ఏదైనా యాప్‌ను షేర్ చేస్తున్నప్పుడు, రికార్డ్ చేస్తున్నప్పుడు, లేదా ప్రసారం చేస్తున్నప్పుడు, ఆ యాప్‌లో చూపబడిన దేనికైనా లేదా ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, మెసేజ్‌లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"ప్రారంభించండి"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"మీరు యాప్‌లను మార్చినప్పుడు షేరింగ్ పాజ్ చేయబడుతుంది"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"బదులుగా ఈ యాప్‌ను షేర్ చేయండి"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"మునుపటి దానికి స్విచ్ అవ్వండి"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"యాప్ స్విచ్"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"మీ IT అడ్మిన్ ద్వారా బ్లాక్ చేయబడింది"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"పరికర పాలసీ ద్వారా స్క్రీన్ క్యాప్చర్ చేయడం డిజేబుల్ చేయబడింది"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"అన్నీ క్లియర్ చేయండి"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"మరొక పిన్‌ని ప్రయత్నించండి"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>కి సంబంధించి మార్పును నిర్ధారించండి"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"మరిన్నింటిని చూడటం కోసం స్వైప్ చేయండి"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"సిఫార్సులు లోడ్ అవుతున్నాయి"</string>
<string name="controls_media_title" msgid="1746947284862928133">"మీడియా"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం ఈ మీడియా కంట్రోల్‌ను దాచి ఉంచాలా?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant అటెన్షన్ ఆన్‌లో ఉంది"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"సెట్టింగ్‌లలో ఆటోమేటిక్‌గా ఉండేలా ఒక నోట్స్ యాప్‌ను సెట్ చేసుకోండి"</string>
<string name="install_app" msgid="5066668100199613936">"యాప్‌ను ఇన్‌స్టాల్ చేయండి"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 804379210885..2491ab1f2e5a 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"เกิดข้อผิดพลาดในการบันทึกหน้าจอ"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"เกิดข้อผิดพลาดขณะเริ่มบันทึกหน้าจอ"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"กำลังดูแบบเต็มหน้าจอ"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"หากต้องการออก ให้เลื่อนลงจากด้านบน"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"หากต้องการออก ให้ปัดลงจากด้านบน"</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"รับทราบ"</string>
<string name="accessibility_back" msgid="6530104400086152611">"กลับ"</string>
<string name="accessibility_home" msgid="5430449841237966217">"หน้าแรก"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"จดจำใบหน้าได้ กดเพื่อดำเนินการต่อ"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"จดจำใบหน้าได้ กดไอคอนปลดล็อกเพื่อดำเนินการต่อ"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ตรวจสอบสิทธิ์แล้ว"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ใช้ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ใช้รูปแบบ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ใช้รหัสผ่าน"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"ปลดล็อกด้วยใบหน้าแล้ว"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"จดจำใบหน้าได้"</string>
<string name="keyguard_retry" msgid="886802522584053523">"เลื่อนขึ้นเพื่อลองอีกครั้ง"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"ปลดล็อกเพื่อใช้ NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"องค์กรของคุณเป็นเจ้าของอุปกรณ์นี้"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> เป็นเจ้าของอุปกรณ์นี้"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"เมื่อกำลังแชร์ บันทึก หรือแคสต์ Android จะมีสิทธิ์เข้าถึงทุกสิ่งที่ปรากฏบนหน้าจอหรือเล่นอยู่ในอุปกรณ์ ดังนั้นโปรดระวังสิ่งต่างๆ อย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน ข้อความ รูปภาพ รวมถึงเสียงและวิดีโอ"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"เมื่อกำลังแชร์ บันทึก หรือแคสต์แอป Android จะมีสิทธิ์เข้าถึงทุกสิ่งที่แสดงหรือเล่นอยู่ในแอปดังกล่าว ดังนั้นโปรดระวังสิ่งต่างๆ อย่างเช่นรหัสผ่าน รายละเอียดการชำระเงิน ข้อความ รูปภาพ รวมถึงเสียงและวิดีโอ"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"เริ่ม"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"การแชร์จะหยุดชั่วคราวเมื่อสลับแอป"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"แชร์แอปนี้แทน"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"เปลี่ยนกลับ"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"เปลี่ยนแอป"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"ผู้ดูแลระบบไอทีบล็อกไว้"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"การจับภาพหน้าจอปิดใช้โดยนโยบายด้านอุปกรณ์"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"ล้างทั้งหมด"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"ลองใช้ PIN อื่น"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"ยืนยันการเปลี่ยนแปลงสำหรับ<xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"เลื่อนเพื่อดูเพิ่มเติม"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"กำลังโหลดคำแนะนำ"</string>
<string name="controls_media_title" msgid="1746947284862928133">"สื่อ"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"ซ่อนตัวควบคุมสื่อนี้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"การเรียกใช้งาน Assistant เปิดอยู่"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"กำหนดแอปการจดบันทึกเริ่มต้นในการตั้งค่า"</string>
<string name="install_app" msgid="5066668100199613936">"ติดตั้งแอป"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 835c86438df9..949f96212ff2 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -118,9 +118,9 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"I-tap para tingnan"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Nagka-error sa pag-save ng recording ng screen"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Nagkaroon ng error sa pagsisimula ng pag-record ng screen"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Panonood sa full screen"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Upang lumabas, mag-swipe mula sa itaas pababa."</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"Nakuha ko"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Nanonood sa full screen"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Para lumabas, mag-swipe mula sa itaas pababa."</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Bumalik"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Home"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Menu"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Nakilala ang mukha. Pindutin para magpatuloy."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nakilala ang mukha. Pindutin ang unlock para magpatuloy."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Na-authenticate"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gumamit ng PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gumamit ng pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gumamit ng password"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Na-unlock gamit ang mukha"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Nakilala ang mukha"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Mag-swipe pataas para subukan ulit"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"I-unlock para magamit ang NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Pagmamay-ari ng iyong organisasyon ang device na ito"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Pagmamay-ari ng <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ang device na ito"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kapag nagbabahagi, nagre-record, o nagka-cast ka, may access ang Android sa kahit anong nakikita sa iyong screen o pine-play sa device mo. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kapag nagbabahagi, nagre-record, o nagka-cast ka ng app, may access ang Android sa kahit anong ipinapakita o pine-play sa app na iyon. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Simulan"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Magpo-pause ang pagbabahagi kapag lumipat ka ng app"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Ibahagi na lang ang app na ito"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Bumalik sa dati"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Lumipat ng app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Na-block ng iyong IT admin"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Naka-disable ang pag-screen capture ayon sa patakaran ng device"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"I-clear lahat"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Sumubok ng ibang PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Kumpirmahin ang pagbabago para sa <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Mag-swipe para tumingin ng higit pa"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Nilo-load ang rekomendasyon"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"itago ang kontrol sa media na ito para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Naka-on ang atensyon ng Assistant"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Magtakda ng default na app sa pagtatala sa Mga Setting"</string>
<string name="install_app" msgid="5066668100199613936">"I-install ang app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3f05efa76bda..4208efdd1931 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Yüzünüz tanındı. Devam etmek için basın."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yüzünüz tanındı. Kilit açma simgesine basın."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kimliği Doğrulandı"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kullan"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Deseni kullan"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Şifre kullan"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Cihazın kilidini yüzünüzle açtınız"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Yüzünüz tanındı"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Tekrar denemek için yukarı kaydırın"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC\'yi kullanmak için kilidi açın"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Bu cihaz, kuruluşunuza ait"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> adlı kuruluşa ait"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Paylaşma, kaydetme veya yayınlama özelliğini kullandığınızda Android, ekranınızda gösterilen veya cihazınızda oynatılan her şeye erişebilir. Bu nedenle şifre, ödeme ayrıntıları, mesaj, fotoğraf, ses ve video gibi öğeler konusunda dikkatli olun."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Bir uygulamayı paylaştığınızda, kaydettiğinizde veya yayınladığınızda Android, söz konusu uygulamada gösterilen veya oynatılan her şeye erişebilir. Bu nedenle şifre, ödeme ayrıntıları, mesaj, fotoğraf, ses ve video gibi öğeler konusunda dikkatli olun."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Başlat"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Uygulama değiştirdiğinizde paylaşım duraklatılır"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Bunun yerine bu uygulamayı paylaşın"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Geri dön"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Uygulama değiştirme"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"BT yöneticiniz tarafından engellendi"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ekran görüntüsü alma, cihaz politikası tarafından devre dışı bırakıldı"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Tümünü temizle"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Başka bir PIN deneyin"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> için değişikliği onaylayın"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Diğer öğeleri görmek için hızlıca kaydırın"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Öneriler yükleniyor"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Medya"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> için bu medya kontrolü gizlensin mi?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistan dinliyor"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlar\'ı kullanarak varsayılan notlar ayarlayın"</string>
<string name="install_app" msgid="5066668100199613936">"Uygulamayı yükle"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index d4b9c345bb29..5a93e3d22ee2 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -119,7 +119,7 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"Не вдалося зберегти запис відео з екрана"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Не вдалося почати запис екрана"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Перегляд на весь екран"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"Щоб вийти, проведіть пальцем зверху вниз."</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"Щоб вийти, проведіть пальцем униз від верху екрана."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Назад"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Головна"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Обличчя розпізнано. Натисніть, щоб продовжити."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Обличчя розпізнано. Натисніть значок розблокування."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Автентифіковано"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Ввести PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Намалювати ключ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Ввести пароль"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Розблоковано (фейс-контроль)"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Обличчя розпізнано"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Проведіть пальцем угору, щоб повторити спробу"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Розблокуйте екран, щоб скористатись NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Цей пристрій належить вашій організації"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Цей пристрій належить організації \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Коли ви показуєте, записуєте або транслюєте екран, ОС Android отримує доступ до всього, що відображається на ньому чи відтворюється на пристрої. Тому будьте уважні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Коли ви показуєте, записуєте або транслюєте додаток, ОС Android отримує доступ до всього, що відображається або відтворюється в ньому. Тому будьте уважні з паролями, повідомленнями, фотографіями, аудіо, відео, платіжною інформацією тощо."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Почати"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Спільний доступ до додатка призупиняється, коли ви переходите в інший додаток"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Поділитися цим додатком"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Повернутися"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Перехід між додатками"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Заблоковано адміністратором"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Запис екрана вимкнено згідно з правилами для пристрою"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Очистити все"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Спробуйте інший PIN-код"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g>: підтвердьте зміну"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Гортайте, щоб переглянути інші"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Завантаження рекомендацій"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Медіа"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Приховати цей елемент керування для <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Асистента активовано"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Призначте стандартний додаток для нотаток у налаштуваннях"</string>
<string name="install_app" msgid="5066668100199613936">"Установити додаток"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index acf1357d7cd8..cff51243c701 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کے لیے دبائیں۔"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کیلئے انلاک آئیکن دبائیں۔"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"تصدیق کردہ"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"‏PIN استعمال کریں"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"پیٹرن کا استعمال کریں"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"پاس ورڈ استعمال کریں"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"چہرے سے غیر مقفل کیا گیا"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"چہرے کی شناخت ہو گئی"</string>
<string name="keyguard_retry" msgid="886802522584053523">"دوبارہ کوشش کرنے کے لیے اوپر سوائپ کريں"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"‏NFC استعمال کرنے کیلئے غیر مقفل کریں"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"یہ آلہ آپ کی تنظیم کا ہے"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"یہ آلہ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> کا ہے"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"‏جب آپ اشتراک، ریکارڈنگ یا کاسٹ کر رہے ہوتے ہیں تو Android کو آپ کی اسکرین پر دکھائی دینے والی یا آپ کے آلے پر چلائی گئی ہر چیز تک رسائی حاصل ہوتی ہے۔ لہذا، پاس ورڈز، ادائیگی کی تفصیلات، پیغامات، تصاویر، ساتھ ہی آڈیو اور ویڈیو جیسی چیزوں کے سلسلے میں محتاط رہیں۔"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"‏جب آپ اشتراک، ریکارڈنگ یا کسی ایپ کو کاسٹ کر رہے ہوتے ہیں تو Android کو اس ایپ پر دکھائی گئی یا چلائی گئی ہر چیز تک رسائی حاصل ہوتی ہے۔ لہذا، پاس ورڈز، ادائیگی کی تفصیلات، پیغامات، تصاویر، ساتھ ہی آڈیو اور ویڈیو جیسی چیزوں کے سلسلے میں محتاط رہیں۔"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"شروع کریں"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"آپ کے ایپس سوئچ کرنے پر اشتراک موقوف ہو جاتا ہے"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"اس کے بجائے اس ایپ کا اشتراک کریں"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"واپس سوئچ کریں"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"ایپ سوئچ کرنے کی سہولت"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"‏آپ کے IT منتظم نے مسدود کر دیا"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"اسکرین کو کیپچر کرنا آلہ کی پالیسی کے ذریعے غیر فعال ہے"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"سبھی کو صاف کریں"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"‏‫کوئی دوسرا PIN آزمائیں"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> کی تبدیلی کی توثیق کریں"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"مزید دیکھنے کیلئے سوائپ کریں"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"تجاویز لوڈ ہو رہی ہیں"</string>
<string name="controls_media_title" msgid="1746947284862928133">"میڈیا"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اس میڈیا کنٹرول کو چھپائیں؟"</string>
@@ -949,7 +951,7 @@
<string name="controls_media_settings_button" msgid="5815790345117172504">"ترتیبات"</string>
<string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="APP_LABEL">%3$s</xliff:g> سے <xliff:g id="ARTIST_NAME">%2$s</xliff:g> کا <xliff:g id="SONG_NAME">%1$s</xliff:g> چل رہا ہے"</string>
<string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> از <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string>
- <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> چل رہی ہے"</string>
+ <string name="controls_media_empty_title" msgid="8296102892421573325">"‫<xliff:g id="APP_NAME">%1$s</xliff:g> چل رہی ہے"</string>
<string name="controls_media_button_play" msgid="2705068099607410633">"چلائیں"</string>
<string name="controls_media_button_pause" msgid="8614887780950376258">"روکیں"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"پچھلا ٹریک"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"اسسٹنٹ کی توجہ آن ہے"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ترتیبات میں ڈیفالٹ نوٹس ایپ سیٹ کریں"</string>
<string name="install_app" msgid="5066668100199613936">"ایپ انسٹال کریں"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 2af9e922c843..514376474b9d 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -118,7 +118,7 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"Koʻrish uchun bosing"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"Ekran yozuvi saqlanmadi"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"Ekranni yozib olish boshlanmadi"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"Butun ekranli rejim"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"Butun ekran rejimi"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Chiqish uchun tepadan pastga torting."</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Orqaga"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Yuz aniqlandi. Davom etish uchun bosing."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yuz aniqlandi. Davom etish uchun ochish belgisini bosing."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Tasdiqlandi"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kod kiritish"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Grafik kalitdan foydalanish"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Paroldan foydalanish"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Yuz bilan ochildi"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Yuz aniqlandi"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Qayta urinish uchun tepaga suring"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"NFC ishlatish uchun qurilma qulfini oching"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Bu qurilma tashkilotingizga tegishli"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Bu qurilma <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tashkilotiga tegishli"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Ulashish, yozib olish va translatsiya qilish vaqtida Android ekranda chiqadigan yoki qurilmada ijro qilinadigan kontentni koʻra oladi. Shu sababli parollar, toʻlov tafsilotlari, xabarlar, suratlar, audio va video chiqmasligi uchun ehtiyot boʻling."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Ilovani ulashish, yozib olish yoki translatsiya qilayotganingizda Android ekranda chiqadigan yoki qurilmada ijro qilinadigan kontentni koʻra oladi. Shu sababli parollar, toʻlov tafsilotlari, xabarlar, suratlar, audio va video chiqmasligi uchun ehtiyot boʻling."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Boshlash"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Ilovalarni almashtirsangiz, ulashuv toʻxtatiladi"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Bu ilovani ulashish"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Ortga qaytarish"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Ilovani almashtirish"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"AT administratoringiz tomonidan bloklangan"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ekranni tasvirga olish qurilmadan foydalanish tartibi tomonidan faolsizlantirilgan"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Hammasini tozalash"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Boshqa PIN kod ishlating"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> uchun oʻzgarishlarni tasdiqlang"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Batafsil axborot olish uchun suring"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Tavsiyalar yuklanmoqda"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Media"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun media boshqaruvi berkitilsinmi?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent diqqati yoniq"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standart qaydlar ilovasini Sozlamalar orqali tanlang"</string>
<string name="install_app" msgid="5066668100199613936">"Ilovani oʻrnatish"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 791337dd60f6..b46166d31900 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -120,7 +120,7 @@
<string name="screenrecord_start_error" msgid="2200660692479682368">"Lỗi khi bắt đầu ghi màn hình"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"Xem toàn màn hình"</string>
<string name="immersive_cling_description" msgid="6913958856085185775">"Để thoát, hãy vuốt từ trên cùng xuống dưới."</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"OK"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"Tôi hiểu"</string>
<string name="accessibility_back" msgid="6530104400086152611">"Quay lại"</string>
<string name="accessibility_home" msgid="5430449841237966217">"Trang chủ"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"Menu"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Đã nhận diện khuôn mặt. Hãy nhấn để tiếp tục."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Đã nhận diện khuôn mặt. Nhấn biểu tượng mở khoá để tiếp tục."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Đã xác thực"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Dùng mã PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Dùng hình mở khóa"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Dùng mật khẩu"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Đã mở khoá bằng khuôn mặt."</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Đã nhận diện khuôn mặt."</string>
<string name="keyguard_retry" msgid="886802522584053523">"Vuốt lên để thử lại"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Mở khóa để sử dụng NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Thiết bị này thuộc về tổ chức của bạn"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Thiết bị này thuộc về <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Khi bạn chia sẻ, ghi hoặc truyền, Android sẽ có quyền truy cập vào mọi nội dung xuất hiện trên màn hình hoặc phát trên thiết bị của bạn. Vì vậy, hãy thận trọng để không làm lộ thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Khi bạn chia sẻ, ghi hoặc truyền ứng dụng, Android sẽ có quyền truy cập vào mọi nội dung xuất hiện hoặc phát trên ứng dụng đó. Vì vậy, hãy thận trọng để không làm lộ các thông tin như mật khẩu, thông tin thanh toán, tin nhắn, ảnh, âm thanh và video."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Bắt đầu"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Quá trình chia sẻ sẽ tạm dừng khi bạn chuyển đổi ứng dụng"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Chia sẻ ứng dụng này"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Chuyển trở lại"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Chuyển đổi ứng dụng"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bị quản trị viên CNTT chặn"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Tính năng chụp ảnh màn hình đã bị tắt theo chính sách thiết bị"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Xóa tất cả"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Thử một mã PIN khác"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Xác nhận thay đổi <xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Vuốt để xem thêm"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Đang tải các đề xuất"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Nội dung nghe nhìn"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Ẩn tính năng điều khiển này cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Trợ lý đang bật"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Đặt ứng dụng ghi chú mặc định trong phần Cài đặt"</string>
<string name="install_app" msgid="5066668100199613936">"Cài đặt ứng dụng"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index bc289ee4244b..b418d7c2a905 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"识别出面孔。点按即可继续。"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"识别出面孔。按下解锁图标即可继续。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已经过身份验证"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 码"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用图案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密码"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"已用面孔解锁"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"已识别出面孔"</string>
<string name="keyguard_retry" msgid="886802522584053523">"向上滑动即可重试"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"需要解锁才能使用 NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"此设备归贵单位所有"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"此设备归<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>所有"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"在分享内容时,Android 可以访问屏幕上显示或设备中播放的所有内容。因此,请务必小心操作,谨防密码、付款信息、消息、照片、音频和视频等内容遭到泄露。"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"在分享、录制或投放内容时,Android 可以访问通过此应用显示或播放的所有内容。因此,请务必小心操作,谨防密码、付款信息、消息、照片、音频和视频等内容遭到泄露。"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"开始"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"切换应用后,分享会暂停"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"改为分享此应用"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"切换回去"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"应用切换"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"已被 IT 管理员禁止"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"设备政策已停用屏幕截图功能"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"试试其他 PIN 码"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"确认<xliff:g id="DEVICE">%s</xliff:g>的更改"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"滑动可查看更多结构"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"正在加载推荐内容"</string>
<string name="controls_media_title" msgid="1746947284862928133">"媒体"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"要针对“<xliff:g id="APP_NAME">%1$s</xliff:g>”隐藏此媒体控件吗?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"已开启 Google 助理感知功能"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在设置中设置默认记事应用"</string>
<string name="install_app" msgid="5066668100199613936">"安装应用"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 8db6dbd8062d..97e16636fb76 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -118,8 +118,8 @@
<string name="screenrecord_save_text" msgid="3008973099800840163">"輕按即可查看"</string>
<string name="screenrecord_save_error" msgid="5862648532560118815">"儲存螢幕錄影時發生錯誤"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"開始錄影畫面時發生錯誤"</string>
- <string name="immersive_cling_title" msgid="8372056499315585941">"開啟全螢幕"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"由頂部向下滑動即可退出。"</string>
+ <string name="immersive_cling_title" msgid="8372056499315585941">"以全螢幕檢視"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"如要退出,請從螢幕頂部向下滑動。"</string>
<string name="immersive_cling_positive" msgid="3076681691468978568">"知道了"</string>
<string name="accessibility_back" msgid="6530104400086152611">"返回"</string>
<string name="accessibility_home" msgid="5430449841237966217">"首頁"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"已識別面孔。按下即可繼續操作。"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"已識別面孔。按解鎖圖示即可繼續。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"驗證咗"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用圖案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"已使用面孔解鎖"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"已識別面孔"</string>
<string name="keyguard_retry" msgid="886802522584053523">"請向上滑動以再試一次"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"解鎖方可使用 NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"此裝置屬於你的機構"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>」"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"當你分享、錄影或投放時,Android 可存取顯示在螢幕畫面上或在裝置上播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片、音訊和影片等。"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"當你分享、錄影或投放應用程式時,Android 可存取顯示在該應用程式中顯示或播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片、音訊和影片等。"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"開始"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"切換應用程式時,系統會暫停分享"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"改為分享此應用程式"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"切換回先前的應用程式"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"切換應用程式"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"已被你的 IT 管理員封鎖"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"螢幕截圖功能因裝置政策而停用"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"嘗試其他 PIN"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"確認<xliff:g id="DEVICE">%s</xliff:g>變更"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"滑動以查看更多"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"正在載入建議"</string>
<string name="controls_media_title" msgid="1746947284862928133">"媒體"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"要隱藏此「<xliff:g id="APP_NAME">%1$s</xliff:g>」媒體控制嗎?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"「Google 助理」感應功能已開啟"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設筆記應用程式"</string>
<string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 9ba2aa9d8660..fc2eda8985a2 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -119,8 +119,8 @@
<string name="screenrecord_save_error" msgid="5862648532560118815">"儲存螢幕錄影內容時發生錯誤"</string>
<string name="screenrecord_start_error" msgid="2200660692479682368">"開始錄製螢幕畫面時發生錯誤"</string>
<string name="immersive_cling_title" msgid="8372056499315585941">"以全螢幕檢視"</string>
- <string name="immersive_cling_description" msgid="6913958856085185775">"如要退出,請從畫面頂端向下滑動。"</string>
- <string name="immersive_cling_positive" msgid="3076681691468978568">"知道了"</string>
+ <string name="immersive_cling_description" msgid="6913958856085185775">"如要退出,請從螢幕頂端向下滑動。"</string>
+ <string name="immersive_cling_positive" msgid="3076681691468978568">"我知道了"</string>
<string name="accessibility_back" msgid="6530104400086152611">"返回"</string>
<string name="accessibility_home" msgid="5430449841237966217">"主畫面"</string>
<string name="accessibility_menu" msgid="2701163794470513040">"選單"</string>
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"臉孔辨識完成,按下即可繼續操作。"</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"臉孔辨識完成,按下「解鎖」圖示即可繼續操作。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已通過驗證"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 碼"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用解鎖圖案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"裝置已透過你的臉解鎖"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"臉孔辨識完成"</string>
<string name="keyguard_retry" msgid="886802522584053523">"向上滑動即可重試"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"如要使用 NFC,請先解鎖"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"此裝置屬於貴機構"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"這部裝置的擁有者為「<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>」"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"當你分享、錄製或投放內容時,Android 將可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"當你分享、錄製或投放內容時,Android 可存取應用程式中顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"開始"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"切換應用程式時暫停分享"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"改為分享這個應用程式"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"切回"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"應用程式切換"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"IT 管理員已封鎖這項操作"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"根據裝置政策規定,螢幕畫面擷取功能已停用"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"試試其他 PIN 碼"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"確認「<xliff:g id="DEVICE">%s</xliff:g>」的變更"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"滑動即可查看其他結構"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"正在載入建議控制項"</string>
<string name="controls_media_title" msgid="1746947284862928133">"媒體"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"要隱藏「<xliff:g id="APP_NAME">%1$s</xliff:g>」的媒體控制選項嗎?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Google 助理感知功能已開啟"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設記事應用程式"</string>
<string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 0e6bde25a1e6..0c440b75f76e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -150,6 +150,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Ubuso buyaziwa. Cindezela ukuze uqhubeke."</string>
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ubuso buyaziwa. Cindezela isithonjana sokuvula ukuze uqhubeke."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kugunyaziwe"</string>
+ <!-- no translation found for biometric_dialog_cancel_authentication (981316588773442637) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Sebenzisa iphinikhodi"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Sebenzisa iphethini"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Sebenzisa iphasiwedi"</string>
@@ -362,6 +364,8 @@
<string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Vula ngobuso"</string>
<string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Ubuso buyaziwa"</string>
<string name="keyguard_retry" msgid="886802522584053523">"Swayiphela phezulu ukuze uzame futhi"</string>
+ <!-- no translation found for accesssibility_keyguard_retry (8880238862712870676) -->
+ <skip />
<string name="require_unlock_for_nfc" msgid="1305686454823018831">"Vula ukuze usebenzise i-NFC"</string>
<string name="do_disclosure_generic" msgid="4896482821974707167">"Le divayisi eyenhlangano yakho"</string>
<string name="do_disclosure_with_name" msgid="2091641464065004091">"Le divayisi ngeye-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
@@ -415,14 +419,10 @@
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Uma wabelana, ukurekhoda, noma ukusakaza, i-Android inokufinyelela kunoma yini ebonakala esikrinini sakho noma okudlalwayo kudivayisi yakho. Ngakho-ke qaphela ngezinto ezifana namaphasiwedi, imininingwane yokukhokha, imilayezo, izithombe, nomsindo nevidiyo."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Uma wabelana, ukurekhoda, noma ukusakaza ku-app, i-Android inokufinyelela kunoma yini eboniswayo noma edlalwa kuleyo app. Ngakho-ke qaphela ngezinto ezfana namaphasiwedi, imininingwane yokukhokha, imilayezo, izithombe, nomsindo nevidiyo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Qala"</string>
- <!-- no translation found for media_projection_task_switcher_text (590885489897412359) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_switch (8682258717291921123) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_action_back (5324164224147845282) -->
- <skip />
- <!-- no translation found for media_projection_task_switcher_notification_channel (7613206306777814253) -->
- <skip />
+ <string name="media_projection_task_switcher_text" msgid="590885489897412359">"Ukwabelana kuyaphumula uma ushintsha ama-app"</string>
+ <string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Yabelana ngale-app esikhundleni salokho"</string>
+ <string name="media_projection_task_switcher_action_back" msgid="5324164224147845282">"Shintshela emuva"</string>
+ <string name="media_projection_task_switcher_notification_channel" msgid="7613206306777814253">"Ukushintsha i-app"</string>
<string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Kuvinjelwe ngumlawuli wakho we-IT"</string>
<string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Ukuthwebula isikrini kukhutshazwe yinqubomgomo yedivayisi"</string>
<string name="clear_all_notifications_text" msgid="348312370303046130">"Sula konke"</string>
@@ -940,6 +940,8 @@
<string name="controls_pin_instructions_retry" msgid="1566667581012131046">"Zama enye Iphinikhodi"</string>
<string name="controls_confirmation_message" msgid="7744104992609594859">"Qinisekisa ushintsho lwe-<xliff:g id="DEVICE">%s</xliff:g>"</string>
<string name="controls_structure_tooltip" msgid="4355922222944447867">"Swayipha ukuze ubone okuningi"</string>
+ <!-- no translation found for retry_face (416380073082560186) -->
+ <skip />
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Ilayisha izincomo"</string>
<string name="controls_media_title" msgid="1746947284862928133">"Imidiya"</string>
<string name="controls_media_close_session" msgid="4780485355795635052">"Fihlela i-<xliff:g id="APP_NAME">%1$s</xliff:g> lesi silawuli semidiya?"</string>
@@ -1166,4 +1168,40 @@
<string name="assistant_attention_content_description" msgid="6830215897604642875">"Ukunaka kwe-Assistant kuvuliwe"</string>
<string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setha i-app yamanothi azenzakalelayo Kumsethingi"</string>
<string name="install_app" msgid="5066668100199613936">"Faka i-app"</string>
+ <!-- no translation found for privacy_dialog_title (7839968133469098311) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_summary (2458769652125995409) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_more_button (7610604080293562345) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_done_button (4504330708531434263) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_expand_action (9129262348628331377) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_collapse_action (277419962019466347) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_button (8006250171305878606) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_close_app_message (1316408652526310985) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_service (8320590856621823604) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_manage_permissions (2543451567190470413) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_call_usage (7858746847946397562) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_call_usage (1214810644978167344) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage (631997836335929880) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage (4883417856848222450) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_1 (9047570143069220911) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_1 (2551340497722370109) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_active_app_usage_2 (2770926061339921767) -->
+ <skip />
+ <!-- no translation found for privacy_dialog_recent_app_usage_2 (2874689735085367167) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index ab754985e11d..9f4fc396ae55 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -26,6 +26,8 @@
<color name="qs_detail_button_white">#B3FFFFFF</color><!-- 70% white -->
<color name="status_bar_clock_color">#FFFFFFFF</color>
<color name="qs_tile_disabled_color">#9E9E9E</color> <!-- 38% black -->
+ <color name="status_bar_icons_hover_color_light">#38FFFFFF</color> <!-- 22% white -->
+ <color name="status_bar_icons_hover_color_dark">#38000000</color> <!-- 22% black -->
<!-- The color of the background in the separated list of the Global Actions menu -->
<color name="global_actions_separated_background">#F5F5F5</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 5a15dcec5223..de8287e5e8cb 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -475,6 +475,8 @@
<!-- Margin start of the system icons super container -->
<dimen name="system_icons_super_container_margin_start">16dp</dimen>
+ <dimen name="status_icons_hover_state_background_radius">16dp</dimen>
+
<!-- Width for the notification panel and related windows -->
<dimen name="match_parent">-1px</dimen>
@@ -821,6 +823,12 @@
<dimen name="keyguard_affordance_fixed_radius">24dp</dimen>
<dimen name="keyguard_affordance_fixed_padding">12dp</dimen>
+ <!-- The width/height/padding of the keyguard settings popup menu -->
+ <dimen name="keyguard_settings_popup_menu_icon_height">24dp</dimen>
+ <dimen name="keyguard_settings_popup_menu_icon_width">24dp</dimen>
+ <dimen name="keyguard_settings_popup_menu_icon_end_margin">8dp</dimen>
+ <dimen name="keyguard_settings_popup_menu_padding">12dp</dimen>
+
<!-- Amount the button should shake when it's not long-pressed for long enough. -->
<dimen name="keyguard_affordance_shake_amplitude">8dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 983b09f957ae..ee9b132facbe 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -439,6 +439,8 @@
<string name="face_reenroll_failure_dialog_content">Couldn\u2019t set up face unlock. Go to Settings to try again.</string>
<!-- Message shown when the system-provided fingerprint dialog is shown, asking for authentication -->
<string name="fingerprint_dialog_touch_sensor">Touch the fingerprint sensor</string>
+ <!-- Content description after successful auth when confirmation required -->
+ <string name="fingerprint_dialog_authenticated_confirmation">Press the unlock icon to continue</string>
<!-- Message shown to inform the user a face cannot be recognized and fingerprint should instead be used.[CHAR LIMIT=50] -->
<string name="fingerprint_dialog_use_fingerprint_instead">Can\u2019t recognize face. Use fingerprint instead.</string>
<!-- Message shown to inform the user a face cannot be recognized and fingerprint should instead be used.[CHAR LIMIT=50] -->
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 4a6e53d304f4..0b9e6e98ae38 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -31,7 +31,7 @@ import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.systemui.R
+import com.android.systemui.customization.R
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 4793b4f37eb3..00256c4d7707 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -66,9 +66,12 @@ public class KeyguardClockSwitch extends RelativeLayout {
/** Returns a region for the large clock to position itself, based on the given parent. */
public static Rect getLargeClockRegion(ViewGroup parent) {
int largeClockTopMargin = parent.getResources()
- .getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin);
+ .getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.keyguard_large_clock_top_margin);
int targetHeight = parent.getResources()
- .getDimensionPixelSize(R.dimen.large_clock_text_size) * 2;
+ .getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.large_clock_text_size)
+ * 2;
int top = parent.getHeight() / 2 - targetHeight / 2
+ largeClockTopMargin / 2;
return new Rect(
@@ -81,7 +84,8 @@ public class KeyguardClockSwitch extends RelativeLayout {
/** Returns a region for the small clock to position itself, based on the given parent. */
public static Rect getSmallClockRegion(ViewGroup parent) {
int targetHeight = parent.getResources()
- .getDimensionPixelSize(R.dimen.small_clock_text_size);
+ .getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_text_size);
return new Rect(
parent.getLeft(),
parent.getTop(),
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index d615e1825f43..4d3a74281b29 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -229,7 +229,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
mKeyguardSmallClockTopMargin =
mView.getResources().getDimensionPixelSize(R.dimen.keyguard_clock_top_margin);
mKeyguardLargeClockTopMargin =
- mView.getResources().getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin);
+ mView.getResources().getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.keyguard_large_clock_top_margin);
mKeyguardDateWeatherViewInvisibility =
mView.getResources().getInteger(R.integer.keyguard_date_weather_view_invisibility);
@@ -365,7 +366,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
mKeyguardSmallClockTopMargin =
mView.getResources().getDimensionPixelSize(R.dimen.keyguard_clock_top_margin);
mKeyguardLargeClockTopMargin =
- mView.getResources().getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin);
+ mView.getResources().getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.keyguard_large_clock_top_margin);
mKeyguardDateWeatherViewInvisibility =
mView.getResources().getInteger(R.integer.keyguard_date_weather_view_invisibility);
mView.updateClockTargetRegions();
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 42a4e7202c82..61addabe7341 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -1167,7 +1167,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
}
drawable.setTint(iconColor);
- Drawable bg = context.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = context.getDrawable(
+ com.android.settingslib.R.drawable.user_avatar_bg);
bg.setTintBlendMode(BlendMode.DST);
bg.setTint(Utils.getColorAttrDefaultColor(context,
com.android.internal.R.attr.colorSurfaceVariant));
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 5833d98f04b2..48442a5f527e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -3563,6 +3563,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
*/
@VisibleForTesting
void handleUserSwitching(int userId, CountDownLatch latch) {
+ mLogger.logUserSwitching(userId, "from UserTracker");
Assert.isMainThread();
clearBiometricRecognized();
boolean trustUsuallyManaged = mTrustManager.isTrustUsuallyManaged(userId);
@@ -3583,6 +3584,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
*/
@VisibleForTesting
void handleUserSwitchComplete(int userId) {
+ mLogger.logUserSwitchComplete(userId, "from UserTracker");
Assert.isMainThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -4036,6 +4038,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
@AnyThread
public void setSwitchingUser(boolean switching) {
+ if (switching) {
+ mLogger.logUserSwitching(getCurrentUser(), "from setSwitchingUser");
+ } else {
+ mLogger.logUserSwitchComplete(getCurrentUser(), "from setSwitchingUser");
+ }
mSwitchingUser = switching;
// Since this comes in on a binder thread, we need to post it first
mHandler.post(() -> updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE,
diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
index 59e0cadec9b2..2dfb370bb382 100644
--- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
+++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt
@@ -602,10 +602,10 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) {
fun allowFingerprintOnCurrentOccludingActivityChanged(allow: Boolean) {
logBuffer.log(
- TAG,
- VERBOSE,
- { bool1 = allow },
- { "allowFingerprintOnCurrentOccludingActivityChanged: $bool1" }
+ TAG,
+ VERBOSE,
+ { bool1 = allow },
+ { "allowFingerprintOnCurrentOccludingActivityChanged: $bool1" }
)
}
@@ -727,4 +727,28 @@ constructor(@KeyguardUpdateMonitorLog private val logBuffer: LogBuffer) {
{ "notifying about enrollments changed: $str1" }
)
}
+
+ fun logUserSwitching(userId: Int, context: String) {
+ logBuffer.log(
+ TAG,
+ DEBUG,
+ {
+ int1 = userId
+ str1 = context
+ },
+ { "userCurrentlySwitching: $str1, userId: $int1" }
+ )
+ }
+
+ fun logUserSwitchComplete(userId: Int, context: String) {
+ logBuffer.log(
+ TAG,
+ DEBUG,
+ {
+ int1 = userId
+ str1 = context
+ },
+ { "userSwitchComplete: $str1, userId: $int1" }
+ )
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
index fa9a83ec9913..7a6b1c372a24 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java
@@ -64,12 +64,15 @@ public final class GuestSessionNotification {
}
String contentText;
if (userInfo.isEphemeral()) {
- contentText = mContext.getString(R.string.guest_notification_ephemeral);
+ contentText = mContext.getString(
+ com.android.settingslib.R.string.guest_notification_ephemeral);
} else if (isGuestFirstLogin) {
- contentText = mContext.getString(R.string.guest_notification_non_ephemeral);
+ contentText = mContext.getString(
+ com.android.settingslib.R.string.guest_notification_non_ephemeral);
} else {
contentText = mContext.getString(
- R.string.guest_notification_non_ephemeral_non_first_login);
+ com.android.settingslib.R.string
+ .guest_notification_non_ephemeral_non_first_login);
}
final Intent guestExitIntent = new Intent(
@@ -89,7 +92,7 @@ public final class GuestSessionNotification {
Notification.Builder builder = new Notification.Builder(mContext,
NotificationChannels.ALERTS)
- .setSmallIcon(R.drawable.ic_account_circle)
+ .setSmallIcon(com.android.settingslib.R.drawable.ic_account_circle)
.setContentTitle(mContext.getString(R.string.guest_notification_session_active))
.setContentText(contentText)
.setPriority(Notification.PRIORITY_DEFAULT)
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java
index 225a2f74e469..b1de127a4e4b 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java
@@ -24,7 +24,6 @@ import android.view.MotionEvent;
import androidx.annotation.NonNull;
import androidx.dynamicanimation.animation.DynamicAnimation;
-import com.android.systemui.R;
import com.android.wm.shell.common.bubbles.DismissView;
import com.android.wm.shell.common.magnetictarget.MagnetizedObject;
@@ -157,9 +156,9 @@ class DismissAnimationController {
void updateResources() {
final float maxDismissSize = mDismissView.getResources().getDimensionPixelSize(
- R.dimen.dismiss_circle_size);
+ com.android.wm.shell.R.dimen.dismiss_circle_size);
mMinDismissSize = mDismissView.getResources().getDimensionPixelSize(
- R.dimen.dismiss_circle_small);
+ com.android.wm.shell.R.dimen.dismiss_circle_small);
mSizePercent = mMinDismissSize / maxDismissSize;
}
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
index 234795fa9639..46fcdbc909b6 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
@@ -106,7 +106,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver {
TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
defStyle, 0);
final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,
- context.getColor(R.color.meter_background_color));
+ context.getColor(com.android.settingslib.R.color.meter_background_color));
mPercentageStyleId = atts.getResourceId(R.styleable.BatteryMeterView_textAppearance, 0);
mDrawable = new AccessorizedBatteryDrawable(context, frameColor);
atts.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt
index 9807b9e6f1b3..a1b15f4498a7 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintIconController.kt
@@ -142,13 +142,18 @@ open class AuthBiometricFingerprintIconController(
STATE_IDLE,
STATE_AUTHENTICATING_ANIMATING_IN,
STATE_AUTHENTICATING,
- STATE_PENDING_CONFIRMATION,
STATE_AUTHENTICATED ->
if (isSideFps) {
R.string.security_settings_sfps_enroll_find_sensor_message
} else {
R.string.fingerprint_dialog_touch_sensor
}
+ STATE_PENDING_CONFIRMATION ->
+ if (isSideFps) {
+ R.string.security_settings_sfps_enroll_find_sensor_message
+ } else {
+ R.string.fingerprint_dialog_authenticated_confirmation
+ }
STATE_ERROR,
STATE_HELP -> R.string.biometric_dialog_try_again
else -> null
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
index 37ce44488346..063f62e19686 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt
@@ -50,7 +50,9 @@ import androidx.annotation.RawRes
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.model.KeyPath
+import com.android.app.animation.Interpolators
import com.android.internal.annotations.VisibleForTesting
+import com.android.keyguard.KeyguardPINView
import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
@@ -112,7 +114,7 @@ constructor(
private val isReverseDefaultRotation =
context.resources.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)
- private var overlayHideAnimator: ViewPropertyAnimator? = null
+ private var overlayShowAnimator: ViewPropertyAnimator? = null
private var overlayView: View? = null
set(value) {
@@ -122,13 +124,23 @@ constructor(
windowManager.removeView(oldView)
orientationListener.disable()
}
- overlayHideAnimator?.cancel()
- overlayHideAnimator = null
+ overlayShowAnimator?.cancel()
+ overlayShowAnimator = null
field = value
field?.let { newView ->
+ if (requests.contains(SideFpsUiRequestSource.PRIMARY_BOUNCER)) {
+ newView.alpha = 0f
+ overlayShowAnimator =
+ newView
+ .animate()
+ .alpha(1f)
+ .setDuration(KeyguardPINView.ANIMATION_DURATION)
+ .setInterpolator(Interpolators.ALPHA_IN)
+ }
windowManager.addView(newView, overlayViewParams)
orientationListener.enable()
+ overlayShowAnimator?.start()
}
}
@VisibleForTesting var overlayOffsets: SensorLocationInternal = SensorLocationInternal.DEFAULT
@@ -434,7 +446,7 @@ private fun LottieAnimationView.addOverlayDynamicColor(
for (key in listOf(".blue600", ".blue400")) {
addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(
- context.getColor(R.color.settingslib_color_blue400),
+ context.getColor(com.android.settingslib.R.color.settingslib_color_blue400),
PorterDuff.Mode.SRC_ATOP
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
index f17d0f307473..6b1c85fa46fd 100644
--- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
@@ -61,7 +61,7 @@ class ContrastDialog(
)
dismiss()
}
- setPositiveButton(R.string.done) { _, _ -> dismiss() }
+ setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dismiss() }
super.onCreate(savedInstanceState)
contrastButtons =
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java b/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java
index a3e26b881a3b..d727a70de377 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java
@@ -28,6 +28,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
import com.android.systemui.statusbar.phone.ActivityStarterImpl;
import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl;
+import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
import com.android.systemui.volume.VolumeDialogControllerImpl;
import dagger.Binds;
@@ -49,6 +50,10 @@ public abstract class PluginModule {
@Binds
abstract DarkIconDispatcher provideDarkIconDispatcher(DarkIconDispatcherImpl controllerImpl);
+ @Binds
+ abstract SysuiDarkIconDispatcher provideSysuiDarkIconDispatcher(
+ DarkIconDispatcherImpl controllerImpl);
+
/** */
@Binds
abstract FalsingManager provideFalsingManager(FalsingManagerProxy falsingManagerImpl);
diff --git a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
index 75284fc18149..ae40f7e8d7c0 100644
--- a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt
@@ -16,12 +16,10 @@
package com.android.systemui.dump
-import android.content.Context
+import android.icu.text.SimpleDateFormat
import android.os.SystemClock
import android.os.Trace
-import com.android.systemui.CoreStartable
import com.android.systemui.ProtoDumpable
-import com.android.systemui.R
import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_CRITICAL
import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_NORMAL
import com.android.systemui.dump.DumpsysEntry.DumpableEntry
@@ -35,8 +33,9 @@ import java.io.BufferedOutputStream
import java.io.FileDescriptor
import java.io.FileOutputStream
import java.io.PrintWriter
+import java.util.Locale
import javax.inject.Inject
-import javax.inject.Provider
+import kotlin.system.measureTimeMillis
/**
* Oversees SystemUI's output during bug reports (and dumpsys in general)
@@ -77,6 +76,7 @@ import javax.inject.Provider
* $ <invocation> dumpables
* $ <invocation> buffers
* $ <invocation> tables
+ * $ <invocation> all
*
* # Finally, the following will simulate what we dump during the CRITICAL and NORMAL sections of a
* # bug report:
@@ -91,10 +91,9 @@ import javax.inject.Provider
class DumpHandler
@Inject
constructor(
- private val context: Context,
private val dumpManager: DumpManager,
private val logBufferEulogizer: LogBufferEulogizer,
- private val startables: MutableMap<Class<*>, Provider<CoreStartable>>,
+ private val config: SystemUIConfigDumpable,
) {
/** Dump the diagnostics! Behavior can be controlled via [args]. */
fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) {
@@ -109,6 +108,8 @@ constructor(
return
}
+ pw.print("Dump starting: ")
+ pw.println(DATE_FORMAT.format(System.currentTimeMillis()))
when {
parsedArgs.dumpPriority == PRIORITY_ARG_CRITICAL -> dumpCritical(pw, parsedArgs)
parsedArgs.dumpPriority == PRIORITY_ARG_NORMAL && !parsedArgs.proto -> {
@@ -129,6 +130,11 @@ constructor(
"dumpables" -> dumpDumpables(pw, args)
"buffers" -> dumpBuffers(pw, args)
"tables" -> dumpTables(pw, args)
+ "all" -> {
+ dumpDumpables(pw, args)
+ dumpBuffers(pw, args)
+ dumpTables(pw, args)
+ }
"config" -> dumpConfig(pw)
"help" -> dumpHelp(pw)
else -> {
@@ -148,7 +154,6 @@ constructor(
dumpDumpable(target, pw, args.rawArgs)
}
}
- dumpConfig(pw)
}
private fun dumpNormal(pw: PrintWriter, args: ParsedArgs) {
@@ -251,53 +256,8 @@ constructor(
.sortedBy { it.name }
.minByOrNull { it.name.length }
- private fun dumpDumpable(entry: DumpableEntry, pw: PrintWriter, args: Array<String>) {
- pw.preamble(entry)
- entry.dumpable.dump(pw, args)
- }
-
- private fun dumpBuffer(entry: LogBufferEntry, pw: PrintWriter, tailLength: Int) {
- pw.preamble(entry)
- entry.buffer.dump(pw, tailLength)
- }
-
- private fun dumpTableBuffer(buffer: TableLogBufferEntry, pw: PrintWriter, args: Array<String>) {
- pw.preamble(buffer)
- buffer.table.dump(pw, args)
- }
-
private fun dumpConfig(pw: PrintWriter) {
- pw.println("SystemUiServiceComponents configuration:")
- pw.print("vendor component: ")
- pw.println(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
- val services: MutableList<String> =
- startables.keys.map({ cls: Class<*> -> cls.simpleName }).toMutableList()
-
- services.add(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
- dumpServiceList(pw, "global", services.toTypedArray())
- dumpServiceList(pw, "per-user", R.array.config_systemUIServiceComponentsPerUser)
- }
-
- private fun dumpServiceList(pw: PrintWriter, type: String, resId: Int) {
- val services: Array<String> = context.resources.getStringArray(resId)
- dumpServiceList(pw, type, services)
- }
-
- private fun dumpServiceList(pw: PrintWriter, type: String, services: Array<String>?) {
- pw.print(type)
- pw.print(": ")
- if (services == null) {
- pw.println("N/A")
- return
- }
- pw.print(services.size)
- pw.println(" services")
- for (i in services.indices) {
- pw.print(" ")
- pw.print(i)
- pw.print(": ")
- pw.println(services[i])
- }
+ config.dump(pw, arrayOf())
}
private fun dumpHelp(pw: PrintWriter) {
@@ -426,13 +386,6 @@ constructor(
const val DUMPSYS_DUMPABLE_DIVIDER =
"----------------------------------------------------------------------------"
- /**
- * Important: do not change this divider without updating any bug report processing tools
- * (e.g. ABT), since this divider is used to determine boundaries for bug report views
- */
- const val DUMPSYS_BUFFER_DIVIDER =
- "============================================================================"
-
private fun findBestTargetMatch(c: Collection<DumpsysEntry>, target: String) =
c.asSequence().filter { it.name.endsWith(target) }.minByOrNull { it.name.length }
@@ -453,42 +406,71 @@ constructor(
is DumpableEntry,
is TableLogBufferEntry -> {
println()
- println(entry.name)
+ println("${entry.name}:")
println(DUMPSYS_DUMPABLE_DIVIDER)
}
is LogBufferEntry -> {
println()
println()
println("BUFFER ${entry.name}:")
- println(DUMPSYS_BUFFER_DIVIDER)
+ println(DUMPSYS_DUMPABLE_DIVIDER)
}
}
+ private fun PrintWriter.footer(entry: DumpsysEntry, dumpTimeMillis: Long) {
+ if (entry !is DumpableEntry) return
+ println()
+ print(entry.priority)
+ print(" dump took ")
+ print(dumpTimeMillis)
+ print("ms -- ")
+ print(entry.name)
+ if (entry.priority == DumpPriority.CRITICAL && dumpTimeMillis > 25) {
+ print(" -- warning: individual dump time exceeds 5% of total CRITICAL dump time!")
+ }
+ println()
+ }
+
+ private inline fun PrintWriter.wrapSection(entry: DumpsysEntry, block: () -> Unit) {
+ preamble(entry)
+ val dumpTime = measureTimeMillis(block)
+ footer(entry, dumpTime)
+ }
+
/**
- * Zero-arg utility to write a [DumpableEntry] to the given [PrintWriter] in a
+ * Utility to write a [DumpableEntry] to the given [PrintWriter] in a
* dumpsys-appropriate format.
*/
- private fun dumpDumpable(entry: DumpableEntry, pw: PrintWriter) {
- pw.preamble(entry)
- entry.dumpable.dump(pw, arrayOf())
+ private fun dumpDumpable(
+ entry: DumpableEntry,
+ pw: PrintWriter,
+ args: Array<String> = arrayOf(),
+ ) = pw.wrapSection(entry) {
+ entry.dumpable.dump(pw, args)
}
/**
- * Zero-arg utility to write a [LogBufferEntry] to the given [PrintWriter] in a
+ * Utility to write a [LogBufferEntry] to the given [PrintWriter] in a
* dumpsys-appropriate format.
*/
- private fun dumpBuffer(entry: LogBufferEntry, pw: PrintWriter) {
- pw.preamble(entry)
- entry.buffer.dump(pw, 0)
+ private fun dumpBuffer(
+ entry: LogBufferEntry,
+ pw: PrintWriter,
+ tailLength: Int = 0,
+ ) = pw.wrapSection(entry) {
+ entry.buffer.dump(pw, tailLength)
}
/**
- * Zero-arg utility to write a [TableLogBufferEntry] to the given [PrintWriter] in a
+ * Utility to write a [TableLogBufferEntry] to the given [PrintWriter] in a
* dumpsys-appropriate format.
*/
- private fun dumpTableBuffer(entry: TableLogBufferEntry, pw: PrintWriter) {
- pw.preamble(entry)
- entry.table.dump(pw, arrayOf())
+ private fun dumpTableBuffer(
+ entry: TableLogBufferEntry,
+ pw: PrintWriter,
+ args: Array<String> = arrayOf(),
+ ) = pw.wrapSection(entry) {
+ entry.table.dump(pw, args)
}
/**
@@ -510,6 +492,7 @@ constructor(
}
}
+private val DATE_FORMAT = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US)
private val PRIORITY_OPTIONS = arrayOf(PRIORITY_ARG_CRITICAL, PRIORITY_ARG_NORMAL)
private val COMMANDS =
diff --git a/packages/SystemUI/src/com/android/systemui/dump/SystemUIConfigDumpable.kt b/packages/SystemUI/src/com/android/systemui/dump/SystemUIConfigDumpable.kt
new file mode 100644
index 000000000000..b70edcc27254
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/dump/SystemUIConfigDumpable.kt
@@ -0,0 +1,73 @@
+/*
+ * 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.dump
+
+import android.content.Context
+import com.android.systemui.CoreStartable
+import com.android.systemui.Dumpable
+import com.android.systemui.R
+import com.android.systemui.dagger.SysUISingleton
+import java.io.PrintWriter
+import javax.inject.Inject
+import javax.inject.Provider
+
+@SysUISingleton
+class SystemUIConfigDumpable
+@Inject
+constructor(
+ dumpManager: DumpManager,
+ private val context: Context,
+ private val startables: MutableMap<Class<*>, Provider<CoreStartable>>,
+) : Dumpable {
+ init {
+ dumpManager.registerCriticalDumpable("SystemUiServiceComponents", this)
+ }
+
+ override fun dump(pw: PrintWriter, args: Array<out String>) {
+ pw.println("SystemUiServiceComponents configuration:")
+ pw.print("vendor component: ")
+ pw.println(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
+ val services: MutableList<String> =
+ startables.keys.map { cls: Class<*> -> cls.simpleName }.toMutableList()
+
+ services.add(context.resources.getString(R.string.config_systemUIVendorServiceComponent))
+ dumpServiceList(pw, "global", services.toTypedArray())
+ dumpServiceList(pw, "per-user", R.array.config_systemUIServiceComponentsPerUser)
+ }
+
+ private fun dumpServiceList(pw: PrintWriter, type: String, resId: Int) {
+ val services: Array<String> = context.resources.getStringArray(resId)
+ dumpServiceList(pw, type, services)
+ }
+
+ private fun dumpServiceList(pw: PrintWriter, type: String, services: Array<String>?) {
+ pw.print(type)
+ pw.print(": ")
+ if (services == null) {
+ pw.println("N/A")
+ return
+ }
+ pw.print(services.size)
+ pw.println(" services")
+ for (i in services.indices) {
+ pw.print(" ")
+ pw.print(i)
+ pw.print(": ")
+ pw.println(services[i])
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 66813f90bac4..f3339c06ce8f 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -354,6 +354,10 @@ object Flags {
// TODO(b/280426085): Tracking Bug
@JvmField val NEW_BLUETOOTH_REPOSITORY = releasedFlag(612, "new_bluetooth_repository")
+ // TODO(b/292533677): Tracking Bug
+ val WIFI_TRACKER_LIB_FOR_WIFI_ICON =
+ unreleasedFlag(613, "wifi_tracker_lib_for_wifi_icon")
+
// 700 - dialer/calls
// TODO(b/254512734): Tracking Bug
val ONGOING_CALL_STATUS_BAR_CHIP = releasedFlag(700, "ongoing_call_status_bar_chip")
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
index 03a270ebea68..4495943c72c9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt
@@ -17,6 +17,7 @@
package com.android.systemui.keyguard
+import android.content.res.Configuration
import android.view.View
import android.view.ViewGroup
import com.android.systemui.CoreStartable
@@ -24,18 +25,29 @@ import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.ui.binder.KeyguardAmbientIndicationAreaViewBinder
import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder
+import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder
import com.android.systemui.keyguard.ui.binder.KeyguardRootViewBinder
+import com.android.systemui.keyguard.ui.binder.KeyguardSettingsViewBinder
import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardAmbientIndicationViewModel
import com.android.systemui.keyguard.ui.view.layout.KeyguardLayoutManager
import com.android.systemui.keyguard.ui.view.layout.KeyguardLayoutManagerCommandListener
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardQuickAffordancesCombinedViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.plugins.FalsingManager
import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel
import com.android.systemui.shade.NotificationShadeWindowView
import com.android.systemui.statusbar.KeyguardIndicationController
import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel
+import com.android.systemui.statusbar.VibratorHelper
+import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
import javax.inject.Inject
import kotlinx.coroutines.DisposableHandle
@@ -49,26 +61,44 @@ class KeyguardViewConfigurator
constructor(
private val keyguardRootView: KeyguardRootView,
private val sharedNotificationContainer: SharedNotificationContainer,
+ private val keyguardRootViewModel: KeyguardRootViewModel,
private val keyguardIndicationAreaViewModel: KeyguardIndicationAreaViewModel,
private val sharedNotificationContainerViewModel: SharedNotificationContainerViewModel,
+ private val keyguardAmbientIndicationViewModel: KeyguardAmbientIndicationViewModel,
private val notificationShadeWindowView: NotificationShadeWindowView,
private val featureFlags: FeatureFlags,
private val indicationController: KeyguardIndicationController,
private val keyguardLayoutManager: KeyguardLayoutManager,
private val keyguardLayoutManagerCommandListener: KeyguardLayoutManagerCommandListener,
+ private val keyguardQuickAffordancesCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel,
+ private val falsingManager: FalsingManager,
+ private val vibratorHelper: VibratorHelper,
+ private val keyguardStateController: KeyguardStateController,
+ private val keyguardSettingsMenuViewModel: KeyguardSettingsMenuViewModel,
+ private val activityStarter: ActivityStarter,
private val occludingAppDeviceEntryMessageViewModel: OccludingAppDeviceEntryMessageViewModel,
private val chipbarCoordinator: ChipbarCoordinator,
) : CoreStartable {
+ private var rootViewHandle: DisposableHandle? = null
private var indicationAreaHandle: DisposableHandle? = null
+ private var leftShortcutHandle: KeyguardQuickAffordanceViewBinder.Binding? = null
+ private var rightShortcutHandle: KeyguardQuickAffordanceViewBinder.Binding? = null
+ private var ambientIndicationAreaHandle: KeyguardAmbientIndicationAreaViewBinder.Binding? = null
+ private var settingsPopupMenuHandle: DisposableHandle? = null
override fun start() {
bindKeyguardRootView()
val notificationPanel =
notificationShadeWindowView.requireViewById(R.id.notification_panel) as ViewGroup
- bindIndicationArea(notificationPanel)
+ unbindKeyguardBottomArea(notificationPanel)
+ bindIndicationArea()
bindLockIconView(notificationPanel)
setupNotificationStackScrollLayout(notificationPanel)
+ bindLeftShortcut()
+ bindRightShortcut()
+ bindAmbientIndicationArea()
+ bindSettingsPopupMenu()
keyguardLayoutManager.layoutViews()
keyguardLayoutManagerCommandListener.start()
@@ -90,16 +120,21 @@ constructor(
}
}
- fun bindIndicationArea(legacyParent: ViewGroup) {
+ override fun onConfigurationChanged(newConfig: Configuration?) {
+ super.onConfigurationChanged(newConfig)
+ leftShortcutHandle?.onConfigurationChanged()
+ rightShortcutHandle?.onConfigurationChanged()
+ ambientIndicationAreaHandle?.onConfigurationChanged()
+
+ keyguardLayoutManager.layoutViews()
+ }
+
+ fun bindIndicationArea() {
indicationAreaHandle?.dispose()
// At startup, 2 views with the ID `R.id.keyguard_indication_area` will be available.
// Disable one of them
- if (featureFlags.isEnabled(Flags.MIGRATE_INDICATION_AREA)) {
- legacyParent.findViewById<View>(R.id.keyguard_indication_area)?.let {
- legacyParent.removeView(it)
- }
- } else {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_INDICATION_AREA)) {
keyguardRootView.findViewById<View?>(R.id.keyguard_indication_area)?.let {
keyguardRootView.removeView(it)
}
@@ -109,10 +144,24 @@ constructor(
KeyguardIndicationAreaBinder.bind(
notificationShadeWindowView,
keyguardIndicationAreaViewModel,
- indicationController
+ keyguardRootViewModel,
+ indicationController,
+ featureFlags,
)
}
+ private fun bindKeyguardRootView() {
+ rootViewHandle?.dispose()
+ rootViewHandle = KeyguardRootViewBinder.bind(
+ keyguardRootView,
+ keyguardRootViewModel,
+ featureFlags,
+ occludingAppDeviceEntryMessageViewModel,
+ chipbarCoordinator,
+ keyguardStateController,
+ )
+ }
+
private fun bindLockIconView(legacyParent: ViewGroup) {
if (featureFlags.isEnabled(Flags.MIGRATE_LOCK_ICON)) {
legacyParent.requireViewById<View>(R.id.lock_icon_view).let {
@@ -125,12 +174,84 @@ constructor(
}
}
- private fun bindKeyguardRootView() {
- KeyguardRootViewBinder.bind(
- keyguardRootView,
- featureFlags,
- occludingAppDeviceEntryMessageViewModel,
- chipbarCoordinator,
- )
+ private fun bindAmbientIndicationArea() {
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ ambientIndicationAreaHandle?.destroy()
+ ambientIndicationAreaHandle =
+ KeyguardAmbientIndicationAreaViewBinder.bind(
+ notificationShadeWindowView,
+ keyguardAmbientIndicationViewModel,
+ keyguardRootViewModel,
+ )
+ } else {
+ keyguardRootView.findViewById<View?>(R.id.ambient_indication_container)?.let {
+ keyguardRootView.removeView(it)
+ }
+ }
+ }
+
+ private fun bindSettingsPopupMenu() {
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ settingsPopupMenuHandle?.dispose()
+ settingsPopupMenuHandle =
+ KeyguardSettingsViewBinder.bind(
+ keyguardRootView,
+ keyguardSettingsMenuViewModel,
+ vibratorHelper,
+ activityStarter,
+ )
+ } else {
+ keyguardRootView.findViewById<View?>(R.id.keyguard_settings_button)?.let {
+ keyguardRootView.removeView(it)
+ }
+ }
+ }
+
+ private fun unbindKeyguardBottomArea(legacyParent: ViewGroup) {
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ legacyParent.requireViewById<View>(R.id.keyguard_bottom_area).let {
+ legacyParent.removeView(it)
+ }
+ }
+ }
+
+ private fun bindLeftShortcut() {
+ leftShortcutHandle?.destroy()
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ leftShortcutHandle =
+ KeyguardQuickAffordanceViewBinder.bind(
+ keyguardRootView.requireViewById(R.id.start_button),
+ keyguardQuickAffordancesCombinedViewModel.startButton,
+ keyguardRootViewModel.alpha,
+ falsingManager,
+ vibratorHelper,
+ ) {
+ indicationController.showTransientIndication(it)
+ }
+ } else {
+ keyguardRootView.findViewById<View?>(R.id.start_button)?.let {
+ keyguardRootView.removeView(it)
+ }
+ }
+ }
+
+ private fun bindRightShortcut() {
+ rightShortcutHandle?.destroy()
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ rightShortcutHandle =
+ KeyguardQuickAffordanceViewBinder.bind(
+ keyguardRootView.requireViewById(R.id.end_button),
+ keyguardQuickAffordancesCombinedViewModel.endButton,
+ keyguardRootViewModel.alpha,
+ falsingManager,
+ vibratorHelper,
+ ) {
+ indicationController.showTransientIndication(it)
+ }
+ } else {
+ keyguardRootView.findViewById<View?>(R.id.end_button)?.let {
+ keyguardRootView.removeView(it)
+ }
+ }
}
}
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 7475c4251211..9ee990243b96 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
@@ -37,6 +37,7 @@ import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
import com.android.systemui.keyguard.shared.model.BiometricUnlockSource
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
+import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.ScreenModel
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.WakefulnessModel
@@ -76,6 +77,8 @@ interface KeyguardRepository {
*/
val bottomAreaAlpha: StateFlow<Float>
+ val keyguardAlpha: StateFlow<Float>
+
/**
* Observable of the relative offset of the lock-screen clock from its natural position on the
* screen.
@@ -170,6 +173,9 @@ interface KeyguardRepository {
/** Whether quick settings or quick-quick settings is visible. */
val isQuickSettingsVisible: Flow<Boolean>
+ /** Represents the current state of the KeyguardRootView visibility */
+ val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState>
+
/** Receive an event for doze time tick */
val dozeTimeTick: Flow<Unit>
@@ -194,8 +200,14 @@ interface KeyguardRepository {
fun setAnimateDozingTransitions(animate: Boolean)
/** Sets the current amount of alpha that should be used for rendering the bottom area. */
+ @Deprecated("Deprecated as part of b/278057014")
fun setBottomAreaAlpha(alpha: Float)
+ /** Sets the current amount of alpha that should be used for rendering the keyguard. */
+ fun setKeyguardAlpha(alpha: Float)
+
+ fun setKeyguardVisibility(statusBarState: Int, goingToFullShade: Boolean, occlusionTransitionRunning: Boolean)
+
/**
* Sets the relative offset of the lock-screen clock from its natural position on the screen.
*/
@@ -244,6 +256,9 @@ constructor(
private val _bottomAreaAlpha = MutableStateFlow(1f)
override val bottomAreaAlpha = _bottomAreaAlpha.asStateFlow()
+ private val _keyguardAlpha = MutableStateFlow(1f)
+ override val keyguardAlpha = _keyguardAlpha.asStateFlow()
+
private val _clockPosition = MutableStateFlow(Position(0, 0))
override val clockPosition = _clockPosition.asStateFlow()
@@ -686,6 +701,17 @@ constructor(
private val _isActiveDreamLockscreenHosted = MutableStateFlow(false)
override val isActiveDreamLockscreenHosted = _isActiveDreamLockscreenHosted.asStateFlow()
+ private val _keyguardRootViewVisibility =
+ MutableStateFlow(
+ KeyguardRootViewVisibilityState(
+ com.android.systemui.statusbar.StatusBarState.SHADE,
+ goingToFullShade = false,
+ occlusionTransitionRunning = false,
+ )
+ )
+ override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> =
+ _keyguardRootViewVisibility.asStateFlow()
+
override fun setAnimateDozingTransitions(animate: Boolean) {
_animateBottomAreaDozingTransitions.value = animate
}
@@ -694,6 +720,23 @@ constructor(
_bottomAreaAlpha.value = alpha
}
+ override fun setKeyguardAlpha(alpha: Float) {
+ _keyguardAlpha.value = alpha
+ }
+
+ override fun setKeyguardVisibility(
+ statusBarState: Int,
+ goingToFullShade: Boolean,
+ occlusionTransitionRunning: Boolean
+ ) {
+ _keyguardRootViewVisibility.value =
+ KeyguardRootViewVisibilityState(
+ statusBarState,
+ goingToFullShade,
+ occlusionTransitionRunning
+ )
+ }
+
override fun setClockPosition(x: Int, y: Int) {
_clockPosition.value = Position(x, y)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt
index c849b8495a26..508f71a2c4a5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/BiometricMessageInteractor.kt
@@ -20,6 +20,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.content.res.Resources
import android.hardware.biometrics.BiometricSourceType
import android.hardware.biometrics.BiometricSourceType.FINGERPRINT
+import android.hardware.fingerprint.FingerprintManager
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED
import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
@@ -129,7 +130,14 @@ data class BiometricMessage(
val type: BiometricMessageType,
val id: Int,
val message: String?,
-)
+) {
+ fun isFingerprintLockoutMessage(): Boolean {
+ return source == FINGERPRINT &&
+ type == BiometricMessageType.ERROR &&
+ (id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT ||
+ id == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT)
+ }
+}
enum class BiometricMessageType {
HELP,
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 1553525915d5..cc159168009e 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
@@ -22,6 +22,7 @@ import android.graphics.Point
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
+import com.android.systemui.common.shared.model.Position
import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
@@ -32,14 +33,17 @@ import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeStateModel.Companion.isDozeOff
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
+import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.WakefulnessModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.delay
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
@@ -63,6 +67,18 @@ constructor(
bouncerRepository: KeyguardBouncerRepository,
configurationRepository: ConfigurationRepository,
) {
+
+ data class PreviewMode(
+ val isInPreviewMode: Boolean = false,
+ val shouldHighlightSelectedAffordance: 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.
+ */
+ val previewMode = MutableStateFlow(PreviewMode())
/**
* The amount of doze the system is in, where `1.0` is fully dozing and `0.0` is not dozing at
* all.
@@ -142,8 +158,6 @@ constructor(
val alternateBouncerShowing: Flow<Boolean> = bouncerRepository.alternateBouncerVisible
/** Observable for the [StatusBarState] */
val statusBarState: Flow<StatusBarState> = repository.statusBarState
- /** Whether or not quick settings or quick quick settings are showing. */
- val isQuickSettingsVisible: Flow<Boolean> = repository.isQuickSettingsVisible
/**
* Observable for [BiometricUnlockModel] when biometrics like face or any fingerprint (rear,
* side, under display) is used to unlock the device.
@@ -182,6 +196,18 @@ constructor(
/** Notifies when a new configuration is set */
val configurationChange: Flow<Unit> = configurationRepository.onAnyConfigurationChange
+ /** Represents the current state of the KeyguardRootView visibility */
+ val keyguardRootViewVisibilityState: Flow<KeyguardRootViewVisibilityState> =
+ repository.keyguardRootViewVisibility
+
+ /** The position of the keyguard clock. */
+ val clockPosition: Flow<Position> = repository.clockPosition
+
+ val keyguardAlpha: Flow<Float> = repository.keyguardAlpha
+
+ /** Whether to animate the next doze mode transition. */
+ val animateDozingTransitions: Flow<Boolean> = repository.animateBottomAreaDozingTransitions
+
fun dozeTransitionTo(vararg states: DozeStateModel): Flow<DozeTransitionModel> {
return dozeTransitionModel.filter { states.contains(it.to) }
}
@@ -211,6 +237,22 @@ constructor(
repository.setQuickSettingsVisible(isVisible)
}
+ fun setKeyguardRootVisibility(statusBarState: Int, goingToFullShade: Boolean, isOcclusionTransitionRunning: Boolean) {
+ repository.setKeyguardVisibility(statusBarState, goingToFullShade, isOcclusionTransitionRunning)
+ }
+
+ fun setClockPosition(x: Int, y: Int) {
+ repository.setClockPosition(x, y)
+ }
+
+ fun setAlpha(alpha: Float) {
+ repository.setKeyguardAlpha(alpha)
+ }
+
+ fun setAnimateDozingTransitions(animate: Boolean) {
+ repository.setAnimateDozingTransitions(animate)
+ }
+
companion object {
private const val TAG = "KeyguardInteractor"
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
index 40e0604ae1b3..a48684381345 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
@@ -101,10 +101,9 @@ constructor(
quickAffordanceAlwaysVisible(position),
keyguardInteractor.isDozing,
keyguardInteractor.isKeyguardShowing,
- keyguardInteractor.isQuickSettingsVisible,
biometricSettingsRepository.isCurrentUserInLockdown,
- ) { affordance, isDozing, isKeyguardShowing, isQuickSettingsVisible, isUserInLockdown ->
- if (!isDozing && isKeyguardShowing && !isQuickSettingsVisible && !isUserInLockdown) {
+ ) { affordance, isDozing, isKeyguardShowing, isUserInLockdown ->
+ if (!isDozing && isKeyguardShowing && !isUserInLockdown) {
affordance
} else {
KeyguardQuickAffordanceModel.Hidden
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt
index a2287c756e5b..ff8d5c908735 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractor.kt
@@ -18,7 +18,6 @@ package com.android.systemui.keyguard.domain.interactor
import android.content.Context
import android.content.Intent
-import android.hardware.fingerprint.FingerprintManager
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dagger.SysUISingleton
@@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
@@ -74,15 +74,13 @@ constructor(
private val fingerprintLockoutEvents: Flow<Unit> =
fingerprintAuthRepository.authenticationStatus
.ifKeyguardOccludedByApp()
- .filter {
- it is ErrorFingerprintAuthenticationStatus &&
- (it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT ||
- it.msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT)
- }
+ .filter { it is ErrorFingerprintAuthenticationStatus && it.isLockoutMessage() }
.map {} // maps FingerprintAuthenticationStatus => Unit
val message: Flow<BiometricMessage?> =
merge(
- biometricMessageInteractor.fingerprintErrorMessage,
+ biometricMessageInteractor.fingerprintErrorMessage.filterNot {
+ it.isFingerprintLockoutMessage()
+ },
biometricMessageInteractor.fingerprintFailMessage,
biometricMessageInteractor.fingerprintHelpMessage,
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt
index 7fc6016bf087..ae18681a5b92 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/FingerprintAuthenticationModels.kt
@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.shared.model
+import android.hardware.fingerprint.FingerprintManager
import android.os.SystemClock.elapsedRealtime
/**
@@ -49,4 +50,9 @@ data class ErrorFingerprintAuthenticationStatus(
val msg: String? = null,
// present to break equality check if the same error occurs repeatedly.
val createdAt: Long = elapsedRealtime(),
-) : FingerprintAuthenticationStatus()
+) : FingerprintAuthenticationStatus() {
+ fun isLockoutMessage(): Boolean {
+ return msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT ||
+ msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT
+ }
+}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt
index 99ee0d4d7c68..9a57aefba329 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/PointProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt
@@ -12,21 +12,20 @@
* 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.monet.quantize;
-
-/** An interface to allow use of different color spaces by quantizers. */
-public interface PointProvider {
- /** The three components in the color space of an sRGB color. */
- double[] fromInt(int argb);
-
- /** The ARGB (i.e. hex code) representation of this color. */
- int toInt(double[] point);
+package com.android.systemui.keyguard.shared.model
- /**
- * Squared distance between two colors.
- * Distance is defined by scientific color spaces and referred to as delta E.
- */
- double distance(double[] a, double[] b);
-}
+/**
+ * Provides a stateful representation of the visibility of the KeyguardRootView
+ *
+ * @param statusBarState State of the status bar represented by [StatusBarState]
+ * @param goingToFullShade Whether status bar is going to full shade
+ * @param occlusionTransitionRunning Whether the occlusion transition is running in this instant
+ */
+data class KeyguardRootViewVisibilityState(
+ val statusBarState: Int,
+ val goingToFullShade: Boolean,
+ val occlusionTransitionRunning: Boolean,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardAmbientIndicationAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardAmbientIndicationAreaViewBinder.kt
new file mode 100644
index 000000000000..d6883dddba26
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardAmbientIndicationAreaViewBinder.kt
@@ -0,0 +1,127 @@
+/*
+ * 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 android.view.ViewGroup
+import android.view.ViewPropertyAnimator
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.R
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardAmbientIndicationViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
+import com.android.systemui.lifecycle.repeatWhenAttached
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+
+object KeyguardAmbientIndicationAreaViewBinder {
+ /**
+ * Defines interface for an object that acts as the binding between the view and its view-model.
+ *
+ * Users of the [KeyguardBottomAreaViewBinder] class should use this to control the binder after
+ * it is bound.
+ */
+ interface Binding {
+ /**
+ * Returns a collection of [ViewPropertyAnimator] instances that can be used to animate the
+ * indication areas.
+ */
+ fun getIndicationAreaAnimators(): List<ViewPropertyAnimator>
+
+ /** Notifies that device configuration has changed. */
+ fun onConfigurationChanged()
+
+ /** Destroys this binding, releases resources, and cancels any coroutines. */
+ fun destroy()
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ fun bind(
+ view: ViewGroup,
+ viewModel: KeyguardAmbientIndicationViewModel,
+ keyguardRootViewModel: KeyguardRootViewModel,
+ ): Binding {
+ val ambientIndicationArea: View? = view.findViewById(R.id.ambient_indication_container)
+ val configurationBasedDimensions = MutableStateFlow(loadFromResources(view))
+
+ val disposableHandle =
+ view.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ launch {
+ keyguardRootViewModel.alpha.collect { alpha ->
+ view.importantForAccessibility =
+ if (alpha == 0f) {
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ } else {
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ }
+
+ ambientIndicationArea?.alpha = alpha
+ }
+ }
+
+ launch {
+ viewModel.indicationAreaTranslationX.collect { translationX ->
+ ambientIndicationArea?.translationX = translationX
+ }
+ }
+
+ launch {
+ configurationBasedDimensions
+ .map { it.defaultBurnInPreventionYOffsetPx }
+ .flatMapLatest { defaultBurnInOffsetY ->
+ viewModel.indicationAreaTranslationY(defaultBurnInOffsetY)
+ }
+ .collect { translationY ->
+ ambientIndicationArea?.translationY = translationY
+ }
+ }
+
+ }
+ }
+
+
+ return object : Binding {
+ override fun getIndicationAreaAnimators(): List<ViewPropertyAnimator> {
+ return listOf(ambientIndicationArea).mapNotNull { it?.animate() }
+ }
+
+ override fun onConfigurationChanged() {
+ configurationBasedDimensions.value = loadFromResources(view)
+ }
+
+ override fun destroy() {
+ disposableHandle.dispose()
+ }
+ }
+ }
+
+ private fun loadFromResources(view: View): ConfigurationBasedDimensions {
+ return ConfigurationBasedDimensions(
+ defaultBurnInPreventionYOffsetPx =
+ view.resources.getDimensionPixelOffset(R.dimen.default_burn_in_prevention_offset),
+ )
+ }
+
+ private data class ConfigurationBasedDimensions(
+ val defaultBurnInPreventionYOffsetPx: Int,
+ )
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
index db84268f7c58..a0a2abe83315 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
@@ -63,6 +63,7 @@ import kotlinx.coroutines.launch
* view-model to be reused for multiple view/view-binder bindings.
*/
@OptIn(ExperimentalCoroutinesApi::class)
+@Deprecated("Deprecated as part of b/278057014")
object KeyguardBottomAreaViewBinder {
private const val EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS = 250L
@@ -75,6 +76,8 @@ object KeyguardBottomAreaViewBinder {
* Users of the [KeyguardBottomAreaViewBinder] class should use this to control the binder after
* it is bound.
*/
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
+ @Deprecated("Deprecated as part of b/278057014")
interface Binding {
/**
* Returns a collection of [ViewPropertyAnimator] instances that can be used to animate the
@@ -96,6 +99,7 @@ object KeyguardBottomAreaViewBinder {
}
/** Binds the view to the view-model, continuing to update the former based on the latter. */
+ @Deprecated("Deprecated as part of b/278057014")
@SuppressLint("ClickableViewAccessibility")
@JvmStatic
fun bind(
@@ -132,6 +136,8 @@ object KeyguardBottomAreaViewBinder {
val disposableHandle =
view.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.STARTED) {
+
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
launch {
viewModel.startButton.collect { buttonModel ->
updateButton(
@@ -144,6 +150,7 @@ object KeyguardBottomAreaViewBinder {
}
}
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
launch {
viewModel.endButton.collect { buttonModel ->
updateButton(
@@ -180,6 +187,7 @@ object KeyguardBottomAreaViewBinder {
}
}
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
launch {
updateButtonAlpha(
view = startButton,
@@ -188,6 +196,7 @@ object KeyguardBottomAreaViewBinder {
)
}
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
launch {
updateButtonAlpha(
view = endButton,
@@ -213,6 +222,7 @@ object KeyguardBottomAreaViewBinder {
}
}
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
launch {
configurationBasedDimensions.collect { dimensions ->
startButton.updateLayoutParams<ViewGroup.LayoutParams> {
@@ -287,6 +297,8 @@ object KeyguardBottomAreaViewBinder {
}
}
+ @Deprecated("Deprecated as part of b/278057014")
+ // If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
@SuppressLint("ClickableViewAccessibility")
private fun updateButton(
view: ImageView,
@@ -394,6 +406,8 @@ object KeyguardBottomAreaViewBinder {
view.isSelected = viewModel.isSelected
}
+ @Deprecated("Deprecated as part of b/278057014")
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
private suspend fun updateButtonAlpha(
view: View,
viewModel: Flow<KeyguardQuickAffordanceViewModel>,
@@ -405,6 +419,7 @@ object KeyguardBottomAreaViewBinder {
.collect { view.alpha = it }
}
+ @Deprecated("Deprecated as part of b/278057014")
private fun View.animateVisibility(visible: Boolean) {
animate()
.withStartAction {
@@ -422,6 +437,8 @@ object KeyguardBottomAreaViewBinder {
.start()
}
+ @Deprecated("Deprecated as part of b/278057014")
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
private class OnLongClickListener(
private val falsingManager: FalsingManager?,
private val viewModel: KeyguardQuickAffordanceViewModel,
@@ -455,9 +472,10 @@ object KeyguardBottomAreaViewBinder {
}
override fun onLongClickUseDefaultHapticFeedback(view: View?) = false
-
}
+ @Deprecated("Deprecated as part of b/278057014")
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
private class OnClickListener(
private val viewModel: KeyguardQuickAffordanceViewModel,
private val falsingManager: FalsingManager,
@@ -479,6 +497,7 @@ object KeyguardBottomAreaViewBinder {
}
}
+ @Deprecated("Deprecated as part of b/278057014")
private fun loadFromResources(view: View): ConfigurationBasedDimensions {
return ConfigurationBasedDimensions(
defaultBurnInPreventionYOffsetPx =
@@ -491,6 +510,7 @@ object KeyguardBottomAreaViewBinder {
)
}
+ @Deprecated("Deprecated as part of b/278057014")
/** Opens the wallpaper picker screen after the device is unlocked by the user. */
private fun navigateToLockScreenSettings(
activityStarter: ActivityStarter,
@@ -510,6 +530,8 @@ object KeyguardBottomAreaViewBinder {
)
}
+ @Deprecated("Deprecated as part of b/278057014")
+ //If updated, be sure to update [KeyguardQuickAffordanceViewBinder.kt]
private data class ConfigurationBasedDimensions(
val defaultBurnInPreventionYOffsetPx: Int,
val buttonSizePx: Size,
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 02e6765fa1d3..a385a0e5754b 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,7 +23,10 @@ import android.widget.TextView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.R
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
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.statusbar.KeyguardIndicationController
import kotlinx.coroutines.DisposableHandle
@@ -49,7 +52,9 @@ object KeyguardIndicationAreaBinder {
fun bind(
view: ViewGroup,
viewModel: KeyguardIndicationAreaViewModel,
+ keyguardRootViewModel: KeyguardRootViewModel,
indicationController: KeyguardIndicationController,
+ featureFlags: FeatureFlags,
): DisposableHandle {
val indicationArea: ViewGroup = view.requireViewById(R.id.keyguard_indication_area)
indicationController.setIndicationArea(indicationArea)
@@ -66,15 +71,28 @@ object KeyguardIndicationAreaBinder {
view.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
- viewModel.alpha.collect { alpha ->
- view.importantForAccessibility =
- if (alpha == 0f) {
- View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
- } else {
- View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
- }
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ keyguardRootViewModel.alpha.collect { alpha ->
+ view.importantForAccessibility =
+ if (alpha == 0f) {
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ } else {
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ }
- indicationArea.alpha = alpha
+ indicationArea.alpha = alpha
+ }
+ } else {
+ viewModel.alpha.collect { alpha ->
+ view.importantForAccessibility =
+ if (alpha == 0f) {
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ } else {
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ }
+
+ indicationArea.alpha = alpha
+ }
}
}
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
new file mode 100644
index 000000000000..63a67913d6cd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
@@ -0,0 +1,315 @@
+/*
+ * 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.annotation.SuppressLint
+import android.graphics.drawable.Animatable2
+import android.util.Size
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.core.view.isInvisible
+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.R
+import com.android.systemui.animation.Expandable
+import com.android.systemui.animation.view.LaunchableImageView
+import com.android.systemui.common.shared.model.Icon
+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.statusbar.VibratorHelper
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+
+/**
+ * This is only for a SINGLE Quick affordance
+ */
+object KeyguardQuickAffordanceViewBinder {
+
+ private const val EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS = 250L
+ private const val SCALE_SELECTED_BUTTON = 1.23f
+ private const val DIM_ALPHA = 0.3f
+
+ /**
+ * Defines interface for an object that acts as the binding between the view and its view-model.
+ *
+ * Users of the [KeyguardBottomAreaViewBinder] class should use this to control the binder after
+ * it is bound.
+ */
+ interface Binding {
+ /** Notifies that device configuration has changed. */
+ fun onConfigurationChanged()
+
+ /** Destroys this binding, releases resources, and cancels any coroutines. */
+ fun destroy()
+ }
+
+ fun bind(
+ view: LaunchableImageView,
+ viewModel: Flow<KeyguardQuickAffordanceViewModel>,
+ alpha: Flow<Float>,
+ falsingManager: FalsingManager?,
+ vibratorHelper: VibratorHelper?,
+ messageDisplayer: (Int) -> Unit,
+ ): Binding {
+ val button = view as ImageView
+ val configurationBasedDimensions = MutableStateFlow(loadFromResources(view))
+ val disposableHandle =
+ view.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ launch {
+ viewModel.collect { buttonModel ->
+ updateButton(
+ view = button,
+ viewModel = buttonModel,
+ falsingManager = falsingManager,
+ messageDisplayer = messageDisplayer,
+ vibratorHelper = vibratorHelper,
+ )
+ }
+ }
+
+ launch {
+ updateButtonAlpha(
+ view = button,
+ viewModel = viewModel,
+ alphaFlow = alpha,
+ )
+ }
+
+ launch {
+ configurationBasedDimensions.collect { dimensions ->
+ button.updateLayoutParams<ViewGroup.LayoutParams> {
+ width = dimensions.buttonSizePx.width
+ height = dimensions.buttonSizePx.height
+ }
+ }
+ }
+ }
+ }
+
+ return object : Binding {
+ override fun onConfigurationChanged() {
+ configurationBasedDimensions.value = loadFromResources(view)
+ }
+
+ override fun destroy() {
+ disposableHandle.dispose()
+ }
+ }
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ private fun updateButton(
+ view: ImageView,
+ viewModel: KeyguardQuickAffordanceViewModel,
+ falsingManager: FalsingManager?,
+ messageDisplayer: (Int) -> Unit,
+ vibratorHelper: VibratorHelper?,
+ ) {
+ if (!viewModel.isVisible) {
+ view.isInvisible = true
+ return
+ }
+
+ if (!view.isVisible) {
+ view.isVisible = true
+ if (viewModel.animateReveal) {
+ view.alpha = 0f
+ view.translationY = view.height / 2f
+ view
+ .animate()
+ .alpha(1f)
+ .translationY(0f)
+ .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN)
+ .setDuration(EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS)
+ .start()
+ }
+ }
+
+ IconViewBinder.bind(viewModel.icon, view)
+
+ (view.drawable as? Animatable2)?.let { animatable ->
+ (viewModel.icon as? Icon.Resource)?.res?.let { iconResourceId ->
+ // Always start the animation (we do call stop() below, if we need to skip it).
+ animatable.start()
+
+ if (view.tag != iconResourceId) {
+ // Here when we haven't run the animation on a previous update.
+ //
+ // Save the resource ID for next time, so we know not to re-animate the same
+ // animation again.
+ view.tag = iconResourceId
+ } else {
+ // Here when we've already done this animation on a previous update and want to
+ // skip directly to the final frame of the animation to avoid running it.
+ //
+ // By calling stop after start, we go to the final frame of the animation.
+ animatable.stop()
+ }
+ }
+ }
+
+ view.isActivated = viewModel.isActivated
+ view.drawable.setTint(
+ Utils.getColorAttrDefaultColor(
+ view.context,
+ if (viewModel.isActivated) {
+ com.android.internal.R.attr.materialColorOnPrimaryFixed
+ } else {
+ com.android.internal.R.attr.materialColorOnSurface
+ },
+ )
+ )
+
+ view.backgroundTintList =
+ if (!viewModel.isSelected) {
+ Utils.getColorAttr(
+ view.context,
+ if (viewModel.isActivated) {
+ com.android.internal.R.attr.materialColorPrimaryFixed
+ } else {
+ com.android.internal.R.attr.materialColorSurfaceContainerHigh
+ }
+ )
+ } else {
+ null
+ }
+ view
+ .animate()
+ .scaleX(if (viewModel.isSelected) SCALE_SELECTED_BUTTON else 1f)
+ .scaleY(if (viewModel.isSelected) SCALE_SELECTED_BUTTON else 1f)
+ .start()
+
+ view.isClickable = viewModel.isClickable
+ if (viewModel.isClickable) {
+ if (viewModel.useLongPress) {
+ val onTouchListener = KeyguardQuickAffordanceOnTouchListener(
+ view,
+ viewModel,
+ messageDisplayer,
+ vibratorHelper,
+ falsingManager,
+ )
+ view.setOnTouchListener(onTouchListener)
+ view.onLongClickListener =
+ OnLongClickListener(falsingManager, viewModel, vibratorHelper, onTouchListener)
+ } else {
+ view.setOnClickListener(OnClickListener(viewModel, checkNotNull(falsingManager)))
+ }
+ } else {
+ view.onLongClickListener = null
+ view.setOnClickListener(null)
+ view.setOnTouchListener(null)
+ }
+
+ view.isSelected = viewModel.isSelected
+ }
+
+ private suspend fun updateButtonAlpha(
+ view: View,
+ viewModel: Flow<KeyguardQuickAffordanceViewModel>,
+ alphaFlow: Flow<Float>,
+ ) {
+ combine(viewModel.map { it.isDimmed }, alphaFlow) { isDimmed, 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),
+ ),
+ )
+ }
+
+ private class OnClickListener(
+ private val viewModel: KeyguardQuickAffordanceViewModel,
+ private val falsingManager: FalsingManager,
+ ) : View.OnClickListener {
+ override fun onClick(view: View) {
+ if (falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
+ return
+ }
+
+ if (viewModel.configKey != null) {
+ viewModel.onClicked(
+ KeyguardQuickAffordanceViewModel.OnClickedParameters(
+ configKey = viewModel.configKey,
+ expandable = Expandable.fromView(view),
+ slotId = viewModel.slotId,
+ )
+ )
+ }
+ }
+ }
+
+ private class OnLongClickListener(
+ private val falsingManager: FalsingManager?,
+ private val viewModel: KeyguardQuickAffordanceViewModel,
+ private val vibratorHelper: VibratorHelper?,
+ private val onTouchListener: KeyguardQuickAffordanceOnTouchListener
+ ) : View.OnLongClickListener {
+ override fun onLongClick(view: View): Boolean {
+ if (falsingManager?.isFalseLongTap(FalsingManager.MODERATE_PENALTY) == true) {
+ return true
+ }
+
+ if (viewModel.configKey != null) {
+ viewModel.onClicked(
+ KeyguardQuickAffordanceViewModel.OnClickedParameters(
+ configKey = viewModel.configKey,
+ expandable = Expandable.fromView(view),
+ slotId = viewModel.slotId,
+ )
+ )
+ vibratorHelper?.vibrate(
+ if (viewModel.isActivated) {
+ KeyguardBottomAreaVibrations.Activated
+ } else {
+ KeyguardBottomAreaVibrations.Deactivated
+ }
+ )
+ }
+
+ onTouchListener.cancel()
+ return true
+ }
+
+ 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 1db596b346b3..19f622bab7ed 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
@@ -17,20 +17,26 @@
package com.android.systemui.keyguard.ui.binder
import android.annotation.DrawableRes
+import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
+import com.android.app.animation.Interpolators
import com.android.systemui.R
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.shared.model.TintedIcon
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.temporarydisplay.ViewPriority
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
import com.android.systemui.temporarydisplay.chipbar.ChipbarInfo
+import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
@@ -40,31 +46,74 @@ object KeyguardRootViewBinder {
@JvmStatic
fun bind(
view: ViewGroup,
+ viewModel: KeyguardRootViewModel,
featureFlags: FeatureFlags,
occludingAppDeviceEntryMessageViewModel: OccludingAppDeviceEntryMessageViewModel,
chipbarCoordinator: ChipbarCoordinator,
- ) {
- if (featureFlags.isEnabled(Flags.FP_LISTEN_OCCLUDING_APPS)) {
+ keyguardStateController: KeyguardStateController,
+ ): DisposableHandle {
+ val disposableHandle =
view.repeatWhenAttached {
- repeatOnLifecycle(Lifecycle.State.CREATED) {
- launch {
- occludingAppDeviceEntryMessageViewModel.message.collect { biometricMessage
- ->
- if (biometricMessage?.message != null) {
- chipbarCoordinator.displayView(
- createChipbarInfo(
- biometricMessage.message,
- R.drawable.ic_lock,
+ if (featureFlags.isEnabled(Flags.FP_LISTEN_OCCLUDING_APPS)) {
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ launch {
+ occludingAppDeviceEntryMessageViewModel.message.collect {
+ biometricMessage ->
+ if (biometricMessage?.message != null) {
+ chipbarCoordinator.displayView(
+ createChipbarInfo(
+ biometricMessage.message,
+ R.drawable.ic_lock,
+ )
)
- )
- } else {
- chipbarCoordinator.removeView(ID, "occludingAppMsgNull")
+ } else {
+ chipbarCoordinator.removeView(ID, "occludingAppMsgNull")
+ }
+ }
+ }
+ }
+ }
+
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ launch {
+ viewModel.keyguardRootViewVisibilityState.collect { visibilityState ->
+ view.animate().cancel()
+ val goingToFullShade = visibilityState.goingToFullShade
+ val statusBarState = visibilityState.statusBarState
+ val isOcclusionTransitionRunning =
+ visibilityState.occlusionTransitionRunning
+ if (goingToFullShade) {
+ view.animate().alpha(0f).setStartDelay(
+ keyguardStateController.keyguardFadingAwayDelay
+ ).setDuration(
+ keyguardStateController.shortenedFadingAwayDuration
+ ).setInterpolator(
+ Interpolators.ALPHA_OUT
+ ).withEndAction { view.visibility = View.GONE }.start()
+ } else if (
+ statusBarState == StatusBarState.KEYGUARD ||
+ statusBarState == StatusBarState.SHADE_LOCKED
+ ) {
+ view.visibility = View.VISIBLE
+ if (!isOcclusionTransitionRunning) {
+ view.alpha = 1f
+ }
+ } else {
+ view.visibility = View.GONE
+ }
+ }
+ }
+
+ launch {
+ viewModel.alpha.collect { alpha ->
+ view.alpha = alpha
}
}
}
}
}
- }
+ return disposableHandle
}
/**
@@ -73,10 +122,10 @@ object KeyguardRootViewBinder {
private fun createChipbarInfo(message: String, @DrawableRes icon: Int): ChipbarInfo {
return ChipbarInfo(
startIcon =
- TintedIcon(
- Icon.Resource(icon, null),
- ChipbarInfo.DEFAULT_ICON_TINT,
- ),
+ TintedIcon(
+ Icon.Resource(icon, null),
+ ChipbarInfo.DEFAULT_ICON_TINT,
+ ),
text = Text.Loaded(message),
endItem = null,
vibrationEffect = null,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
new file mode 100644
index 000000000000..162c109ee299
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.content.Intent
+import android.view.View
+import androidx.core.view.isVisible
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.R
+import com.android.systemui.animation.ActivityLaunchAnimator
+import com.android.systemui.animation.view.LaunchableLinearLayout
+import com.android.systemui.common.ui.binder.IconViewBinder
+import com.android.systemui.common.ui.binder.TextViewBinder
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.statusbar.VibratorHelper
+import kotlinx.coroutines.DisposableHandle
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.launch
+
+object KeyguardSettingsViewBinder {
+ fun bind(
+ parentView: View,
+ viewModel: KeyguardSettingsMenuViewModel,
+ vibratorHelper: VibratorHelper,
+ activityStarter: ActivityStarter
+ ): DisposableHandle {
+ val view = parentView.findViewById<LaunchableLinearLayout>(R.id.keyguard_settings_button)
+
+ val disposableHandle =
+ view.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ launch {
+ viewModel.isVisible.distinctUntilChanged().collect { isVisible ->
+ view.animateVisibility(visible = isVisible)
+ if (isVisible) {
+ vibratorHelper.vibrate(KeyguardBottomAreaVibrations.Activated)
+ view.setOnTouchListener(
+ KeyguardSettingsButtonOnTouchListener(
+ view = view,
+ viewModel = viewModel,
+ )
+ )
+ IconViewBinder.bind(
+ icon = viewModel.icon,
+ view = view.requireViewById(R.id.icon),
+ )
+ TextViewBinder.bind(
+ view = view.requireViewById(R.id.text),
+ viewModel = viewModel.text,
+ )
+ }
+ }
+ }
+
+ // activityStarter will only be null when rendering the preview that
+ // shows up in the Wallpaper Picker app. If we do that, then the
+ // settings menu should never be visible.
+ if (activityStarter != null) {
+ launch {
+ viewModel.shouldOpenSettings
+ .filter { it }
+ .collect {
+ navigateToLockScreenSettings(
+ activityStarter = activityStarter,
+ view = view,
+ )
+ viewModel.onSettingsShown()
+ }
+ }
+ }
+ }
+ }
+ return disposableHandle
+ }
+
+ /** Opens the wallpaper picker screen after the device is unlocked by the user. */
+ private fun navigateToLockScreenSettings(
+ activityStarter: ActivityStarter,
+ view: View,
+ ) {
+ activityStarter.postStartActivityDismissingKeyguard(
+ Intent(Intent.ACTION_SET_WALLPAPER).apply {
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ view.context
+ .getString(R.string.config_wallpaperPickerPackage)
+ .takeIf { it.isNotEmpty() }
+ ?.let { packageName -> setPackage(packageName) }
+ },
+ /* delay= */ 0,
+ /* animationController= */ ActivityLaunchAnimator.Controller.fromView(view),
+ /* customMessage= */ view.context.getString(R.string.keyguard_unlock_to_customize_ls)
+ )
+ }
+
+ private fun View.animateVisibility(visible: Boolean) {
+ animate()
+ .withStartAction {
+ if (visible) {
+ alpha = 0f
+ isVisible = true
+ }
+ }
+ .alpha(if (visible) 1f else 0f)
+ .withEndAction {
+ if (!visible) {
+ isVisible = false
+ }
+ }
+ .start()
+ }
+
+} \ No newline at end of file
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 b92d10474ccd..a45fb4ffef4f 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
@@ -42,17 +42,27 @@ import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.Application
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.KeyguardPreviewClockViewBinder
import com.android.systemui.keyguard.ui.binder.KeyguardPreviewSmartspaceViewBinder
+import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder
+import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import com.android.systemui.keyguard.ui.view.layout.KeyguardLayoutManager
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardPreviewClockViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardPreviewSmartspaceViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardQuickAffordancesCombinedViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.monet.ColorScheme
import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.FalsingManager
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.systemui.shared.clocks.DefaultClockController
import com.android.systemui.shared.clocks.shared.model.ClockPreviewConstants
import com.android.systemui.shared.quickaffordance.shared.model.KeyguardPreviewConstants
+import com.android.systemui.statusbar.KeyguardIndicationController
+import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView
import dagger.assisted.Assisted
@@ -71,6 +81,7 @@ constructor(
private val clockViewModel: KeyguardPreviewClockViewModel,
private val smartspaceViewModel: KeyguardPreviewSmartspaceViewModel,
private val bottomAreaViewModel: KeyguardBottomAreaViewModel,
+ private val quickAffordancesCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel,
displayManager: DisplayManager,
private val windowManager: WindowManager,
private val clockController: ClockEventController,
@@ -78,6 +89,12 @@ constructor(
private val broadcastDispatcher: BroadcastDispatcher,
private val lockscreenSmartspaceController: LockscreenSmartspaceController,
private val udfpsOverlayInteractor: UdfpsOverlayInteractor,
+ private val featureFlags: FeatureFlags,
+ private val keyguardLayoutManager: KeyguardLayoutManager,
+ private val falsingManager: FalsingManager,
+ private val vibratorHelper: VibratorHelper,
+ private val indicationController: KeyguardIndicationController,
+ private val keyguardRootViewModel: KeyguardRootViewModel,
@Assisted bundle: Bundle,
) {
@@ -106,14 +123,26 @@ constructor(
private val disposables = mutableSetOf<DisposableHandle>()
private var isDestroyed = false
+ private val shortcutsBindings = mutableSetOf<KeyguardQuickAffordanceViewBinder.Binding>()
+
init {
- bottomAreaViewModel.enablePreviewMode(
- initiallySelectedSlotId =
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ keyguardRootViewModel.enablePreviewMode(
+ initiallySelectedSlotId =
bundle.getString(
KeyguardPreviewConstants.KEY_INITIALLY_SELECTED_SLOT_ID,
),
- shouldHighlightSelectedAffordance = shouldHighlightSelectedAffordance,
- )
+ shouldHighlightSelectedAffordance = shouldHighlightSelectedAffordance,
+ )
+ } else {
+ bottomAreaViewModel.enablePreviewMode(
+ initiallySelectedSlotId =
+ bundle.getString(
+ KeyguardPreviewConstants.KEY_INITIALLY_SELECTED_SLOT_ID,
+ ),
+ shouldHighlightSelectedAffordance = shouldHighlightSelectedAffordance,
+ )
+ }
runBlocking(mainDispatcher) {
host =
SurfaceControlViewHost(
@@ -130,7 +159,20 @@ constructor(
mainHandler.post {
val rootView = FrameLayout(context)
- setUpBottomArea(rootView)
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ val keyguardRootView = KeyguardRootView(context, null)
+ rootView.addView(
+ keyguardRootView,
+ FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ ),
+ )
+ setupShortcuts(keyguardRootView)
+ keyguardLayoutManager.layoutViews(keyguardRootView)
+ } else {
+ setUpBottomArea(rootView)
+ }
setUpSmartspace(rootView)
smartSpaceView?.let {
@@ -182,13 +224,20 @@ constructor(
}
fun onSlotSelected(slotId: String) {
- bottomAreaViewModel.onPreviewSlotSelected(slotId = slotId)
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ quickAffordancesCombinedViewModel.onPreviewSlotSelected(slotId = slotId)
+ } else {
+ bottomAreaViewModel.onPreviewSlotSelected(slotId = slotId)
+ }
}
fun destroy() {
isDestroyed = true
lockscreenSmartspaceController.disconnect()
disposables.forEach { it.dispose() }
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ shortcutsBindings.forEach { it.destroy() }
+ }
}
/**
@@ -227,8 +276,9 @@ constructor(
val startPadding: Int =
with(context.resources) {
- getDimensionPixelSize(R.dimen.clock_padding_start) +
- getDimensionPixelSize(R.dimen.below_clock_padding_start)
+ getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.clock_padding_start
+ ) + getDimensionPixelSize(R.dimen.below_clock_padding_start)
}
val endPadding: Int =
@@ -250,6 +300,7 @@ constructor(
smartSpaceView?.alpha = if (shouldHighlightSelectedAffordance) DIM_ALPHA else 1.0f
}
+ @Deprecated("Deprecated as part of b/278057014")
private fun setUpBottomArea(parentView: ViewGroup) {
val bottomAreaView =
LayoutInflater.from(context)
@@ -259,7 +310,7 @@ constructor(
false,
) as KeyguardBottomAreaView
bottomAreaView.init(
- viewModel = bottomAreaViewModel,
+ viewModel = bottomAreaViewModel,
)
parentView.addView(
bottomAreaView,
@@ -270,6 +321,32 @@ constructor(
)
}
+ private fun setupShortcuts(keyguardRootView: KeyguardRootView) {
+ shortcutsBindings.add(
+ KeyguardQuickAffordanceViewBinder.bind(
+ keyguardRootView.requireViewById(R.id.start_button),
+ quickAffordancesCombinedViewModel.startButton,
+ keyguardRootViewModel.alpha,
+ falsingManager,
+ vibratorHelper,
+ ) {
+ indicationController.showTransientIndication(it)
+ }
+ )
+
+ shortcutsBindings.add(
+ KeyguardQuickAffordanceViewBinder.bind(
+ keyguardRootView.requireViewById(R.id.end_button),
+ quickAffordancesCombinedViewModel.endButton,
+ keyguardRootViewModel.alpha,
+ falsingManager,
+ vibratorHelper,
+ ) {
+ indicationController.showTransientIndication(it)
+ }
+ )
+ }
+
private fun setUpUdfps(parentView: ViewGroup) {
val sensorBounds = udfpsOverlayInteractor.udfpsOverlayParams.value.sensorBounds
@@ -375,15 +452,21 @@ constructor(
val layoutParams =
FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
- resources.getDimensionPixelSize(R.dimen.small_clock_height)
+ resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
)
layoutParams.topMargin =
KeyguardPreviewSmartspaceViewModel.getStatusBarHeight(resources) +
- resources.getDimensionPixelSize(R.dimen.small_clock_padding_top)
+ resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_padding_top
+ )
hostView.layoutParams = layoutParams
hostView.setPaddingRelative(
- resources.getDimensionPixelSize(R.dimen.clock_padding_start),
+ resources.getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.clock_padding_start
+ ),
0,
0,
0
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt
index 0077f2d68c7e..65fe99045387 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/KeyguardRootView.kt
@@ -20,8 +20,13 @@ package com.android.systemui.keyguard.ui.view
import android.content.Context
import android.util.AttributeSet
import androidx.constraintlayout.widget.ConstraintLayout
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import androidx.core.content.res.ResourcesCompat
import com.android.keyguard.LockIconView
import com.android.systemui.R
+import com.android.systemui.animation.view.LaunchableImageView
/** Provides a container for all keyguard ui content. */
class KeyguardRootView(
@@ -36,6 +41,10 @@ class KeyguardRootView(
init {
addIndicationTextArea()
addLockIconView()
+ addAmbientIndicationArea()
+ addLeftShortcut()
+ addRightShortcut()
+ addSettingsPopupMenu()
}
private fun addIndicationTextArea() {
@@ -47,4 +56,65 @@ class KeyguardRootView(
val view = LockIconView(context, attrs).apply { id = R.id.lock_icon_view }
addView(view)
}
+
+ private fun addAmbientIndicationArea() {
+ LayoutInflater.from(context).inflate(R.layout.ambient_indication, this)
+ }
+
+ private fun addLeftShortcut() {
+ val view = LaunchableImageView(context, attrs)
+ .apply {
+ id = R.id.start_button
+ scaleType = ImageView.ScaleType.FIT_CENTER
+ background =
+ ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.keyguard_bottom_affordance_bg,
+ context.theme
+ )
+ foreground =
+ ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.keyguard_bottom_affordance_selected_border,
+ context.theme
+ )
+ visibility = View.INVISIBLE
+ }
+ addView(view)
+ }
+
+ private fun addRightShortcut() {
+ val view = LaunchableImageView(context, attrs)
+ .apply {
+ id = R.id.end_button
+ scaleType = ImageView.ScaleType.FIT_CENTER
+ background =
+ ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.keyguard_bottom_affordance_bg,
+ context.theme
+ )
+ foreground =
+ ResourcesCompat.getDrawable(
+ context.resources,
+ R.drawable.keyguard_bottom_affordance_selected_border,
+ context.theme
+ )
+ visibility = View.INVISIBLE
+ }
+ addView(view)
+ }
+
+ private fun addSettingsPopupMenu() {
+ val view = LayoutInflater.from(context).inflate(
+ R.layout.keyguard_settings_popup_menu,
+ this,
+ false
+ )
+ .apply {
+ id = R.id.keyguard_settings_button
+ visibility = GONE
+ }
+ addView(view)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayout.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayout.kt
index baaeb60f364e..6be45c79e37e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayout.kt
@@ -24,17 +24,27 @@ import android.util.DisplayMetrics
import android.view.View
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.ViewGroup.MarginLayoutParams
import android.view.WindowManager
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.LEFT
+import androidx.constraintlayout.widget.ConstraintSet.MATCH_CONSTRAINT
import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.RIGHT
import androidx.constraintlayout.widget.ConstraintSet.START
import androidx.constraintlayout.widget.ConstraintSet.TOP
+import androidx.core.view.setPadding
+import androidx.core.view.updateLayoutParams
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
+import com.android.systemui.animation.view.LaunchableLinearLayout
import com.android.systemui.biometrics.AuthController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.ui.view.KeyguardRootView
@@ -136,15 +146,139 @@ constructor(
}
}
+ override fun layoutShortcuts(rootView: KeyguardRootView) {
+ val leftShortcut = rootView.findViewById<View>(R.id.start_button) ?: return
+ val rightShortcut = rootView.findViewById<View>(R.id.end_button) ?: return
+ val width =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_width)
+ val height =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height)
+ val horizontalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_horizontal_offset)
+ val verticalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_vertical_offset)
+ val padding =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_padding)
+
+ leftShortcut.apply {
+ updateLayoutParams<MarginLayoutParams> {
+ marginStart = horizontalOffsetMargin
+ bottomMargin = verticalOffsetMargin
+ }
+ setPadding(padding)
+ }
+
+ rightShortcut.apply {
+ updateLayoutParams<MarginLayoutParams> {
+ marginEnd = horizontalOffsetMargin
+ bottomMargin = verticalOffsetMargin
+ }
+ setPadding(padding)
+ }
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(leftShortcut.id, width)
+ constrainHeight(leftShortcut.id, height)
+ connect(leftShortcut.id, LEFT, PARENT_ID, LEFT)
+ connect(leftShortcut.id, BOTTOM, PARENT_ID, BOTTOM)
+
+ constrainWidth(rightShortcut.id, width)
+ constrainHeight(rightShortcut.id, height)
+ connect(rightShortcut.id, RIGHT, PARENT_ID, RIGHT)
+ connect(rightShortcut.id, BOTTOM, PARENT_ID, BOTTOM)
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutAmbientIndicationArea(rootView: KeyguardRootView) {
+ val ambientIndicationContainer =
+ rootView.findViewById<View>(R.id.ambient_indication_container) ?: return
+ val lockIconView = rootView.findViewById<View>(R.id.lock_icon_view) ?: return
+ val indicationArea = rootView.findViewById<View>(R.id.keyguard_indication_area) ?: return
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(ambientIndicationContainer.id, MATCH_PARENT)
+
+ if (keyguardUpdateMonitor.isUdfpsSupported) {
+ //constrain below udfps and above indication area
+ constrainHeight(ambientIndicationContainer.id, MATCH_CONSTRAINT)
+ connect(ambientIndicationContainer.id, TOP, lockIconView.id, BOTTOM)
+ connect(ambientIndicationContainer.id, BOTTOM, indicationArea.id, TOP)
+ connect(ambientIndicationContainer.id, LEFT, PARENT_ID, LEFT)
+ connect(ambientIndicationContainer.id, RIGHT, PARENT_ID, RIGHT)
+ } else {
+ //constrain above lock icon
+ constrainHeight(ambientIndicationContainer.id, WRAP_CONTENT)
+ connect(ambientIndicationContainer.id, BOTTOM, lockIconView.id, TOP)
+ connect(ambientIndicationContainer.id, LEFT, PARENT_ID, LEFT)
+ connect(ambientIndicationContainer.id, RIGHT, PARENT_ID, RIGHT)
+ }
+
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutSettingsPopupMenu(rootView: KeyguardRootView) {
+ val popupMenu =
+ rootView.findViewById<LaunchableLinearLayout>(R.id.keyguard_settings_button) ?: return
+ val icon = popupMenu.findViewById<ImageView>(R.id.icon) ?: return
+ val textView = popupMenu.findViewById<TextView>(R.id.text) ?: return
+ val horizontalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_horizontal_offset)
+
+ icon.updateLayoutParams<LinearLayout.LayoutParams> {
+ height =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_height)
+ width =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_width)
+ marginEnd =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_end_margin)
+ }
+
+ textView.updateLayoutParams<LinearLayout.LayoutParams> {
+ height = WRAP_CONTENT
+ width = WRAP_CONTENT
+ }
+
+ popupMenu.updateLayoutParams<MarginLayoutParams> {
+ bottomMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_vertical_offset)
+ marginStart = horizontalOffsetMargin
+ marginEnd = horizontalOffsetMargin
+ }
+ popupMenu.setPadding(
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_padding)
+ )
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(popupMenu.id, WRAP_CONTENT)
+ constrainHeight(popupMenu.id, WRAP_CONTENT)
+ constrainMinHeight(
+ popupMenu.id,
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height)
+ )
+ connect(popupMenu.id, LEFT, PARENT_ID, LEFT)
+ connect(popupMenu.id, RIGHT, PARENT_ID, RIGHT)
+ connect(popupMenu.id, BOTTOM, PARENT_ID, BOTTOM)
+
+ applyTo(rootView)
+ }
+ }
+
private fun Int.dp(): Int {
return context.resources.getDimensionPixelSize(this)
}
- private fun ConstraintLayout.getConstraintSet(): ConstraintSet {
- val cs = ConstraintSet()
- cs.clone(this)
- return cs
- }
+ private fun ConstraintLayout.getConstraintSet(): ConstraintSet =
+ ConstraintSet().also {
+ it.clone(this)
+ }
companion object {
const val DEFAULT = "default"
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardLayoutManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardLayoutManager.kt
index 9bc630265a3f..6973cd914aad 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardLayoutManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/KeyguardLayoutManager.kt
@@ -63,8 +63,8 @@ constructor(
return true
}
- fun layoutViews() {
- layout?.layoutViews(keyguardRootView)
+ fun layoutViews(rootView: KeyguardRootView = keyguardRootView) {
+ layout?.layoutViews(rootView)
}
companion object {
@@ -85,7 +85,13 @@ interface LockscreenLayout {
.applyTo(rootView)
layoutIndicationArea(rootView)
layoutLockIcon(rootView)
+ layoutShortcuts(rootView)
+ layoutAmbientIndicationArea(rootView)
+ layoutSettingsPopupMenu(rootView)
}
fun layoutIndicationArea(rootView: KeyguardRootView)
fun layoutLockIcon(rootView: KeyguardRootView)
+ fun layoutShortcuts(rootView: KeyguardRootView)
+ fun layoutAmbientIndicationArea(rootView: KeyguardRootView)
+ fun layoutSettingsPopupMenu(rootView: KeyguardRootView)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/LockscreenLayoutModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/LockscreenLayoutModule.kt
index 00f93e33f370..c0447af0590d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/LockscreenLayoutModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/LockscreenLayoutModule.kt
@@ -28,4 +28,10 @@ abstract class LockscreenLayoutModule {
abstract fun bindDefaultLayout(
defaultLockscreenLayout: DefaultLockscreenLayout
): LockscreenLayout
+
+ @Binds
+ @IntoSet
+ abstract fun bindShortcutsBesideUdfpsLockscreenLayout(
+ shortcutsBesideUdfpsLockscreenLayout: ShortcutsBesideUdfpsLockscreenLayout
+ ): LockscreenLayout
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/ShortcutsBesideUdfpsLockscreenLayout.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/ShortcutsBesideUdfpsLockscreenLayout.kt
new file mode 100644
index 000000000000..569762d67c5f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/ShortcutsBesideUdfpsLockscreenLayout.kt
@@ -0,0 +1,305 @@
+/*
+ * 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.view.layout
+
+import android.content.Context
+import android.graphics.Point
+import android.graphics.Rect
+import android.util.DisplayMetrics
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.WindowManager
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.annotation.VisibleForTesting
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
+import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.LEFT
+import androidx.constraintlayout.widget.ConstraintSet.MATCH_CONSTRAINT
+import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.RIGHT
+import androidx.constraintlayout.widget.ConstraintSet.START
+import androidx.constraintlayout.widget.ConstraintSet.TOP
+import androidx.core.view.setPadding
+import androidx.core.view.updateLayoutParams
+import com.android.keyguard.KeyguardUpdateMonitor
+import com.android.systemui.R
+import com.android.systemui.animation.view.LaunchableLinearLayout
+import com.android.systemui.biometrics.AuthController
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import javax.inject.Inject
+
+/**
+ * Positions elements of the lockscreen to the default position.
+ *
+ * This will be the most common use case for phones in portrait mode.
+ */
+@SysUISingleton
+class ShortcutsBesideUdfpsLockscreenLayout
+@Inject
+constructor(
+ private val authController: AuthController,
+ private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+ private val windowManager: WindowManager,
+ private val context: Context,
+) : LockscreenLayout {
+ override val id: String = SHORTCUTS_BESIDE_UDFPS
+
+ override fun layoutIndicationArea(rootView: KeyguardRootView) {
+ val indicationArea = rootView.findViewById<View>(R.id.keyguard_indication_area) ?: return
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(indicationArea.id, MATCH_PARENT)
+ constrainHeight(indicationArea.id, WRAP_CONTENT)
+ connect(
+ indicationArea.id,
+ BOTTOM,
+ PARENT_ID,
+ BOTTOM,
+ R.dimen.keyguard_indication_margin_bottom.dp()
+ )
+ connect(indicationArea.id, START, PARENT_ID, START)
+ connect(indicationArea.id, END, PARENT_ID, END)
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutLockIcon(rootView: KeyguardRootView) {
+ val isUdfpsSupported = keyguardUpdateMonitor.isUdfpsSupported
+ val scaleFactor: Float = authController.scaleFactor
+ val mBottomPaddingPx = R.dimen.lock_icon_margin_bottom.dp()
+ val mDefaultPaddingPx = R.dimen.lock_icon_padding.dp()
+ val scaledPadding: Int = (mDefaultPaddingPx * scaleFactor).toInt()
+ val bounds = windowManager.currentWindowMetrics.bounds
+ val widthPixels = bounds.right.toFloat()
+ val heightPixels = bounds.bottom.toFloat()
+ val defaultDensity =
+ DisplayMetrics.DENSITY_DEVICE_STABLE.toFloat() /
+ DisplayMetrics.DENSITY_DEFAULT.toFloat()
+ val lockIconRadiusPx = (defaultDensity * 36).toInt()
+
+ if (isUdfpsSupported) {
+ authController.udfpsLocation?.let { udfpsLocation ->
+ centerLockIcon(udfpsLocation, authController.udfpsRadius, scaledPadding, rootView)
+ }
+ } else {
+ centerLockIcon(
+ Point(
+ (widthPixels / 2).toInt(),
+ (heightPixels - ((mBottomPaddingPx + lockIconRadiusPx) * scaleFactor)).toInt()
+ ),
+ lockIconRadiusPx * scaleFactor,
+ scaledPadding,
+ rootView
+ )
+ }
+ }
+
+ @VisibleForTesting
+ internal fun centerLockIcon(
+ center: Point,
+ radius: Float,
+ drawablePadding: Int,
+ rootView: KeyguardRootView,
+ ) {
+ val lockIconView = rootView.findViewById<View>(R.id.lock_icon_view) ?: return
+ val lockIcon = lockIconView.findViewById<View>(R.id.lock_icon) ?: return
+ lockIcon.setPadding(drawablePadding, drawablePadding, drawablePadding, drawablePadding)
+
+ val sensorRect =
+ Rect().apply {
+ set(
+ center.x - radius.toInt(),
+ center.y - radius.toInt(),
+ center.x + radius.toInt(),
+ center.y + radius.toInt(),
+ )
+ }
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(lockIconView.id, sensorRect.right - sensorRect.left)
+ constrainHeight(lockIconView.id, sensorRect.bottom - sensorRect.top)
+ connect(lockIconView.id, TOP, PARENT_ID, TOP, sensorRect.top)
+ connect(lockIconView.id, START, PARENT_ID, START, sensorRect.left)
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutShortcuts(rootView: KeyguardRootView) {
+ val leftShortcut = rootView.findViewById<View>(R.id.start_button) ?: return
+ val rightShortcut = rootView.findViewById<View>(R.id.end_button) ?: return
+ val lockIconView = rootView.findViewById<View>(R.id.lock_icon_view) ?: return
+ val udfpsSupported = keyguardUpdateMonitor.isUdfpsSupported
+ val width =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_width)
+ val height =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height)
+ val horizontalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_horizontal_offset)
+ val verticalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_vertical_offset)
+ val padding =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_padding)
+
+ if (!udfpsSupported) {
+ leftShortcut.apply {
+ updateLayoutParams<ViewGroup.MarginLayoutParams> {
+ marginStart = horizontalOffsetMargin
+ bottomMargin = verticalOffsetMargin
+ }
+ setPadding(padding)
+ }
+
+ rightShortcut.apply {
+ updateLayoutParams<ViewGroup.MarginLayoutParams> {
+ marginEnd = horizontalOffsetMargin
+ bottomMargin = verticalOffsetMargin
+ }
+ setPadding(padding)
+ }
+ }
+
+ rootView.getConstraintSet().apply {
+ if (udfpsSupported) {
+ constrainWidth(leftShortcut.id, width)
+ constrainHeight(leftShortcut.id, height)
+ connect(leftShortcut.id, LEFT, PARENT_ID, LEFT)
+ connect(leftShortcut.id, RIGHT, lockIconView.id, LEFT)
+ connect(leftShortcut.id, TOP, lockIconView.id, TOP)
+ connect(leftShortcut.id, BOTTOM, lockIconView.id, BOTTOM)
+
+ constrainWidth(rightShortcut.id, width)
+ constrainHeight(rightShortcut.id, height)
+ connect(rightShortcut.id, RIGHT, PARENT_ID, RIGHT)
+ connect(rightShortcut.id, LEFT, lockIconView.id, RIGHT)
+ connect(rightShortcut.id, TOP, lockIconView.id, TOP)
+ connect(rightShortcut.id, BOTTOM, lockIconView.id, BOTTOM)
+ } else {
+ constrainWidth(leftShortcut.id, width)
+ constrainHeight(leftShortcut.id, height)
+ connect(leftShortcut.id, LEFT, PARENT_ID, LEFT)
+ connect(leftShortcut.id, BOTTOM, PARENT_ID, BOTTOM)
+
+ constrainWidth(rightShortcut.id, width)
+ constrainHeight(rightShortcut.id, height)
+ connect(rightShortcut.id, RIGHT, PARENT_ID, RIGHT)
+ connect(rightShortcut.id, BOTTOM, PARENT_ID, BOTTOM)
+ }
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutAmbientIndicationArea(rootView: KeyguardRootView) {
+ val ambientIndicationContainer =
+ rootView.findViewById<View>(R.id.ambient_indication_container) ?: return
+ val lockIconView = rootView.findViewById<View>(R.id.lock_icon_view) ?: return
+ val indicationArea = rootView.findViewById<View>(R.id.keyguard_indication_area) ?: return
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(ambientIndicationContainer.id, MATCH_PARENT)
+
+ if (keyguardUpdateMonitor.isUdfpsSupported) {
+ //constrain below udfps and above indication area
+ constrainHeight(ambientIndicationContainer.id, MATCH_CONSTRAINT)
+ connect(ambientIndicationContainer.id, TOP, lockIconView.id, BOTTOM)
+ connect(ambientIndicationContainer.id, BOTTOM, indicationArea.id, TOP)
+ connect(ambientIndicationContainer.id, LEFT, PARENT_ID, LEFT)
+ connect(ambientIndicationContainer.id, RIGHT, PARENT_ID, RIGHT)
+ } else {
+ //constrain above lock icon
+ constrainHeight(ambientIndicationContainer.id, WRAP_CONTENT)
+ connect(ambientIndicationContainer.id, BOTTOM, lockIconView.id, TOP)
+ connect(ambientIndicationContainer.id, LEFT, PARENT_ID, LEFT)
+ connect(ambientIndicationContainer.id, RIGHT, PARENT_ID, RIGHT)
+ }
+ applyTo(rootView)
+ }
+ }
+
+ override fun layoutSettingsPopupMenu(rootView: KeyguardRootView) {
+ val popupMenu =
+ rootView.findViewById<LaunchableLinearLayout>(R.id.keyguard_settings_button) ?: return
+ val icon = popupMenu.findViewById<ImageView>(R.id.icon) ?: return
+ val textView = popupMenu.findViewById<TextView>(R.id.text) ?: return
+ val horizontalOffsetMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_horizontal_offset)
+
+ icon.updateLayoutParams<LinearLayout.LayoutParams> {
+ height =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_height)
+ width =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_width)
+ marginEnd =
+ context
+ .resources
+ .getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_icon_end_margin)
+ }
+
+ textView.updateLayoutParams<LinearLayout.LayoutParams> {
+ height = WRAP_CONTENT
+ width = WRAP_CONTENT
+ }
+
+ popupMenu.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+ bottomMargin =
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_vertical_offset)
+ marginStart = horizontalOffsetMargin
+ marginEnd = horizontalOffsetMargin
+ }
+ popupMenu.setPadding(
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_settings_popup_menu_padding)
+ )
+
+ rootView.getConstraintSet().apply {
+ constrainWidth(popupMenu.id, WRAP_CONTENT)
+ constrainHeight(popupMenu.id, WRAP_CONTENT)
+ constrainMinHeight(
+ popupMenu.id,
+ context.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height)
+ )
+ connect(popupMenu.id, LEFT, PARENT_ID, LEFT)
+ connect(popupMenu.id, RIGHT, PARENT_ID, RIGHT)
+ connect(popupMenu.id, BOTTOM, PARENT_ID, BOTTOM)
+
+ applyTo(rootView)
+ }
+ }
+
+ private fun Int.dp(): Int {
+ return context.resources.getDimensionPixelSize(this)
+ }
+
+ private fun ConstraintLayout.getConstraintSet(): ConstraintSet =
+ ConstraintSet().also {
+ it.clone(this)
+ }
+
+ companion object {
+ const val SHORTCUTS_BESIDE_UDFPS = "shortcutsBesideUdfps"
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardAmbientIndicationViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardAmbientIndicationViewModel.kt
new file mode 100644
index 000000000000..dd3967aed99d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardAmbientIndicationViewModel.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.keyguard.ui.viewmodel
+
+import com.android.systemui.doze.util.BurnInHelperWrapper
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+import javax.inject.Inject
+
+class KeyguardAmbientIndicationViewModel
+@Inject
+constructor(
+ private val keyguardInteractor: KeyguardInteractor,
+ private val burnInHelperWrapper: BurnInHelperWrapper,
+) {
+
+ /** An observable for the x-offset by which the indication area should be translated. */
+ val indicationAreaTranslationX: Flow<Float> =
+ keyguardInteractor.clockPosition.map { it.x.toFloat() }.distinctUntilChanged()
+
+ /** Returns an observable for the y-offset by which the indication area should be translated. */
+ fun indicationAreaTranslationY(defaultBurnInOffset: Int): Flow<Float> {
+ return keyguardInteractor.dozeAmount
+ .map { dozeAmount ->
+ dozeAmount *
+ (burnInHelperWrapper.burnInOffset(
+ /* amplitude = */ defaultBurnInOffset * 2,
+ /* xAxis= */ false,
+ ) - defaultBurnInOffset)
+ }
+ .distinctUntilChanged()
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
index f1ceaaa391f5..980cc1b8ebe1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
@@ -17,6 +17,8 @@
package com.android.systemui.keyguard.ui.viewmodel
import com.android.systemui.doze.util.BurnInHelperWrapper
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import javax.inject.Inject
@@ -33,6 +35,8 @@ constructor(
bottomAreaInteractor: KeyguardBottomAreaInteractor,
keyguardBottomAreaViewModel: KeyguardBottomAreaViewModel,
private val burnInHelperWrapper: BurnInHelperWrapper,
+ private val shortcutsCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel,
+ private val featureFlags: FeatureFlags,
) {
/** Notifies when a new configuration is set */
@@ -43,15 +47,28 @@ constructor(
/** An observable for whether the indication area should be padded. */
val isIndicationAreaPadded: Flow<Boolean> =
- combine(keyguardBottomAreaViewModel.startButton, keyguardBottomAreaViewModel.endButton) {
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ combine(shortcutsCombinedViewModel.startButton, shortcutsCombinedViewModel.endButton) {
startButtonModel,
endButtonModel ->
startButtonModel.isVisible || endButtonModel.isVisible
}
- .distinctUntilChanged()
+ .distinctUntilChanged()
+ } else {
+ combine(keyguardBottomAreaViewModel.startButton, keyguardBottomAreaViewModel.endButton) {
+ startButtonModel,
+ endButtonModel ->
+ startButtonModel.isVisible || endButtonModel.isVisible
+ }
+ .distinctUntilChanged()
+ }
/** An observable for the x-offset by which the indication area should be translated. */
val indicationAreaTranslationX: Flow<Float> =
- bottomAreaInteractor.clockPosition.map { it.x.toFloat() }.distinctUntilChanged()
+ if (featureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ keyguardInteractor.clockPosition.map { it.x.toFloat() }.distinctUntilChanged()
+ } else {
+ bottomAreaInteractor.clockPosition.map { it.x.toFloat() }.distinctUntilChanged()
+ }
/** Returns an observable for the y-offset by which the indication area should be translated. */
fun indicationAreaTranslationY(defaultBurnInOffset: Int): Flow<Float> {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
index bf51976e27f0..63d165daa303 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardPreviewSmartspaceViewModel.kt
@@ -71,8 +71,12 @@ constructor(
fun getSmallClockSmartspaceTopPadding(resources: Resources): Int {
return with(resources) {
getStatusBarHeight(this) +
- getDimensionPixelSize(R.dimen.small_clock_padding_top) +
- getDimensionPixelSize(R.dimen.small_clock_height)
+ getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_padding_top
+ ) +
+ getDimensionPixelSize(
+ com.android.systemui.customization.R.dimen.small_clock_height
+ )
}
}
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
new file mode 100644
index 000000000000..56a98455d8b3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
@@ -0,0 +1,174 @@
+/*
+ * 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 androidx.annotation.VisibleForTesting
+import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
+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.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+import javax.inject.Inject
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class KeyguardQuickAffordancesCombinedViewModel
+@Inject
+constructor(
+ private val quickAffordanceInteractor: KeyguardQuickAffordanceInteractor,
+ private val keyguardInteractor: KeyguardInteractor,
+) {
+
+ /**
+ * ID of the slot that's currently selected in the preview that renders exclusively in the
+ * wallpaper picker application. This is ignored for the actual, real lock screen experience.
+ */
+ private val selectedPreviewSlotId =
+ MutableStateFlow(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
+
+ /**
+ * 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.
+ *
+ * Note that there is a margin of error, where we allow very, very slightly transparent views to
+ * be considered "fully opaque" for the purpose of being interactive. This is to accommodate the
+ * error margin of floating point arithmetic.
+ *
+ * A view that is visible but with an alpha of less than our threshold either means it's not
+ * fully done fading in or is fading/faded out. Either way, it should not be
+ * interactive/clickable unless "fully opaque" to avoid issues like in b/241830987.
+ */
+ private val areQuickAffordancesFullyOpaque: Flow<Boolean> =
+ keyguardInteractor.keyguardAlpha
+ .map { alpha -> alpha >= AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD }
+ .distinctUntilChanged()
+
+ /** An observable for the view-model of the "start button" quick affordance. */
+ val startButton: Flow<KeyguardQuickAffordanceViewModel> =
+ button(KeyguardQuickAffordancePosition.BOTTOM_START)
+
+ /** An observable for the view-model of the "end button" quick affordance. */
+ val endButton: Flow<KeyguardQuickAffordanceViewModel> =
+ button(KeyguardQuickAffordancePosition.BOTTOM_END)
+
+ /**
+ * 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]
+ */
+ fun onPreviewSlotSelected(slotId: String) {
+ selectedPreviewSlotId.value = slotId
+ }
+
+ private fun button(
+ position: KeyguardQuickAffordancePosition
+ ): Flow<KeyguardQuickAffordanceViewModel> {
+ return keyguardInteractor.previewMode.flatMapLatest { previewMode ->
+ combine(
+ if (previewMode.isInPreviewMode) {
+ quickAffordanceInteractor.quickAffordanceAlwaysVisible(position = position)
+ } else {
+ quickAffordanceInteractor.quickAffordance(position = position)
+ },
+ keyguardInteractor.animateDozingTransitions.distinctUntilChanged(),
+ areQuickAffordancesFullyOpaque,
+ selectedPreviewSlotId,
+ quickAffordanceInteractor.useLongPress(),
+ ) { model, animateReveal, isFullyOpaque, selectedPreviewSlotId, useLongPress ->
+ val slotId = position.toSlotId()
+ val isSelected = selectedPreviewSlotId == slotId
+ model.toViewModel(
+ animateReveal = !previewMode.isInPreviewMode && animateReveal,
+ isClickable = isFullyOpaque && !previewMode.isInPreviewMode,
+ isSelected =
+ previewMode.isInPreviewMode &&
+ previewMode.shouldHighlightSelectedAffordance &&
+ isSelected,
+ isDimmed =
+ previewMode.isInPreviewMode &&
+ previewMode.shouldHighlightSelectedAffordance &&
+ !isSelected,
+ forceInactive = previewMode.isInPreviewMode,
+ slotId = slotId,
+ useLongPress = useLongPress,
+ )
+ }
+ .distinctUntilChanged()
+ }
+ }
+
+ private fun KeyguardQuickAffordanceModel.toViewModel(
+ animateReveal: Boolean,
+ isClickable: Boolean,
+ isSelected: Boolean,
+ isDimmed: Boolean,
+ forceInactive: Boolean,
+ slotId: String,
+ useLongPress: Boolean,
+ ): KeyguardQuickAffordanceViewModel {
+ return when (this) {
+ is KeyguardQuickAffordanceModel.Visible ->
+ KeyguardQuickAffordanceViewModel(
+ configKey = configKey,
+ isVisible = true,
+ animateReveal = animateReveal,
+ icon = icon,
+ onClicked = { parameters ->
+ quickAffordanceInteractor.onQuickAffordanceTriggered(
+ configKey = parameters.configKey,
+ expandable = parameters.expandable,
+ slotId = parameters.slotId,
+ )
+ },
+ isClickable = isClickable,
+ isActivated = !forceInactive && activationState is ActivationState.Active,
+ isSelected = isSelected,
+ useLongPress = useLongPress,
+ isDimmed = isDimmed,
+ slotId = slotId,
+ )
+ is KeyguardQuickAffordanceModel.Hidden ->
+ KeyguardQuickAffordanceViewModel(
+ slotId = slotId,
+ )
+ }
+ }
+
+ companion object {
+ // We select a value that's less than 1.0 because we want floating point math precision to
+ // not be a factor in determining whether the affordance UI is fully opaque. The number we
+ // choose needs to be close enough 1.0 such that the user can't easily tell the difference
+ // between the UI with an alpha at the threshold and when the alpha is 1.0. At the same
+ // time, we don't want the number to be too close to 1.0 such that there is a chance that we
+ // never treat the affordance UI as "fully opaque" as that would risk making it forever not
+ // clickable.
+ @VisibleForTesting
+ const val AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD = 0.95f
+ }
+
+} \ No newline at end of file
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
new file mode 100644
index 000000000000..316ca771bf8f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
@@ -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.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
+import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+import javax.inject.Inject
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class KeyguardRootViewModel
+@Inject
+constructor(
+ private val keyguardInteractor: KeyguardInteractor,
+ private val keyguardQuickAffordancesCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel
+)
+{
+ /** Represents the current state of the KeyguardRootView visibility */
+ val keyguardRootViewVisibilityState: Flow<KeyguardRootViewVisibilityState> =
+ keyguardInteractor.keyguardRootViewVisibilityState
+
+ /** An observable for the alpha level for the entire keyguard root view. */
+ val alpha: Flow<Float> =
+ keyguardInteractor.previewMode.flatMapLatest {
+ if (it.isInPreviewMode) {
+ flowOf(1f)
+ } else {
+ keyguardInteractor.keyguardAlpha.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.
+ *
+ * @param initiallySelectedSlotId The ID of the initial slot to render as the selected one.
+ * @param shouldHighlightSelectedAffordance Whether the selected quick affordance should be
+ * highlighted (while all others are dimmed to make the selected one stand out).
+ */
+ fun enablePreviewMode(
+ initiallySelectedSlotId: String?,
+ shouldHighlightSelectedAffordance: Boolean,
+ ) {
+ keyguardInteractor.previewMode.value =
+ KeyguardInteractor.PreviewMode(
+ isInPreviewMode = true,
+ shouldHighlightSelectedAffordance = shouldHighlightSelectedAffordance,
+ )
+ keyguardQuickAffordancesCombinedViewModel.onPreviewSlotSelected(
+ initiallySelectedSlotId ?: KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START
+ )
+ }
+
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
index 2b42604e7160..14d4b6800b0a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt
@@ -119,7 +119,7 @@ internal constructor(
::AnimatingColorTransition
)
- val bgColor = context.getColor(com.android.systemui.R.color.material_dynamic_secondary95)
+ val bgColor = context.getColor(com.google.android.material.R.color.material_dynamic_secondary95)
val surfaceColor =
animatingColorTransitionFactory(bgColor, ::surfaceFromScheme) { surfaceColor ->
val colorList = ColorStateList.valueOf(surfaceColor)
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
index 2d75359bf835..a09935b9fb6a 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt
@@ -68,7 +68,9 @@ constructor(
}
launch {
val label = labelLoader.loadLabel(task.userId, component)
- root.contentDescription = label ?: root.context.getString(R.string.unknown)
+ root.contentDescription =
+ label
+ ?: root.context.getString(com.android.settingslib.R.string.unknown)
}
}
launch {
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
index 58e700f81388..25965fc86370 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java
@@ -33,7 +33,6 @@ import android.view.ContextThemeWrapper;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import com.android.settingslib.Utils;
-import com.android.systemui.R;
class PeopleStoryIconFactory implements AutoCloseable {
@@ -59,7 +58,8 @@ class PeopleStoryIconFactory implements AutoCloseable {
mIconSize = mDensity * iconSizeDp;
mPackageManager = pm;
mIconDrawableFactory = iconDrawableFactory;
- mImportantConversationColor = mContext.getColor(R.color.important_conversation);
+ mImportantConversationColor = mContext.getColor(
+ com.android.launcher3.icons.R.color.important_conversation);
mAccentColor = Utils.getColorAttr(mContext,
com.android.internal.R.attr.colorAccentPrimaryVariant).getDefaultColor();
}
@@ -224,4 +224,4 @@ class PeopleStoryIconFactory implements AutoCloseable {
@Override
public void close() {
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 4c3699ced6e5..7c76c1ae1bf5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -180,7 +180,8 @@ public class HotspotTile extends QSTileImpl<BooleanState> {
private String getSecondaryLabel(boolean isActive, boolean isTransient,
boolean isDataSaverEnabled, int numConnectedDevices, boolean isWifiTetheringAllowed) {
if (!isWifiTetheringAllowed) {
- return mContext.getString(R.string.wifitrackerlib_admin_restricted_network);
+ return mContext.getString(
+ com.android.wifitrackerlib.R.string.wifitrackerlib_admin_restricted_network);
} else if (isTransient) {
return mContext.getString(R.string.quick_settings_hotspot_secondary_label_transient);
} else if (isDataSaverEnabled) {
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt
index b89179289a3d..8601b3de2f7c 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt
@@ -24,8 +24,10 @@ class SceneWindowRootView(
viewModel: SceneContainerViewModel,
containerConfig: SceneContainerConfig,
scenes: Set<Scene>,
+ layoutInsetController: LayoutInsetsController,
) {
this.viewModel = viewModel
+ setLayoutInsetsController(layoutInsetController)
SceneWindowRootViewBinder.bind(
view = this@SceneWindowRootView,
viewModel = viewModel,
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
index 860ebcb27487..c9a73e665293 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/WindowRootView.kt
@@ -1,9 +1,15 @@
package com.android.systemui.scene.ui.view
+import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
+import android.util.Pair
+import android.view.DisplayCutout
import android.view.View
+import android.view.WindowInsets
import android.widget.FrameLayout
+import androidx.core.view.updateMargins
+import com.android.systemui.R
import com.android.systemui.compose.ComposeFacade
/** A view that can serve as the root of the main SysUI window. */
@@ -16,6 +22,10 @@ open class WindowRootView(
attrs,
) {
+ private lateinit var layoutInsetsController: LayoutInsetsController
+ private var leftInset = 0
+ private var rightInset = 0
+
override fun onAttachedToWindow() {
super.onAttachedToWindow()
@@ -32,8 +42,114 @@ open class WindowRootView(
}
}
+ override fun generateLayoutParams(attrs: AttributeSet?): FrameLayout.LayoutParams? {
+ return LayoutParams(context, attrs)
+ }
+
+ override fun generateDefaultLayoutParams(): FrameLayout.LayoutParams? {
+ return LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT
+ )
+ }
+
+ override fun onApplyWindowInsets(windowInsets: WindowInsets): WindowInsets? {
+ val insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
+ if (fitsSystemWindows) {
+ val paddingChanged = insets.top != paddingTop || insets.bottom != paddingBottom
+
+ // Drop top inset, and pass through bottom inset.
+ if (paddingChanged) {
+ setPadding(0, 0, 0, 0)
+ }
+ } else {
+ val changed =
+ paddingLeft != 0 || paddingRight != 0 || paddingTop != 0 || paddingBottom != 0
+ if (changed) {
+ setPadding(0, 0, 0, 0)
+ }
+ }
+ leftInset = 0
+ rightInset = 0
+
+ val displayCutout = rootWindowInsets.displayCutout
+ val pairInsets: Pair<Int, Int> =
+ layoutInsetsController.getinsets(windowInsets, displayCutout)
+ leftInset = pairInsets.first
+ rightInset = pairInsets.second
+ applyMargins()
+ return windowInsets
+ }
+
+ fun setLayoutInsetsController(layoutInsetsController: LayoutInsetsController) {
+ this.layoutInsetsController = layoutInsetsController
+ }
+
+ private fun applyMargins() {
+ val count = childCount
+ for (i in 0 until count) {
+ val child = getChildAt(i)
+ if (child.layoutParams is LayoutParams) {
+ val layoutParams = child.layoutParams as LayoutParams
+ if (
+ !layoutParams.ignoreRightInset &&
+ (layoutParams.rightMargin != rightInset ||
+ layoutParams.leftMargin != leftInset)
+ ) {
+ layoutParams.updateMargins(left = leftInset, right = rightInset)
+ child.requestLayout()
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns `true` if this view is the true root of the view-hierarchy; `false` otherwise.
+ *
+ * Please see the class-level documentation to understand why this is possible.
+ */
private fun isRoot(): Boolean {
// TODO(b/283300105): remove this check once there's only one subclass of WindowRootView.
return parent.let { it !is View || it.id == android.R.id.content }
}
+
+ /** Controller responsible for calculating insets for the shade window. */
+ interface LayoutInsetsController {
+
+ /** Update the insets and calculate them accordingly. */
+ fun getinsets(
+ windowInsets: WindowInsets?,
+ displayCutout: DisplayCutout?,
+ ): Pair<Int, Int>
+ }
+
+ private class LayoutParams : FrameLayout.LayoutParams {
+ var ignoreRightInset = false
+
+ constructor(
+ width: Int,
+ height: Int,
+ ) : super(
+ width,
+ height,
+ )
+
+ @SuppressLint("CustomViewStyleable")
+ constructor(
+ context: Context,
+ attrs: AttributeSet?,
+ ) : super(
+ context,
+ attrs,
+ ) {
+ val obtainedAttributes =
+ context.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout)
+ ignoreRightInset =
+ obtainedAttributes.getBoolean(
+ R.styleable.StatusBarWindowView_Layout_ignoreRightInset,
+ false
+ )
+ obtainedAttributes.recycle()
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index ed7cbffc880b..773f35e0c665 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -138,6 +138,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState;
import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.keyguard.shared.model.WakefulnessModel;
import com.android.systemui.keyguard.ui.binder.KeyguardLongPressViewBinder;
+import com.android.systemui.keyguard.ui.view.KeyguardRootView;
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel;
@@ -348,6 +349,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
private final AccessibilityDelegate mAccessibilityDelegate = new ShadeAccessibilityDelegate();
private final NotificationGutsManager mGutsManager;
private final AlternateBouncerInteractor mAlternateBouncerInteractor;
+ private final KeyguardRootView mKeyguardRootView;
private final QuickSettingsController mQsController;
private final TouchHandler mTouchHandler = new TouchHandler();
@@ -363,6 +365,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
private boolean mTracking;
private boolean mIsTrackingExpansionFromStatusBar;
private boolean mHintAnimationRunning;
+ @Deprecated
private KeyguardBottomAreaView mKeyguardBottomArea;
private boolean mExpanding;
private boolean mSplitShadeEnabled;
@@ -739,7 +742,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
KeyguardInteractor keyguardInteractor,
ActivityStarter activityStarter,
KeyguardViewConfigurator keyguardViewConfigurator,
- KeyguardFaceAuthInteractor keyguardFaceAuthInteractor) {
+ KeyguardFaceAuthInteractor keyguardFaceAuthInteractor,
+ KeyguardRootView keyguardRootView) {
keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override
public void onKeyguardFadingAwayChanged() {
@@ -939,6 +943,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
});
mAlternateBouncerInteractor = alternateBouncerInteractor;
+ mKeyguardRootView = keyguardRootView;
dumpManager.registerDumpable(this);
}
@@ -1029,7 +1034,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mShadeExpansionStateManager.addQsExpansionListener(this::onQsExpansionChanged);
mShadeHeadsUpTracker.addTrackingHeadsUpListener(
mNotificationStackScrollLayoutController::setTrackingHeadsUp);
- setKeyguardBottomArea(mView.findViewById(R.id.keyguard_bottom_area));
+ if (!mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ setKeyguardBottomArea(mView.findViewById(R.id.keyguard_bottom_area));
+ }
initBottomArea();
@@ -1311,14 +1318,17 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
updateViewControllers(mView.findViewById(R.id.keyguard_status_view), userAvatarView,
keyguardUserSwitcherView);
- // Update keyguard bottom area
- int index = mView.indexOfChild(mKeyguardBottomArea);
- mView.removeView(mKeyguardBottomArea);
- KeyguardBottomAreaView oldBottomArea = mKeyguardBottomArea;
- setKeyguardBottomArea(mKeyguardBottomAreaViewControllerProvider.get().getView());
- mKeyguardBottomArea.initFrom(oldBottomArea);
- mView.addView(mKeyguardBottomArea, index);
- initBottomArea();
+ if (!mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ // Update keyguard bottom area
+ int index = mView.indexOfChild(mKeyguardBottomArea);
+ mView.removeView(mKeyguardBottomArea);
+ KeyguardBottomAreaView oldBottomArea = mKeyguardBottomArea;
+ setKeyguardBottomArea(mKeyguardBottomAreaViewControllerProvider.get().getView());
+ mKeyguardBottomArea.initFrom(oldBottomArea);
+ mView.addView(mKeyguardBottomArea, index);
+
+ initBottomArea();
+ }
mStatusBarStateListener.onDozeAmountChanged(mStatusBarStateController.getDozeAmount(),
mStatusBarStateController.getInterpolatedDozeAmount());
@@ -1341,7 +1351,12 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
false,
mBarState);
}
- setKeyguardBottomAreaVisibility(mBarState, false);
+
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ setKeyguardVisibility(mBarState, false);
+ } else {
+ setKeyguardBottomAreaVisibility(mBarState, false);
+ }
mKeyguardUnfoldTransition.ifPresent(u -> u.setup(mView));
mNotificationPanelUnfoldAnimationController.ifPresent(u -> u.setup(mView));
@@ -1352,7 +1367,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
private void initBottomArea() {
- mKeyguardBottomArea.init(
+ if (!mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardBottomArea.init(
mKeyguardBottomAreaViewModel,
mFalsingManager,
mLockIconViewController,
@@ -1361,8 +1377,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mVibratorHelper,
mActivityStarter);
- // Rebind (for now), as a new bottom area and indication area may have been created
- mKeyguardViewConfigurator.bindIndicationArea(mKeyguardBottomArea);
+ // Rebind (for now), as a new bottom area and indication area may have been created
+ mKeyguardViewConfigurator.bindIndicationArea();
+ }
}
@VisibleForTesting
@@ -1398,6 +1415,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
return mHintAnimationRunning || mUnlockedScreenOffAnimationController.isAnimationPlaying();
}
+ @Deprecated
private void setKeyguardBottomArea(KeyguardBottomAreaView keyguardBottomArea) {
mKeyguardBottomArea = keyguardBottomArea;
}
@@ -1521,8 +1539,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mClockPositionAlgorithm.run(mClockPositionResult);
mKeyguardStatusViewController.setLockscreenClockY(
mClockPositionAlgorithm.getExpandedPreferredClockY());
- mKeyguardBottomAreaInteractor.setClockPosition(
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardInteractor.setClockPosition(
+ mClockPositionResult.clockX, mClockPositionResult.clockY);
+ } else {
+ mKeyguardBottomAreaInteractor.setClockPosition(
mClockPositionResult.clockX, mClockPositionResult.clockY);
+ }
boolean animate = mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending();
boolean animateClock = (animate || mAnimateNextPositionUpdate) && shouldAnimateClockChange;
mKeyguardStatusViewController.updatePosition(
@@ -2169,6 +2192,15 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
}
+ private void setKeyguardVisibility(int statusBarState, boolean goingToFullShade) {
+ mKeyguardInteractor.setKeyguardRootVisibility(
+ statusBarState,
+ goingToFullShade,
+ mIsOcclusionTransitionRunning
+ );
+ }
+
+ @Deprecated
private void setKeyguardBottomAreaVisibility(int statusBarState, boolean goingToFullShade) {
mKeyguardBottomArea.animate().cancel();
if (goingToFullShade) {
@@ -2177,8 +2209,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mKeyguardStateController.getShortenedFadingAwayDuration()).setInterpolator(
Interpolators.ALPHA_OUT).withEndAction(
mAnimateKeyguardBottomAreaInvisibleEndRunnable).start();
- } else if (statusBarState == KEYGUARD
- || statusBarState == StatusBarState.SHADE_LOCKED) {
+ } else if (statusBarState == KEYGUARD || statusBarState == StatusBarState.SHADE_LOCKED) {
mKeyguardBottomArea.setVisibility(View.VISIBLE);
if (!mIsOcclusionTransitionRunning) {
mKeyguardBottomArea.setAlpha(1f);
@@ -2514,7 +2545,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
getExpandedFraction());
float alpha = Math.min(expansionAlpha, 1 - mQsController.computeExpansionFraction());
alpha *= mBottomAreaShadeAlpha;
- mKeyguardBottomAreaInteractor.setAlpha(alpha);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardInteractor.setAlpha(alpha);
+ } else {
+ mKeyguardBottomAreaInteractor.setAlpha(alpha);
+ }
mLockIconViewController.setAlpha(alpha);
}
@@ -2773,7 +2808,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
private void updateDozingVisibilities(boolean animate) {
- mKeyguardBottomAreaInteractor.setAnimateDozingTransitions(animate);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardInteractor.setAnimateDozingTransitions(animate);
+ } else {
+ mKeyguardBottomAreaInteractor.setAnimateDozingTransitions(animate);
+ }
if (!mDozing && animate) {
mKeyguardStatusBarViewController.animateKeyguardStatusBarIn();
}
@@ -2977,7 +3016,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mDozing = dozing;
// TODO (b/) make listeners for this
mNotificationStackScrollLayoutController.setDozing(mDozing, animate);
- mKeyguardBottomAreaInteractor.setAnimateDozingTransitions(animate);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardInteractor.setAnimateDozingTransitions(animate);
+ } else {
+ mKeyguardBottomAreaInteractor.setAnimateDozingTransitions(animate);
+ }
mKeyguardStatusBarViewController.setDozing(mDozing);
mQsController.setDozing(mDozing);
@@ -3898,20 +3941,37 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
animator.start();
setAnimator(animator);
- final List<ViewPropertyAnimator> indicationAnimators =
- mKeyguardBottomArea.getIndicationAreaAnimators();
- for (final ViewPropertyAnimator indicationAreaAnimator : indicationAnimators) {
- indicationAreaAnimator
+
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ final ViewPropertyAnimator mKeyguardRootViewAnimator = mKeyguardRootView.animate();
+ mKeyguardRootViewAnimator
.translationY(-mHintDistance)
.setDuration(250)
.setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .withEndAction(() -> indicationAreaAnimator
+ .withEndAction(() -> mKeyguardRootViewAnimator
.translationY(0)
.setDuration(450)
.setInterpolator(mBounceInterpolator)
.start())
.start();
+ } else {
+ final List<ViewPropertyAnimator> indicationAnimators =
+ mKeyguardBottomArea.getIndicationAreaAnimators();
+
+ for (final ViewPropertyAnimator indicationAreaAnimator : indicationAnimators) {
+ indicationAreaAnimator
+ .translationY(-mHintDistance)
+ .setDuration(250)
+ .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+ .withEndAction(() -> indicationAreaAnimator
+ .translationY(0)
+ .setDuration(450)
+ .setInterpolator(mBounceInterpolator)
+ .start())
+ .start();
+ }
}
+
}
private void setAnimator(ValueAnimator animator) {
@@ -4352,7 +4412,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
goingToFullShade,
mBarState);
- setKeyguardBottomAreaVisibility(statusBarState, goingToFullShade);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ setKeyguardVisibility(statusBarState, goingToFullShade);
+ } else {
+ setKeyguardBottomAreaVisibility(statusBarState, goingToFullShade);
+ }
// TODO: maybe add a listener for barstate
mBarState = statusBarState;
@@ -4589,7 +4653,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mKeyguardStatusViewController.setAlpha(alpha);
stackScroller.setAlpha(alpha);
- mKeyguardBottomAreaInteractor.setAlpha(alpha);
+ if (mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) {
+ mKeyguardInteractor.setAlpha(alpha);
+ } else {
+ mKeyguardBottomAreaInteractor.setAlpha(alpha);
+ }
mLockIconViewController.setAlpha(alpha);
if (mKeyguardQsUserSwitchController != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
index 2b62b7d67c2a..a9c4aebe7ed6 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java
@@ -17,19 +17,15 @@
package com.android.systemui.shade;
import static android.os.Trace.TRACE_TAG_APP;
-import static android.view.WindowInsets.Type.systemBars;
import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.LayoutRes;
-import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
-import android.content.res.TypedArray;
import android.graphics.Canvas;
-import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -37,9 +33,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Trace;
import android.util.AttributeSet;
-import android.util.Pair;
import android.view.ActionMode;
-import android.view.DisplayCutout;
import android.view.InputQueue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -51,13 +45,10 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
-import android.view.WindowInsets;
import android.view.WindowInsetsController;
-import android.widget.FrameLayout;
import com.android.internal.view.FloatingActionMode;
import com.android.internal.widget.floatingtoolbar.FloatingToolbar;
-import com.android.systemui.R;
import com.android.systemui.scene.ui.view.WindowRootView;
/**
@@ -68,9 +59,6 @@ import com.android.systemui.scene.ui.view.WindowRootView;
public class NotificationShadeWindowView extends WindowRootView {
public static final String TAG = "NotificationShadeWindowView";
- private int mRightInset = 0;
- private int mLeftInset = 0;
-
// Implements the floating action mode for TextView's Cut/Copy/Past menu. Normally provided by
// DecorView, but since this is a special window we have to roll our own.
private View mFloatingActionModeOriginatingView;
@@ -79,7 +67,6 @@ public class NotificationShadeWindowView extends WindowRootView {
private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener;
private InteractionEventHandler mInteractionEventHandler;
- private LayoutInsetsController mLayoutInsetProvider;
public NotificationShadeWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -87,64 +74,6 @@ public class NotificationShadeWindowView extends WindowRootView {
}
@Override
- public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
- final Insets insets = windowInsets.getInsetsIgnoringVisibility(systemBars());
- if (getFitsSystemWindows()) {
- boolean paddingChanged = insets.top != getPaddingTop()
- || insets.bottom != getPaddingBottom();
-
- // Drop top inset, and pass through bottom inset.
- if (paddingChanged) {
- setPadding(0, 0, 0, 0);
- }
- } else {
- boolean changed = getPaddingLeft() != 0
- || getPaddingRight() != 0
- || getPaddingTop() != 0
- || getPaddingBottom() != 0;
- if (changed) {
- setPadding(0, 0, 0, 0);
- }
- }
-
- mLeftInset = 0;
- mRightInset = 0;
- DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout();
- Pair<Integer, Integer> pairInsets = mLayoutInsetProvider
- .getinsets(windowInsets, displayCutout);
- mLeftInset = pairInsets.first;
- mRightInset = pairInsets.second;
- applyMargins();
- return windowInsets;
- }
-
- private void applyMargins() {
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- View child = getChildAt(i);
- if (child.getLayoutParams() instanceof LayoutParams) {
- LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (!lp.ignoreRightInset
- && (lp.rightMargin != mRightInset || lp.leftMargin != mLeftInset)) {
- lp.rightMargin = mRightInset;
- lp.leftMargin = mLeftInset;
- child.requestLayout();
- }
- }
- }
- }
-
- @Override
- public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new LayoutParams(getContext(), attrs);
- }
-
- @Override
- protected FrameLayout.LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- }
-
- @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
setWillNotDraw(!DEBUG);
@@ -172,10 +101,6 @@ public class NotificationShadeWindowView extends WindowRootView {
mInteractionEventHandler = listener;
}
- protected void setLayoutInsetsController(LayoutInsetsController provider) {
- mLayoutInsetProvider = provider;
- }
-
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Boolean result = mInteractionEventHandler.handleDispatchTouchEvent(ev);
@@ -227,24 +152,6 @@ public class NotificationShadeWindowView extends WindowRootView {
}
}
- private static class LayoutParams extends FrameLayout.LayoutParams {
-
- public boolean ignoreRightInset;
-
- LayoutParams(int width, int height) {
- super(width, height);
- }
-
- LayoutParams(Context c, AttributeSet attrs) {
- super(c, attrs);
-
- TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout);
- ignoreRightInset = a.getBoolean(
- R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false);
- a.recycle();
- }
- }
-
@Override
public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback,
int type) {
@@ -357,18 +264,6 @@ public class NotificationShadeWindowView extends WindowRootView {
}
}
- /**
- * Controller responsible for calculating insets for the shade window.
- */
- public interface LayoutInsetsController {
-
- /**
- * Update the insets and calculate them accordingly.
- */
- Pair<Integer, Integer> getinsets(@Nullable WindowInsets windowInsets,
- @Nullable DisplayCutout displayCutout);
- }
-
interface InteractionEventHandler {
/**
* Returns a result for {@link ViewGroup#dispatchTouchEvent(MotionEvent)} or null to defer
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index 529f12e0658e..c6cb9c4d347c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -61,6 +61,7 @@ import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
+import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -99,6 +100,7 @@ constructor(
private val qsBatteryModeController: QsBatteryModeController,
private val nextAlarmController: NextAlarmController,
private val activityStarter: ActivityStarter,
+ private val statusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory,
) : ViewController<View>(header), Dumpable {
companion object {
@@ -326,6 +328,9 @@ constructor(
demoModeController.addCallback(demoModeReceiver)
statusBarIconController.addIconGroup(iconManager)
nextAlarmController.addCallback(nextAlarmCallback)
+ systemIcons.setOnHoverListener(
+ statusOverlayHoverListenerFactory.createListener(systemIcons)
+ )
}
override fun onViewDetached() {
@@ -336,6 +341,7 @@ constructor(
demoModeController.removeCallback(demoModeReceiver)
statusBarIconController.removeIconGroup(iconManager)
nextAlarmController.removeCallback(nextAlarmCallback)
+ systemIcons.setOnHoverListener(null)
}
fun disable(state1: Int, state2: Int, animate: Boolean) {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
index fc6479eb62a4..e02c4275f095 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt
@@ -42,6 +42,7 @@ import com.android.systemui.scene.ui.view.WindowRootView
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.LightRevealScrim
+import com.android.systemui.statusbar.NotificationInsetsController
import com.android.systemui.statusbar.NotificationShelf
import com.android.systemui.statusbar.NotificationShelfController
import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfComponent
@@ -78,6 +79,7 @@ abstract class ShadeViewProviderModule {
containerConfigProvider: Provider<SceneContainerConfig>,
@Named(SceneContainerNames.SYSTEM_UI_DEFAULT)
scenesProvider: Provider<Set<@JvmSuppressWildcards Scene>>,
+ layoutInsetController: NotificationInsetsController,
): WindowRootView {
return if (
featureFlags.isEnabled(Flags.SCENE_CONTAINER) && ComposeFacade.isComposeAvailable()
@@ -88,6 +90,7 @@ abstract class ShadeViewProviderModule {
viewModel = viewModelProvider.get(),
containerConfig = containerConfigProvider.get(),
scenes = scenesProvider.get(),
+ layoutInsetController = layoutInsetController,
)
sceneWindowRootView
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInsetsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInsetsController.java
index 39d7d6675ed4..27f42c632cc3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInsetsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInsetsController.java
@@ -16,11 +16,11 @@
package com.android.systemui.statusbar;
-import com.android.systemui.shade.NotificationShadeWindowView;
+import com.android.systemui.scene.ui.view.WindowRootView;
/**
* Calculates insets for the notification shade window view.
*/
public abstract class NotificationInsetsController
- implements NotificationShadeWindowView.LayoutInsetsController {
+ implements WindowRootView.LayoutInsetsController {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java
index c9ce12a6859e..ff40f70a84fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java
@@ -16,13 +16,7 @@
package com.android.systemui.statusbar.connectivity;
-import android.content.Context;
import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-import android.os.SimpleClock;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -35,25 +29,18 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Background;
-import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.settings.UserTracker;
import com.android.wifitrackerlib.MergedCarrierEntry;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
import java.io.PrintWriter;
-import java.time.Clock;
-import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
-import javax.inject.Inject;
-
/** */
public class AccessPointControllerImpl implements AccessPointController,
WifiPickerTracker.WifiPickerTrackerCallback,
@@ -272,77 +259,4 @@ public class AccessPointControllerImpl implements AccessPointController,
}
}
};
-
- /**
- * Factory for creating {@link WifiPickerTracker}.
- *
- * Uses the same time intervals as the Settings page for Wifi.
- */
- @SysUISingleton
- public static class WifiPickerTrackerFactory {
-
- // Max age of tracked WifiEntries
- private static final long MAX_SCAN_AGE_MILLIS = 15_000;
- // Interval between initiating WifiPickerTracker scans
- private static final long SCAN_INTERVAL_MILLIS = 10_000;
-
- private final Context mContext;
- private final @Nullable WifiManager mWifiManager;
- private final ConnectivityManager mConnectivityManager;
- private final Handler mMainHandler;
- private final Handler mWorkerHandler;
- private final Clock mClock = new SimpleClock(ZoneOffset.UTC) {
- @Override
- public long millis() {
- return SystemClock.elapsedRealtime();
- }
- };
-
- @Inject
- public WifiPickerTrackerFactory(
- Context context,
- @Nullable WifiManager wifiManager,
- ConnectivityManager connectivityManager,
- @Main Handler mainHandler,
- @Background Handler workerHandler
- ) {
- mContext = context;
- mWifiManager = wifiManager;
- mConnectivityManager = connectivityManager;
- mMainHandler = mainHandler;
- mWorkerHandler = workerHandler;
- }
-
- private boolean isSupported() {
- return mWifiManager != null;
- }
-
- /**
- * Create a {@link WifiPickerTracker}
- *
- * @param lifecycle
- * @param listener
- * @return a new {@link WifiPickerTracker} or {@code null} if {@link WifiManager} is null.
- */
- public @Nullable WifiPickerTracker create(
- Lifecycle lifecycle,
- WifiPickerTracker.WifiPickerTrackerCallback listener
- ) {
- if (mWifiManager == null) {
- return null;
- }
- return new WifiPickerTracker(
- lifecycle,
- mContext,
- mWifiManager,
- mConnectivityManager,
- mMainHandler,
- mWorkerHandler,
- mClock,
- MAX_SCAN_AGE_MILLIS,
- SCAN_INTERVAL_MILLIS,
- listener
- );
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiPickerTrackerFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiPickerTrackerFactory.kt
new file mode 100644
index 000000000000..ddbfcef513c3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiPickerTrackerFactory.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.statusbar.connectivity
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.wifi.WifiManager
+import android.os.Handler
+import android.os.SimpleClock
+import androidx.lifecycle.Lifecycle
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.util.time.SystemClock
+import com.android.wifitrackerlib.WifiPickerTracker
+import com.android.wifitrackerlib.WifiPickerTracker.WifiPickerTrackerCallback
+import java.time.Clock
+import java.time.ZoneOffset
+import javax.inject.Inject
+
+/**
+ * Factory for creating [WifiPickerTracker] for SysUI.
+ *
+ * Uses the same time intervals as the Settings page for Wifi.
+ */
+@SysUISingleton
+class WifiPickerTrackerFactory
+@Inject
+constructor(
+ private val context: Context,
+ private val wifiManager: WifiManager?,
+ private val connectivityManager: ConnectivityManager,
+ private val systemClock: SystemClock,
+ @Main private val mainHandler: Handler,
+ @Background private val workerHandler: Handler,
+) {
+ private val clock: Clock =
+ object : SimpleClock(ZoneOffset.UTC) {
+ override fun millis(): Long {
+ return systemClock.elapsedRealtime()
+ }
+ }
+ val isSupported: Boolean
+ get() = wifiManager != null
+
+ /**
+ * Creates a [WifiPickerTracker] instance.
+ *
+ * @return a new [WifiPickerTracker] or null if [WifiManager] is null.
+ */
+ fun create(
+ lifecycle: Lifecycle,
+ listener: WifiPickerTrackerCallback,
+ ): WifiPickerTracker? {
+ return if (wifiManager == null) {
+ null
+ } else
+ WifiPickerTracker(
+ lifecycle,
+ context,
+ wifiManager,
+ connectivityManager,
+ mainHandler,
+ workerHandler,
+ clock,
+ MAX_SCAN_AGE_MILLIS,
+ SCAN_INTERVAL_MILLIS,
+ listener,
+ )
+ }
+
+ companion object {
+ /** Max age of tracked WifiEntries. */
+ private const val MAX_SCAN_AGE_MILLIS: Long = 15000
+ /** Interval between initiating WifiPickerTracker scans. */
+ private const val SCAN_INTERVAL_MILLIS: Long = 10000
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index 1c7a1860dbb8..f726c4e8a753 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -72,6 +72,7 @@ import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarIconList;
+import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallFlags;
@@ -96,7 +97,7 @@ import java.util.concurrent.Executor;
* their own version of CentralSurfaces can include just dependencies, without injecting
* CentralSurfaces itself.
*/
-@Module
+@Module(includes = {StatusBarNotificationPresenterModule.class})
public interface CentralSurfacesDependenciesModule {
/** */
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 7b6802f95cda..1657c2897ea4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -1414,8 +1414,8 @@ public class NotificationContentView extends FrameLayout implements Notification
if (shouldShowBubbleButton(entry)) {
// explicitly resolve drawable resource using SystemUI's theme
Drawable d = mContext.getDrawable(entry.isBubble()
- ? R.drawable.bubble_ic_stop_bubble
- : R.drawable.bubble_ic_create_bubble);
+ ? com.android.wm.shell.R.drawable.bubble_ic_stop_bubble
+ : com.android.wm.shell.R.drawable.bubble_ic_create_bubble);
String contentDescription = mContext.getResources().getString(entry.isBubble()
? R.string.notification_conversation_unbubble
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index fcfb7ff8525d..035bdf183174 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
import static android.app.StatusBarManager.SESSION_KEYGUARD;
+import static com.android.systemui.flags.Flags.FP_LISTEN_OCCLUDING_APPS;
import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.keyguard.WakefulnessLifecycle.UNKNOWN_LAST_WAKE_TIME;
@@ -696,8 +697,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
mLatencyTracker.onActionCancel(action);
}
- if (!mVibratorHelper.hasVibrator()
- && (!mUpdateMonitor.isDeviceInteractive() || mUpdateMonitor.isDreaming())) {
+ final boolean screenOff = !mUpdateMonitor.isDeviceInteractive();
+ if (!mVibratorHelper.hasVibrator() && (screenOff || (mUpdateMonitor.isDreaming()
+ && !mFeatureFlags.isEnabled(FP_LISTEN_OCCLUDING_APPS)))) {
mLogger.d("wakeup device on authentication failure (device doesn't have a vibrator)");
startWakeAndUnlock(MODE_ONLY_WAKE);
} else if (biometricSourceType == BiometricSourceType.FINGERPRINT
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 6eeb25fdeb9e..f96fb26c0c8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -623,7 +623,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
private final ActivityLaunchAnimator mActivityLaunchAnimator;
private NotificationLaunchAnimatorControllerProvider mNotificationAnimationProvider;
- protected NotificationPresenter mPresenter;
+ private final NotificationPresenter mPresenter;
private NotificationActivityStarter mNotificationActivityStarter;
private final Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy;
private final Optional<Bubbles> mBubblesOptional;
@@ -724,6 +724,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
Lazy<NotificationShadeWindowViewController> notificationShadeWindowViewControllerLazy,
NotificationShelfController notificationShelfController,
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
+ NotificationPresenter notificationPresenter,
DozeParameters dozeParameters,
ScrimController scrimController,
Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
@@ -830,6 +831,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
mStackScrollerController = notificationStackScrollLayoutController;
mStackScroller = mStackScrollerController.getView();
mNotifListContainer = mStackScrollerController.getNotificationListContainer();
+ mPresenter = notificationPresenter;
mDozeServiceHost = dozeServiceHost;
mPowerManager = powerManager;
mDozeParameters = dozeParameters;
@@ -1604,7 +1606,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
mShadeController.setNotificationShadeWindowViewController(
getNotificationShadeWindowViewController());
mBackActionInteractor.setup(mQsController, mShadeSurface);
- mPresenter = mCentralSurfacesComponent.getNotificationPresenter();
mNotificationActivityStarter = mCentralSurfacesComponent.getNotificationActivityStarter();
mHeadsUpManager.addListener(mCentralSurfacesComponent.getStatusBarHeadsUpChangeListener());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
index 2677c3f2a8bd..1576aa2a4a0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java
@@ -23,7 +23,6 @@ import android.graphics.Rect;
import android.util.ArrayMap;
import android.widget.ImageView;
-import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
@@ -32,6 +31,11 @@ import java.util.ArrayList;
import javax.inject.Inject;
+import kotlinx.coroutines.flow.FlowKt;
+import kotlinx.coroutines.flow.MutableStateFlow;
+import kotlinx.coroutines.flow.StateFlow;
+import kotlinx.coroutines.flow.StateFlowKt;
+
/**
*/
@SysUISingleton
@@ -47,6 +51,9 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
private int mDarkModeIconColorSingleTone;
private int mLightModeIconColorSingleTone;
+ private final MutableStateFlow<DarkChange> mDarkChangeFlow = StateFlowKt.MutableStateFlow(
+ DarkChange.EMPTY);
+
/**
*/
@Inject
@@ -54,8 +61,10 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
Context context,
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
DumpManager dumpManager) {
- mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
- mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
+ mDarkModeIconColorSingleTone = context.getColor(
+ com.android.settingslib.R.color.dark_mode_icon_color_single_tone);
+ mLightModeIconColorSingleTone = context.getColor(
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone);
mTransitionsController = lightBarTransitionsControllerFactory.create(this);
@@ -66,6 +75,11 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
return mTransitionsController;
}
+ @Override
+ public StateFlow<DarkChange> darkChangeFlow() {
+ return FlowKt.asStateFlow(mDarkChangeFlow);
+ }
+
public void addDarkReceiver(DarkReceiver receiver) {
mReceivers.put(receiver, receiver);
receiver.onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
@@ -122,6 +136,7 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher,
}
private void applyIconTint() {
+ mDarkChangeFlow.setValue(new DarkChange(mTintAreas, mDarkIntensity, mIconTint));
for (int i = 0; i < mReceivers.size(); i++) {
mReceivers.valueAt(i).onDarkChanged(mTintAreas, mDarkIntensity, mIconTint);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
index d433814d7ce4..34bbd1359df7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt
@@ -38,6 +38,7 @@ import com.android.systemui.statusbar.VibratorHelper
* elements. A secondary concern is the interaction of the quick affordance elements with the
* indication area between them, though the indication area is primarily controlled elsewhere.
*/
+@Deprecated("Deprecated as part of b/278057014")
class KeyguardBottomAreaView
@JvmOverloads
constructor(
@@ -53,6 +54,7 @@ constructor(
defStyleRes,
) {
+ @Deprecated("Deprecated as part of b/278057014")
interface MessageDisplayer {
fun display(@StringRes stringResourceId: Int)
}
@@ -62,6 +64,7 @@ constructor(
private var lockIconViewController: LockIconViewController? = null
/** Initializes the view. */
+ @Deprecated("Deprecated as part of b/278057014")
fun init(
viewModel: KeyguardBottomAreaViewModel,
falsingManager: FalsingManager? = null,
@@ -88,6 +91,7 @@ constructor(
* Initializes this instance of [KeyguardBottomAreaView] based on the given instance of another
* [KeyguardBottomAreaView]
*/
+ @Deprecated("Deprecated as part of b/278057014")
fun initFrom(oldBottomArea: KeyguardBottomAreaView) {
// if it exists, continue to use the original ambient indication container
// instead of the newly inflated one
@@ -122,9 +126,11 @@ constructor(
}
/** Returns a list of animators to use to animate the indication areas. */
+ @Deprecated("Deprecated as part of b/278057014")
val indicationAreaAnimators: List<ViewPropertyAnimator>
get() = checkNotNull(binding).getIndicationAreaAnimators()
+
override fun hasOverlappingRendering(): Boolean {
return false
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 720eeba0fd4e..117a1a47043b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -34,7 +34,6 @@ import android.view.DisplayCutout;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -43,11 +42,11 @@ import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
-import com.android.app.animation.Interpolators;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange;
import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer;
import com.android.systemui.user.ui.binder.StatusBarUserChipViewBinder;
import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel;
@@ -55,6 +54,11 @@ import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel;
import java.io.PrintWriter;
import java.util.ArrayList;
+import kotlinx.coroutines.flow.FlowKt;
+import kotlinx.coroutines.flow.MutableStateFlow;
+import kotlinx.coroutines.flow.StateFlow;
+import kotlinx.coroutines.flow.StateFlowKt;
+
/**
* The header group on Keyguard.
*/
@@ -83,6 +87,8 @@ public class KeyguardStatusBarView extends RelativeLayout {
private int mStatusBarPaddingEnd;
private int mMinDotWidth;
private View mSystemIconsContainer;
+ private final MutableStateFlow<DarkChange> mDarkChange = StateFlowKt.MutableStateFlow(
+ DarkChange.EMPTY);
private View mCutoutSpace;
private ViewGroup mStatusIconArea;
@@ -374,49 +380,6 @@ public class KeyguardStatusBarView extends RelativeLayout {
return mKeyguardUserAvatarEnabled;
}
- private void animateNextLayoutChange() {
- final int systemIconsCurrentX = mSystemIconsContainer.getLeft();
- final boolean userAvatarVisible = mMultiUserAvatar.getParent() == mStatusIconArea;
- getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- @Override
- public boolean onPreDraw() {
- getViewTreeObserver().removeOnPreDrawListener(this);
- boolean userAvatarHiding = userAvatarVisible
- && mMultiUserAvatar.getParent() != mStatusIconArea;
- mSystemIconsContainer.setX(systemIconsCurrentX);
- mSystemIconsContainer.animate()
- .translationX(0)
- .setDuration(400)
- .setStartDelay(userAvatarHiding ? 300 : 0)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .start();
- if (userAvatarHiding) {
- getOverlay().add(mMultiUserAvatar);
- mMultiUserAvatar.animate()
- .alpha(0f)
- .setDuration(300)
- .setStartDelay(0)
- .setInterpolator(Interpolators.ALPHA_OUT)
- .withEndAction(() -> {
- mMultiUserAvatar.setAlpha(1f);
- getOverlay().remove(mMultiUserAvatar);
- })
- .start();
-
- } else {
- mMultiUserAvatar.setAlpha(0f);
- mMultiUserAvatar.animate()
- .alpha(1f)
- .setDuration(300)
- .setStartDelay(200)
- .setInterpolator(Interpolators.ALPHA_IN);
- }
- return true;
- }
- });
-
- }
-
@Override
public void setVisibility(int visibility) {
super.setVisibility(visibility);
@@ -458,8 +421,9 @@ public class KeyguardStatusBarView extends RelativeLayout {
@ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext,
R.attr.wallpaperTextColor);
@ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext,
- Color.luminance(textColor) < 0.5 ? R.color.dark_mode_icon_color_single_tone :
- R.color.light_mode_icon_color_single_tone);
+ Color.luminance(textColor) < 0.5
+ ? com.android.settingslib.R.color.dark_mode_icon_color_single_tone
+ : com.android.settingslib.R.color.light_mode_icon_color_single_tone);
float intensity = textColor == Color.WHITE ? 0 : 1;
mCarrierLabel.setTextColor(iconColor);
@@ -467,13 +431,14 @@ public class KeyguardStatusBarView extends RelativeLayout {
if (userSwitcherName != null) {
userSwitcherName.setTextColor(Utils.getColorStateListDefaultColor(
mContext,
- R.color.light_mode_icon_color_single_tone));
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone));
}
if (iconManager != null) {
iconManager.setTint(iconColor);
}
+ mDarkChange.setValue(new DarkChange(mEmptyTintRect, intensity, iconColor));
applyDarkness(R.id.battery, mEmptyTintRect, intensity, iconColor);
applyDarkness(R.id.clock, mEmptyTintRect, intensity, iconColor);
}
@@ -536,4 +501,8 @@ public class KeyguardStatusBarView extends RelativeLayout {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Trace.endSection();
}
+
+ public StateFlow<DarkChange> darkChangeFlow() {
+ return FlowKt.asStateFlow(mDarkChange);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index 680f19a79a05..be336e59f534 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -69,8 +69,6 @@ import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.settings.SecureSettings;
-import kotlin.Unit;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -78,6 +76,8 @@ import java.util.concurrent.Executor;
import javax.inject.Inject;
+import kotlin.Unit;
+
/** View Controller for {@link com.android.systemui.statusbar.phone.KeyguardStatusBarView}. */
public class KeyguardStatusBarViewController extends ViewController<KeyguardStatusBarView> {
private static final String TAG = "KeyguardStatusBarViewController";
@@ -119,6 +119,9 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final Object mLock = new Object();
private final KeyguardLogger mLogger;
+ private View mSystemIconsContainer;
+ private final StatusOverlayHoverListenerFactory mStatusOverlayHoverListenerFactory;
+
// TODO(b/273443374): remove
private NotificationMediaManager mNotificationMediaManager;
@@ -286,7 +289,8 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
CommandQueue commandQueue,
@Main Executor mainExecutor,
KeyguardLogger logger,
- NotificationMediaManager notificationMediaManager
+ NotificationMediaManager notificationMediaManager,
+ StatusOverlayHoverListenerFactory statusOverlayHoverListenerFactory
) {
super(view);
mCarrierTextController = carrierTextController;
@@ -339,6 +343,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
this::updateViewState
);
mNotificationMediaManager = notificationMediaManager;
+ mStatusOverlayHoverListenerFactory = statusOverlayHoverListenerFactory;
}
@Override
@@ -363,6 +368,10 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mTintedIconManager.setBlockList(getBlockedIcons());
mStatusBarIconController.addIconGroup(mTintedIconManager);
}
+ mSystemIconsContainer = mView.findViewById(R.id.system_icons);
+ StatusOverlayHoverListener hoverListener = mStatusOverlayHoverListenerFactory
+ .createDarkAwareListener(mSystemIconsContainer, mView.darkChangeFlow());
+ mSystemIconsContainer.setOnHoverListener(hoverListener);
mView.setOnApplyWindowInsetsListener(
(view, windowInsets) -> mView.updateWindowInsets(windowInsets, mInsetsProvider));
mSecureSettings.registerContentObserverForUser(
@@ -376,6 +385,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
@Override
protected void onViewDetached() {
+ mSystemIconsContainer.setOnHoverListener(null);
mConfigurationController.removeCallback(mConfigurationListener);
mAnimationScheduler.removeCallback(mAnimationCallback);
mUserInfoController.removeCallback(mOnUserInfoChangedListener);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index dc5eb0d281c3..c2dd05940864 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -35,7 +35,6 @@ import androidx.annotation.NonNull;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Dumpable;
-import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.navigationbar.NavigationModeController;
@@ -122,8 +121,10 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
NavigationModeController navModeController,
DumpManager dumpManager,
DisplayTracker displayTracker) {
- mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
- mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
+ mDarkIconColor = ctx.getColor(
+ com.android.settingslib.R.color.dark_mode_icon_color_single_tone);
+ mLightIconColor = ctx.getColor(
+ com.android.settingslib.R.color.light_mode_icon_color_single_tone);
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
mBatteryController = batteryController;
mBatteryController.addCallback(this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
index 4e136deab5e3..8c3050d48d53 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt
@@ -63,9 +63,12 @@ class PhoneStatusBarViewController private constructor(
private val userChipViewModel: StatusBarUserChipViewModel,
private val viewUtil: ViewUtil,
private val featureFlags: FeatureFlags,
- private val configurationController: ConfigurationController
+ private val configurationController: ConfigurationController,
+ private val statusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory,
) : ViewController<PhoneStatusBarView>(view) {
+ private lateinit var statusContainer: View
+
private val configurationListener = object : ConfigurationController.ConfigurationListener {
override fun onConfigChanged(newConfig: Configuration?) {
mView.updateResources()
@@ -73,6 +76,9 @@ class PhoneStatusBarViewController private constructor(
}
override fun onViewAttached() {
+ statusContainer = mView.findViewById(R.id.system_icons)
+ statusContainer.setOnHoverListener(
+ statusOverlayHoverListenerFactory.createDarkAwareListener(statusContainer))
if (moveFromCenterAnimationController == null) return
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_start_side_except_heads_up)
@@ -104,6 +110,7 @@ class PhoneStatusBarViewController private constructor(
}
override fun onViewDetached() {
+ statusContainer.setOnHoverListener(null)
progressProvider?.setReadyToHandleTransition(false)
moveFromCenterAnimationController?.onViewDetached()
configurationController.removeCallback(configurationListener)
@@ -245,6 +252,7 @@ class PhoneStatusBarViewController private constructor(
private val shadeLogger: ShadeLogger,
private val viewUtil: ViewUtil,
private val configurationController: ConfigurationController,
+ private val statusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory,
) {
fun create(
view: PhoneStatusBarView
@@ -268,7 +276,8 @@ class PhoneStatusBarViewController private constructor(
userChipViewModel,
viewUtil,
featureFlags,
- configurationController
+ configurationController,
+ statusOverlayHoverListenerFactory,
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index ec0c00e26c2f..8de213f262c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -215,8 +215,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
public void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row) {
mLogger.logStartingActivityFromClick(entry);
- if (mRemoteInputManager.isRemoteInputActive(entry)
- && !TextUtils.isEmpty(row.getActiveRemoteInputText())) {
+ if (mRemoteInputManager.isRemoteInputActive(entry)) {
// We have an active remote input typed and the user clicked on the notification.
// this was probably unintentional, so we're closing the edit text instead.
mRemoteInputManager.closeRemoteInputs();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index ad8530df0523..ecc996c57ac6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -32,6 +32,7 @@ import android.view.View;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.InitController;
import com.android.systemui.R;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import com.android.systemui.power.domain.interactor.PowerInteractor;
@@ -59,12 +60,11 @@ import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
-import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import javax.inject.Inject;
-@CentralSurfacesComponent.CentralSurfacesScope
+@SysUISingleton
class StatusBarNotificationPresenter implements NotificationPresenter, CommandQueue.Callbacks {
private static final String TAG = "StatusBarNotificationPresenter";
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt
new file mode 100644
index 000000000000..881741ae5746
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt
@@ -0,0 +1,155 @@
+/*
+ * 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.statusbar.phone
+
+import android.content.res.Configuration
+import android.content.res.Resources
+import android.graphics.Color
+import android.graphics.drawable.PaintDrawable
+import android.view.MotionEvent
+import android.view.View
+import android.view.View.OnHoverListener
+import androidx.annotation.ColorInt
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.R
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.plugins.DarkIconDispatcher
+import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange
+import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.launch
+
+class StatusOverlayHoverListenerFactory
+@Inject
+constructor(
+ @Main private val resources: Resources,
+ private val configurationController: ConfigurationController,
+ private val darkIconDispatcher: SysuiDarkIconDispatcher,
+) {
+
+ /** Creates listener always using the same light color for overlay */
+ fun createListener(view: View) =
+ StatusOverlayHoverListener(
+ view,
+ configurationController,
+ resources,
+ flowOf(HoverTheme.LIGHT),
+ )
+
+ /**
+ * Creates listener using [DarkIconDispatcher] to determine light or dark color of the overlay
+ */
+ fun createDarkAwareListener(view: View) =
+ createDarkAwareListener(view, darkIconDispatcher.darkChangeFlow())
+
+ /**
+ * Creates listener using provided [DarkChange] producer to determine light or dark color of the
+ * overlay
+ */
+ fun createDarkAwareListener(view: View, darkFlow: StateFlow<DarkChange>) =
+ StatusOverlayHoverListener(
+ view,
+ configurationController,
+ resources,
+ darkFlow.map { toHoverTheme(view, it) },
+ )
+
+ private fun toHoverTheme(view: View, darkChange: DarkChange): HoverTheme {
+ val calculatedTint = DarkIconDispatcher.getTint(darkChange.areas, view, darkChange.tint)
+ // currently calculated tint is either white or some shade of black.
+ // So checking for Color.WHITE is deterministic compared to checking for Color.BLACK.
+ // In the future checking Color.luminance() might be more appropriate.
+ return if (calculatedTint == Color.WHITE) HoverTheme.LIGHT else HoverTheme.DARK
+ }
+}
+
+/**
+ * theme of hover drawable - it's different from device theme. This theme depends on view's
+ * background and/or dark value returned from [DarkIconDispatcher]
+ */
+enum class HoverTheme {
+ LIGHT,
+ DARK
+}
+
+/**
+ * [OnHoverListener] that adds [Drawable] overlay on top of the status icons when cursor/stylus
+ * starts hovering over them and removes overlay when status icons are no longer hovered
+ */
+class StatusOverlayHoverListener(
+ view: View,
+ configurationController: ConfigurationController,
+ private val resources: Resources,
+ private val themeFlow: Flow<HoverTheme>,
+) : OnHoverListener {
+
+ @ColorInt private var darkColor: Int = 0
+ @ColorInt private var lightColor: Int = 0
+ private var cornerRadius = 0f
+
+ private var lastTheme = HoverTheme.LIGHT
+
+ val backgroundColor
+ get() = if (lastTheme == HoverTheme.LIGHT) lightColor else darkColor
+
+ init {
+ view.repeatWhenAttached {
+ lifecycleScope.launch {
+ val configurationListener =
+ object : ConfigurationListener {
+ override fun onConfigChanged(newConfig: Configuration?) {
+ updateResources()
+ }
+ }
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ configurationController.addCallback(configurationListener)
+ }
+ configurationController.removeCallback(configurationListener)
+ }
+ lifecycleScope.launch { themeFlow.collect { lastTheme = it } }
+ }
+ updateResources()
+ }
+
+ override fun onHover(v: View, event: MotionEvent): Boolean {
+ if (event.action == MotionEvent.ACTION_HOVER_ENTER) {
+ val drawable =
+ PaintDrawable(backgroundColor).apply {
+ setCornerRadius(cornerRadius)
+ setBounds(0, 0, v.width, v.height)
+ }
+ v.overlay.add(drawable)
+ } else if (event.action == MotionEvent.ACTION_HOVER_EXIT) {
+ v.overlay.clear()
+ }
+ return true
+ }
+
+ private fun updateResources() {
+ lightColor = resources.getColor(R.color.status_bar_icons_hover_color_light)
+ darkColor = resources.getColor(R.color.status_bar_icons_hover_color_dark)
+ cornerRadius = resources.getDimension(R.dimen.status_icons_hover_state_background_radius)
+ }
+}
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 bb223650facc..baf94fcba634 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -427,7 +427,8 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
// We first look for the background on the dialogContentWithBackground added by
// DialogLaunchAnimator. If it's not there, we use the background of the DecorView.
View viewWithBackground = decorView.findViewByPredicate(
- view -> view.getTag(R.id.tag_dialog_background) != null);
+ view -> view.getTag(
+ com.android.systemui.animation.R.id.tag_dialog_background) != null);
Drawable background = viewWithBackground != null ? viewWithBackground.getBackground()
: decorView.getBackground();
Insets insets = background != null ? background.getOpticalInsets() : Insets.NONE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
index d53772127601..f5e90348a7c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
@@ -16,9 +16,16 @@
package com.android.systemui.statusbar.phone;
+import android.graphics.Rect;
+
import com.android.systemui.Dumpable;
import com.android.systemui.plugins.DarkIconDispatcher;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import kotlinx.coroutines.flow.StateFlow;
+
/**
* Dispatches events to {@link DarkReceiver}s about changes in darkness, tint area
* and dark intensity.
@@ -29,4 +36,26 @@ public interface SysuiDarkIconDispatcher extends DarkIconDispatcher, Dumpable {
* @return LightBarTransitionsController
*/
LightBarTransitionsController getTransitionsController();
+
+ /**
+ * Flow equivalent of registering {@link DarkReceiver} using
+ * {@link DarkIconDispatcher#addDarkReceiver(DarkReceiver)}
+ */
+ StateFlow<DarkChange> darkChangeFlow();
+
+ /** Model for {@link #darkChangeFlow()} */
+ class DarkChange {
+
+ public static final DarkChange EMPTY = new DarkChange(new ArrayList<>(), 0, 0);
+
+ public DarkChange(Collection<Rect> areas, float darkIntensity, int tint) {
+ this.areas = areas;
+ this.darkIntensity = darkIntensity;
+ this.tint = tint;
+ }
+
+ public final Collection<Rect> areas;
+ public final float darkIntensity;
+ public final int tint;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
index e77f419f74e1..3a3663d4d6c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/CentralSurfacesComponent.java
@@ -22,13 +22,11 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.android.systemui.scene.ui.view.WindowRootView;
import com.android.systemui.shade.ShadeHeaderController;
-import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks;
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
import com.android.systemui.statusbar.phone.StatusBarHeadsUpChangeListener;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarterModule;
-import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import dagger.Subcomponent;
@@ -51,7 +49,6 @@ import javax.inject.Scope;
@Subcomponent(modules = {
StatusBarViewModule.class,
StatusBarNotificationActivityStarterModule.class,
- StatusBarNotificationPresenterModule.class,
})
@CentralSurfacesComponent.CentralSurfacesScope
public interface CentralSurfacesComponent {
@@ -97,6 +94,4 @@ public interface CentralSurfacesComponent {
CollapsedStatusBarFragment createCollapsedStatusBarFragment();
NotificationActivityStarter getNotificationActivityStarter();
-
- NotificationPresenter getNotificationPresenter();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
index 0e99c67a0d80..e1fd37f558ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
@@ -19,6 +19,8 @@ package com.android.systemui.statusbar.pipeline.dagger
import android.net.wifi.WifiManager
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.log.table.TableLogBuffer
@@ -48,9 +50,12 @@ import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStat
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStatusBarViewModelImpl
import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryDagger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositorySwitcher
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryViaTrackerLibDagger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.DisabledWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryViaTrackerLib
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
import dagger.Binds
@@ -114,14 +119,19 @@ abstract class StatusBarPipelineModule {
impl: CollapsedStatusBarViewBinderImpl
): CollapsedStatusBarViewBinder
+ @Binds
+ @IntoMap
+ @ClassKey(WifiRepositoryDagger::class)
+ abstract fun bindWifiRepositoryDagger(impl: WifiRepositoryDagger): CoreStartable
+
companion object {
@Provides
@SysUISingleton
- fun provideRealWifiRepository(
+ fun provideWifiRepositoryDagger(
wifiManager: WifiManager?,
disabledWifiRepository: DisabledWifiRepository,
wifiRepositoryImplFactory: WifiRepositoryImpl.Factory,
- ): RealWifiRepository {
+ ): WifiRepositoryDagger {
// If we have a null [WifiManager], then the wifi repository should be permanently
// disabled.
return if (wifiManager == null) {
@@ -133,6 +143,36 @@ abstract class StatusBarPipelineModule {
@Provides
@SysUISingleton
+ fun provideWifiRepositoryViaTrackerLibDagger(
+ wifiManager: WifiManager?,
+ disabledWifiRepository: DisabledWifiRepository,
+ wifiRepositoryFromTrackerLibFactory: WifiRepositoryViaTrackerLib.Factory,
+ ): WifiRepositoryViaTrackerLibDagger {
+ // If we have a null [WifiManager], then the wifi repository should be permanently
+ // disabled.
+ return if (wifiManager == null) {
+ disabledWifiRepository
+ } else {
+ wifiRepositoryFromTrackerLibFactory.create(wifiManager)
+ }
+ }
+
+ @Provides
+ @SysUISingleton
+ fun provideRealWifiRepository(
+ wifiRepository: WifiRepositoryDagger,
+ wifiRepositoryFromTrackerLib: WifiRepositoryViaTrackerLibDagger,
+ flags: FeatureFlags,
+ ): RealWifiRepository {
+ return if (flags.isEnabled(Flags.WIFI_TRACKER_LIB_FOR_WIFI_ICON)) {
+ wifiRepositoryFromTrackerLib
+ } else {
+ wifiRepository
+ }
+ }
+
+ @Provides
+ @SysUISingleton
@Named(FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON)
fun provideFirstMobileSubShowingNetworkTypeIconProvider(
mobileIconsViewModel: MobileIconsViewModel,
@@ -151,6 +191,14 @@ abstract class StatusBarPipelineModule {
@Provides
@SysUISingleton
+ @WifiTrackerLibInputLog
+ fun provideWifiTrackerLibInputLogBuffer(factory: LogBufferFactory): LogBuffer {
+ // WifiTrackerLib is pretty noisy, so give it more room than WifiInputLog.
+ return factory.create("WifiTrackerLibInputLog", 200)
+ }
+
+ @Provides
+ @SysUISingleton
@WifiTableLog
fun provideWifiTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
return factory.create("WifiTableLog", 100)
@@ -158,6 +206,13 @@ abstract class StatusBarPipelineModule {
@Provides
@SysUISingleton
+ @WifiTrackerLibTableLog
+ fun provideWifiTrackerLibTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
+ return factory.create("WifiTrackerLibTableLog", 100)
+ }
+
+ @Provides
+ @SysUISingleton
@AirplaneTableLog
fun provideAirplaneTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
return factory.create("AirplaneTableLog", 30)
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/TonePolarity.java b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibInputLog.kt
index bb5649ca3c4e..b84b01e66955 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/TonePolarity.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibInputLog.kt
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package com.android.systemui.monet.dynamiccolor;
+package com.android.systemui.statusbar.pipeline.dagger
-/** Describes the relationship in lightness between two colors. */
-public enum TonePolarity {
- DARKER,
- LIGHTER,
- NO_PREFERENCE;
-}
+import javax.inject.Qualifier
+
+/** Wifi logs for inputs into [WifiRepositoryViaTrackerLib]. */
+@Qualifier
+@MustBeDocumented
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+annotation class WifiTrackerLibInputLog
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/Quantizer.java b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibTableLog.kt
index 136e5a55c191..7ca70308361d 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/Quantizer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/WifiTrackerLibTableLog.kt
@@ -14,8 +14,12 @@
* limitations under the License.
*/
-package com.android.systemui.monet.quantize;
+package com.android.systemui.statusbar.pipeline.dagger
-interface Quantizer {
- QuantizerResult quantize(int[] pixels, int maxColors);
-}
+import javax.inject.Qualifier
+
+/** Wifi logs from [WifiRepositoryViaTrackerLib] in table format. */
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class WifiTrackerLibTableLog
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt
index f800cf496ca9..b11b4727c3c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.pipeline.wifi.data.repository
+import com.android.systemui.CoreStartable
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import kotlinx.coroutines.flow.StateFlow
@@ -42,6 +43,13 @@ interface WifiRepository {
val currentNetwork = wifiNetwork.value
return currentNetwork is WifiNetworkModel.Active && currentNetwork.hasValidSsid()
}
+
+ companion object {
+ /** Column name to use for [isWifiEnabled] for table logging. */
+ const val COL_NAME_IS_ENABLED = "isEnabled"
+ /** Column name to use for [isWifiDefault] for table logging. */
+ const val COL_NAME_IS_DEFAULT = "isDefault"
+ }
}
/**
@@ -53,3 +61,8 @@ interface WifiRepository {
* repository.
*/
interface RealWifiRepository : WifiRepository
+
+/** Used only by Dagger to bind [WifiRepositoryImpl]. */
+interface WifiRepositoryDagger : RealWifiRepository, CoreStartable
+/** Used only by Dagger to bind [WifiRepositoryViaTrackerLib]. */
+interface WifiRepositoryViaTrackerLibDagger : RealWifiRepository
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepository.kt
index 86a668a2e842..9ed7c6a83cee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepository.kt
@@ -18,7 +18,8 @@ package com.android.systemui.statusbar.pipeline.wifi.data.repository.prod
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
-import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryDagger
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryViaTrackerLibDagger
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
@@ -32,7 +33,10 @@ import kotlinx.coroutines.flow.asStateFlow
* wifi information.
*/
@SysUISingleton
-class DisabledWifiRepository @Inject constructor() : RealWifiRepository {
+class DisabledWifiRepository @Inject constructor() :
+ WifiRepositoryDagger, WifiRepositoryViaTrackerLibDagger {
+ override fun start() {}
+
override val isWifiEnabled: StateFlow<Boolean> = MutableStateFlow(false).asStateFlow()
override val isWifiDefault: StateFlow<Boolean> = MutableStateFlow(false).asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImpl.kt
index 7f35dfbe2700..995de6d2fc61 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImpl.kt
@@ -43,8 +43,10 @@ import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityMod
import com.android.systemui.statusbar.pipeline.shared.data.model.toWifiDataActivityModel
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl.Companion.getMainOrUnderlyingWifiInfo
-import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository.Companion.COL_NAME_IS_DEFAULT
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository.Companion.COL_NAME_IS_ENABLED
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryDagger
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiInputLogger
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import java.util.concurrent.Executor
@@ -64,6 +66,7 @@ import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/** Real implementation of [WifiRepository]. */
@@ -81,9 +84,21 @@ constructor(
@WifiTableLog wifiTableLogBuffer: TableLogBuffer,
@Main mainExecutor: Executor,
@Background private val bgDispatcher: CoroutineDispatcher,
- @Application scope: CoroutineScope,
+ @Application private val scope: CoroutineScope,
private val wifiManager: WifiManager,
-) : RealWifiRepository {
+) : WifiRepositoryDagger {
+
+ override fun start() {
+ // There are two possible [WifiRepository] implementations: This class (old) and
+ // [WifiRepositoryFromTrackerLib] (new). While we migrate to the new class, we want this old
+ // class to still be running in the background so that we can collect logs and compare
+ // discrepancies. This #start method collects on the flows to ensure that the logs are
+ // collected.
+ scope.launch { isWifiEnabled.collect {} }
+ scope.launch { isWifiDefault.collect {} }
+ scope.launch { wifiNetwork.collect {} }
+ scope.launch { wifiActivity.collect {} }
+ }
private val wifiStateChangeEvents: Flow<Unit> =
broadcastDispatcher
@@ -104,7 +119,7 @@ constructor(
.logDiffsForTable(
wifiTableLogBuffer,
columnPrefix = "",
- columnName = "isEnabled",
+ columnName = COL_NAME_IS_ENABLED,
initialValue = false,
)
.stateIn(
@@ -125,7 +140,7 @@ constructor(
.logDiffsForTable(
wifiTableLogBuffer,
columnPrefix = "",
- columnName = "isDefault",
+ columnName = COL_NAME_IS_DEFAULT,
initialValue = false,
)
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
@@ -234,6 +249,8 @@ constructor(
// NetworkCallback inside [wifiNetwork] for our wifi network information.
val WIFI_NETWORK_DEFAULT = WifiNetworkModel.Inactive
+ const val WIFI_STATE_DEFAULT = WifiManager.WIFI_STATE_DISABLED
+
private fun createWifiNetworkModel(
wifiInfo: WifiInfo,
network: Network,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLib.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLib.kt
new file mode 100644
index 000000000000..127136789ba6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLib.kt
@@ -0,0 +1,295 @@
+/*
+ * 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.statusbar.pipeline.wifi.data.repository.prod
+
+import android.net.wifi.WifiManager
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.log.table.logDiffsForTable
+import com.android.systemui.statusbar.connectivity.WifiPickerTrackerFactory
+import com.android.systemui.statusbar.pipeline.dagger.WifiTrackerLibInputLog
+import com.android.systemui.statusbar.pipeline.dagger.WifiTrackerLibTableLog
+import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository.Companion.COL_NAME_IS_DEFAULT
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository.Companion.COL_NAME_IS_ENABLED
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryViaTrackerLibDagger
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl.Companion.WIFI_STATE_DEFAULT
+import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
+import com.android.wifitrackerlib.MergedCarrierEntry
+import com.android.wifitrackerlib.WifiEntry
+import com.android.wifitrackerlib.WifiPickerTracker
+import java.util.concurrent.Executor
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
+
+/**
+ * An implementation of [WifiRepository] that uses [com.android.wifitrackerlib] as the source of
+ * truth for wifi information.
+ *
+ * Serves as a possible replacement for [WifiRepositoryImpl]. See b/292534484.
+ */
+@SysUISingleton
+class WifiRepositoryViaTrackerLib
+@Inject
+constructor(
+ @Application private val scope: CoroutineScope,
+ @Main private val mainExecutor: Executor,
+ private val wifiPickerTrackerFactory: WifiPickerTrackerFactory,
+ private val wifiManager: WifiManager,
+ @WifiTrackerLibInputLog private val inputLogger: LogBuffer,
+ @WifiTrackerLibTableLog private val wifiTrackerLibTableLogBuffer: TableLogBuffer,
+) : WifiRepositoryViaTrackerLibDagger, LifecycleOwner {
+
+ override val lifecycle =
+ LifecycleRegistry(this).also {
+ mainExecutor.execute { it.currentState = Lifecycle.State.CREATED }
+ }
+
+ private var wifiPickerTracker: WifiPickerTracker? = null
+
+ private val wifiPickerTrackerInfo: StateFlow<WifiPickerTrackerInfo> = run {
+ var current =
+ WifiPickerTrackerInfo(
+ state = WIFI_STATE_DEFAULT,
+ isDefault = false,
+ network = WIFI_NETWORK_DEFAULT,
+ )
+ callbackFlow {
+ val callback =
+ object : WifiPickerTracker.WifiPickerTrackerCallback {
+ override fun onWifiEntriesChanged() {
+ val connectedEntry = wifiPickerTracker?.connectedWifiEntry
+ logOnWifiEntriesChanged(connectedEntry)
+
+ // [WifiPickerTracker.connectedWifiEntry] will return the same instance
+ // but with updated internals. For example, when its validation status
+ // changes from false to true, the same instance is re-used but with the
+ // validated field updated.
+ //
+ // Because it's the same instance, the flow won't re-emit the value
+ // (even though the internals have changed). So, we need to transform it
+ // into our internal model immediately. [toWifiNetworkModel] always
+ // returns a new instance, so the flow is guaranteed to emit.
+ send(
+ newNetwork = connectedEntry?.toWifiNetworkModel()
+ ?: WIFI_NETWORK_DEFAULT,
+ newIsDefault = connectedEntry?.isDefaultNetwork ?: false,
+ )
+ }
+
+ override fun onWifiStateChanged() {
+ val state = wifiPickerTracker?.wifiState
+ logOnWifiStateChanged(state)
+ send(newState = state ?: WIFI_STATE_DEFAULT)
+ }
+
+ override fun onNumSavedNetworksChanged() {}
+
+ override fun onNumSavedSubscriptionsChanged() {}
+
+ private fun send(
+ newState: Int = current.state,
+ newIsDefault: Boolean = current.isDefault,
+ newNetwork: WifiNetworkModel = current.network,
+ ) {
+ val new = WifiPickerTrackerInfo(newState, newIsDefault, newNetwork)
+ current = new
+ trySend(new)
+ }
+ }
+
+ // TODO(b/292591403): [WifiPickerTrackerFactory] currently scans to see all
+ // available wifi networks every 10s. Because SysUI only needs to display the
+ // **connected** network, we don't need scans to be running. We should disable these
+ // scans (ideal) or at least run them very infrequently.
+ wifiPickerTracker = wifiPickerTrackerFactory.create(lifecycle, callback)
+ // The lifecycle must be STARTED in order for the callback to receive events.
+ mainExecutor.execute { lifecycle.currentState = Lifecycle.State.STARTED }
+ awaitClose {
+ mainExecutor.execute { lifecycle.currentState = Lifecycle.State.CREATED }
+ }
+ }
+ // TODO(b/292534484): Update to Eagerly once scans are disabled. (Here and other flows)
+ .stateIn(scope, SharingStarted.WhileSubscribed(), current)
+ }
+
+ override val isWifiEnabled: StateFlow<Boolean> =
+ wifiPickerTrackerInfo
+ .map { it.state == WifiManager.WIFI_STATE_ENABLED }
+ .distinctUntilChanged()
+ .logDiffsForTable(
+ wifiTrackerLibTableLogBuffer,
+ columnPrefix = "",
+ columnName = COL_NAME_IS_ENABLED,
+ initialValue = false,
+ )
+ .stateIn(scope, SharingStarted.WhileSubscribed(), false)
+
+ override val wifiNetwork: StateFlow<WifiNetworkModel> =
+ wifiPickerTrackerInfo
+ .map { it.network }
+ .distinctUntilChanged()
+ .logDiffsForTable(
+ wifiTrackerLibTableLogBuffer,
+ columnPrefix = "",
+ initialValue = WIFI_NETWORK_DEFAULT,
+ )
+ .stateIn(scope, SharingStarted.WhileSubscribed(), WIFI_NETWORK_DEFAULT)
+
+ /** Converts WifiTrackerLib's [WifiEntry] into our internal model. */
+ private fun WifiEntry.toWifiNetworkModel(): WifiNetworkModel {
+ if (!this.isPrimaryNetwork) {
+ return WIFI_NETWORK_DEFAULT
+ }
+ return if (this is MergedCarrierEntry) {
+ WifiNetworkModel.CarrierMerged(
+ networkId = NETWORK_ID,
+ // TODO(b/292534484): Fetch the real subscription ID from [MergedCarrierEntry].
+ subscriptionId = TEMP_SUB_ID,
+ level = this.level,
+ // WifiManager APIs to calculate the signal level start from 0, so
+ // maxSignalLevel + 1 represents the total level buckets count.
+ numberOfLevels = wifiManager.maxSignalLevel + 1,
+ )
+ } else {
+ WifiNetworkModel.Active(
+ networkId = NETWORK_ID,
+ isValidated = this.hasInternetAccess(),
+ level = this.level,
+ ssid = this.ssid,
+ // TODO(b/292534484): Fetch the real values from [WifiEntry] (#getTitle might be
+ // appropriate).
+ isPasspointAccessPoint = false,
+ isOnlineSignUpForPasspointAccessPoint = false,
+ passpointProviderFriendlyName = null,
+ )
+ }
+ }
+
+ override val isWifiDefault: StateFlow<Boolean> =
+ wifiPickerTrackerInfo
+ .map { it.isDefault }
+ .distinctUntilChanged()
+ .logDiffsForTable(
+ wifiTrackerLibTableLogBuffer,
+ columnPrefix = "",
+ columnName = COL_NAME_IS_DEFAULT,
+ initialValue = false,
+ )
+ .stateIn(scope, SharingStarted.WhileSubscribed(), false)
+
+ // TODO(b/292534484): Re-use WifiRepositoryImpl code to implement wifi activity since
+ // WifiTrackerLib doesn't expose activity details.
+ override val wifiActivity: StateFlow<DataActivityModel> =
+ MutableStateFlow(DataActivityModel(false, false))
+
+ private fun logOnWifiEntriesChanged(connectedEntry: WifiEntry?) {
+ inputLogger.log(
+ TAG,
+ LogLevel.DEBUG,
+ { str1 = connectedEntry.toString() },
+ { "onWifiEntriesChanged. ConnectedEntry=$str1" },
+ )
+ }
+
+ private fun logOnWifiStateChanged(state: Int?) {
+ inputLogger.log(
+ TAG,
+ LogLevel.DEBUG,
+ { int1 = state ?: -1 },
+ { "onWifiStateChanged. State=${if (int1 == -1) null else int1}" },
+ )
+ }
+
+ /**
+ * Data class storing all the information fetched from [WifiPickerTracker].
+ *
+ * Used so that we only register a single callback on [WifiPickerTracker].
+ */
+ data class WifiPickerTrackerInfo(
+ /** The current wifi state. See [WifiManager.getWifiState]. */
+ val state: Int,
+ /** True if wifi is currently the default connection and false otherwise. */
+ val isDefault: Boolean,
+ /** The currently primary wifi network. */
+ val network: WifiNetworkModel,
+ )
+
+ @SysUISingleton
+ class Factory
+ @Inject
+ constructor(
+ @Application private val scope: CoroutineScope,
+ @Main private val mainExecutor: Executor,
+ private val wifiPickerTrackerFactory: WifiPickerTrackerFactory,
+ @WifiTrackerLibInputLog private val inputLogger: LogBuffer,
+ @WifiTrackerLibTableLog private val wifiTrackerLibTableLogBuffer: TableLogBuffer,
+ ) {
+ fun create(wifiManager: WifiManager): WifiRepositoryViaTrackerLib {
+ return WifiRepositoryViaTrackerLib(
+ scope,
+ mainExecutor,
+ wifiPickerTrackerFactory,
+ wifiManager,
+ inputLogger,
+ wifiTrackerLibTableLogBuffer,
+ )
+ }
+ }
+
+ companion object {
+ private const val TAG = "WifiTrackerLibInputLog"
+
+ /**
+ * [WifiNetworkModel.Active.networkId] is only used at the repository layer. It's used by
+ * [WifiRepositoryImpl], which tracks the ID in order to correctly apply the framework
+ * callbacks within the repository.
+ *
+ * Since this class does not need to manually apply framework callbacks and since the
+ * network ID is not used beyond the repository, it's safe to use an invalid ID in this
+ * repository.
+ *
+ * The [WifiNetworkModel.Active.networkId] field should be deleted once we've fully migrated
+ * to [WifiRepositoryViaTrackerLib].
+ */
+ private const val NETWORK_ID = -1
+
+ /**
+ * A temporary subscription ID until WifiTrackerLib exposes a method to fetch the
+ * subscription ID.
+ *
+ * Use -2 because [SubscriptionManager.INVALID_SUBSCRIPTION_ID] is -1.
+ */
+ private const val TEMP_SUB_ID = -2
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
index c8ee647cf8a8..880e0d2eef31 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java
@@ -319,7 +319,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout>
drawable = new CircleFramedDrawable(mCurrentUser.picture, avatarSize);
}
- Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg);
drawable = new LayerDrawable(new Drawable[]{bg, drawable});
return drawable;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
index 66b52563c0a9..2d04ffa9e624 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java
@@ -534,7 +534,7 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS
}
drawable.setTint(mResources.getColor(iconColorRes, mContext.getTheme()));
- Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg);
+ Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg);
drawable = new LayerDrawable(new Drawable[]{bg, drawable});
return drawable;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
index e1a7b6d59f41..c2a8e701653a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java
@@ -29,6 +29,7 @@ import com.android.systemui.statusbar.connectivity.AccessPointController;
import com.android.systemui.statusbar.connectivity.AccessPointControllerImpl;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.NetworkControllerImpl;
+import com.android.systemui.statusbar.connectivity.WifiPickerTrackerFactory;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.BluetoothControllerImpl;
@@ -165,7 +166,7 @@ public interface StatusBarPolicyModule {
UserManager userManager,
UserTracker userTracker,
@Main Executor mainExecutor,
- AccessPointControllerImpl.WifiPickerTrackerFactory wifiPickerTrackerFactory
+ WifiPickerTrackerFactory wifiPickerTrackerFactory
) {
AccessPointControllerImpl controller = new AccessPointControllerImpl(
userManager,
diff --git a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt
index ae4820837ce5..eef66b6bd4af 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt
@@ -17,8 +17,8 @@
package com.android.systemui.theme
import android.util.Pair
-import com.android.systemui.monet.dynamiccolor.DynamicColor
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors
+import com.google.ux.material.libmonet.dynamiccolor.DynamicColor
+import com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors
class DynamicColors {
companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index b78329cfa5aa..06f68c6ee103 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -74,21 +74,22 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.monet.ColorScheme;
import com.android.systemui.monet.Style;
import com.android.systemui.monet.TonalPalette;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.DynamicScheme;
-import com.android.systemui.monet.scheme.SchemeExpressive;
-import com.android.systemui.monet.scheme.SchemeFruitSalad;
-import com.android.systemui.monet.scheme.SchemeMonochrome;
-import com.android.systemui.monet.scheme.SchemeNeutral;
-import com.android.systemui.monet.scheme.SchemeRainbow;
-import com.android.systemui.monet.scheme.SchemeTonalSpot;
-import com.android.systemui.monet.scheme.SchemeVibrant;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.util.settings.SecureSettings;
+import com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors;
+import com.google.ux.material.libmonet.hct.Hct;
+import com.google.ux.material.libmonet.scheme.DynamicScheme;
+import com.google.ux.material.libmonet.scheme.SchemeExpressive;
+import com.google.ux.material.libmonet.scheme.SchemeFruitSalad;
+import com.google.ux.material.libmonet.scheme.SchemeMonochrome;
+import com.google.ux.material.libmonet.scheme.SchemeNeutral;
+import com.google.ux.material.libmonet.scheme.SchemeRainbow;
+import com.google.ux.material.libmonet.scheme.SchemeTonalSpot;
+import com.google.ux.material.libmonet.scheme.SchemeVibrant;
+
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index 32ecb6786a51..ecaf7921a4df 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -61,7 +61,7 @@ public class TunerActivity extends Activity implements
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setTheme(R.style.Theme_AppCompat_DayNight);
+ setTheme(androidx.appcompat.R.style.Theme_AppCompat_DayNight);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
requestWindowFeature(Window.FEATURE_NO_TITLE);
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
index 4d506f0b5d5e..a3e648d4fb1b 100644
--- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
@@ -776,7 +776,9 @@ constructor(
userId: Int,
): Drawable {
if (isGuest) {
- return checkNotNull(applicationContext.getDrawable(R.drawable.ic_account_circle))
+ return checkNotNull(
+ applicationContext.getDrawable(com.android.settingslib.R.drawable.ic_account_circle)
+ )
}
// TODO(b/246631653): cache the bitmaps to avoid the background work to fetch them.
diff --git a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
index e74232df3ac3..00ca92dacee1 100644
--- a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt
@@ -42,13 +42,13 @@ object LegacyUserUiHelper {
isManageUsers: Boolean,
): Int {
return if (isAddUser && isTablet) {
- R.drawable.ic_account_circle_filled
+ com.android.settingslib.R.drawable.ic_account_circle_filled
} else if (isAddUser) {
R.drawable.ic_add
} else if (isGuest) {
- R.drawable.ic_account_circle
+ com.android.settingslib.R.drawable.ic_account_circle
} else if (isAddSupervisedUser) {
- R.drawable.ic_add_supervised_user
+ com.android.settingslib.R.drawable.ic_add_supervised_user
} else if (isManageUsers) {
R.drawable.ic_manage_users
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
index afd72e7ed1be..aeed5fc59281 100644
--- a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt
@@ -128,7 +128,7 @@ constructor(
viewKey = model.id,
name =
if (model.isGuest && model.isSelected) {
- Text.Resource(R.string.guest_exit_quick_settings_button)
+ Text.Resource(com.android.settingslib.R.string.guest_exit_quick_settings_button)
} else {
model.name
},
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index 2efeda932ff3..904a98b5e54d 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -112,7 +112,7 @@ public class NotificationChannels implements CoreStartable {
// priority, so it can be shown in all times.
nm.createNotificationChannel(new NotificationChannel(
TVPIP,
- context.getString(R.string.notification_channel_tv_pip),
+ context.getString(com.android.wm.shell.R.string.notification_channel_tv_pip),
NotificationManager.IMPORTANCE_MAX));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 87b2697611d2..5f0f7b8c223a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -1807,8 +1807,10 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
if (!ss.dynamic) continue;
mDynamic.put(stream, true);
if (findRow(stream) == null) {
- addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true,
- false, true);
+ addRow(stream,
+ com.android.settingslib.R.drawable.ic_volume_remote,
+ com.android.settingslib.R.drawable.ic_volume_remote_mute,
+ true, false, true);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
index d2142dcfb2b4..e5c55b0a5e7f 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java
@@ -48,8 +48,10 @@ final class DotIndicatorDecoration extends RecyclerView.ItemDecoration {
R.dimen.card_carousel_dot_selected_radius);
mDotMargin = context.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_margin);
- mUnselectedColor = context.getColor(R.color.material_dynamic_neutral70);
- mSelectedColor = context.getColor(R.color.material_dynamic_neutral100);
+ mUnselectedColor = context.getColor(
+ com.google.android.material.R.color.material_dynamic_neutral70);
+ mSelectedColor = context.getColor(
+ com.google.android.material.R.color.material_dynamic_neutral100);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
index d03148cee335..2491e2bdd623 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java
@@ -278,7 +278,7 @@ public class WalletActivity extends ComponentActivity implements
private Drawable getHomeIndicatorDrawable() {
Drawable drawable = getDrawable(R.drawable.ic_close);
- drawable.setTint(getColor(R.color.material_dynamic_neutral70));
+ drawable.setTint(getColor(com.google.android.material.R.color.material_dynamic_neutral70));
return drawable;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
index 36cdfe642874..11ad20672100 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
@@ -775,7 +775,7 @@ public class WindowMagnificationControllerTest extends SysuiTestCase {
final View mirrorView = mWindowManager.getAttachedView();
- final long timeout = SystemClock.uptimeMillis() + 1000;
+ final long timeout = SystemClock.uptimeMillis() + 5000;
final AtomicDouble maxScaleX = new AtomicDouble();
final Runnable onAnimationFrame = new Runnable() {
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
index 3169b091217b..2b08c66c96fa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
@@ -840,6 +840,27 @@ class SideFpsControllerTest : SysuiTestCase() {
assertThat((lpFlags and PRIVATE_FLAG_TRUSTED_OVERLAY) != 0).isTrue()
}
+
+ @Test
+ fun primaryBouncerRequestAnimatesAlphaIn() = testWithDisplay {
+ sideFpsController.show(SideFpsUiRequestSource.PRIMARY_BOUNCER, REASON_AUTH_KEYGUARD)
+ executor.runAllReady()
+ verify(sideFpsView).animate()
+ }
+
+ @Test
+ fun alternateBouncerRequestsDoesNotAnimateAlphaIn() = testWithDisplay {
+ sideFpsController.show(SideFpsUiRequestSource.ALTERNATE_BOUNCER, REASON_AUTH_KEYGUARD)
+ executor.runAllReady()
+ verify(sideFpsView, never()).animate()
+ }
+
+ @Test
+ fun autoShowRequestsDoesNotAnimateAlphaIn() = testWithDisplay {
+ sideFpsController.show(SideFpsUiRequestSource.AUTO_SHOW, REASON_AUTH_KEYGUARD)
+ executor.runAllReady()
+ verify(sideFpsView, never()).animate()
+ }
}
private fun insetsForSmallNavbar() = insetsWithBottom(60)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
index 2830476874ed..840eb468b8c2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt
@@ -26,10 +26,6 @@ import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.google.common.truth.Truth.assertThat
-import java.io.FileDescriptor
-import java.io.PrintWriter
-import java.io.StringWriter
-import javax.inject.Provider
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
@@ -37,6 +33,10 @@ import org.mockito.Mockito.anyInt
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
+import java.io.FileDescriptor
+import java.io.PrintWriter
+import java.io.StringWriter
+import javax.inject.Provider
@SmallTest
class DumpHandlerTest : SysuiTestCase() {
@@ -79,14 +79,12 @@ class DumpHandlerTest : SysuiTestCase() {
fun setUp() {
MockitoAnnotations.initMocks(this)
- dumpHandler = DumpHandler(
- mContext,
- dumpManager,
- logBufferEulogizer,
- mutableMapOf(
- EmptyCoreStartable::class.java to Provider { EmptyCoreStartable() }
- ),
+ val config = SystemUIConfigDumpable(
+ dumpManager,
+ mContext,
+ mutableMapOf(EmptyCoreStartable::class.java to Provider { EmptyCoreStartable() }),
)
+ dumpHandler = DumpHandler(dumpManager, logBufferEulogizer, config)
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
index 07caf5983311..e8542aad9cd2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
@@ -293,24 +293,6 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() {
}
@Test
- fun quickAffordance_hiddenWhenQuickSettingsIsVisible() =
- testScope.runTest {
- repository.setQuickSettingsVisible(true)
- quickAccessWallet.setState(
- KeyguardQuickAffordanceConfig.LockScreenState.Visible(
- icon = ICON,
- )
- )
-
- val collectedValue =
- collectLastValue(
- underTest.quickAffordance(KeyguardQuickAffordancePosition.BOTTOM_END)
- )
-
- assertThat(collectedValue()).isEqualTo(KeyguardQuickAffordanceModel.Hidden)
- }
-
- @Test
fun quickAffordance_hiddenWhenUserIsInLockdownMode() =
testScope.runTest {
biometricSettingsRepository.setIsUserInLockdown(true)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
index 6e52d1af7eb1..baa5ee81cc4a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt
@@ -233,12 +233,12 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() {
// ERROR message
fingerprintAuthRepository.setAuthenticationStatus(
ErrorFingerprintAuthenticationStatus(
- FingerprintManager.FINGERPRINT_ERROR_LOCKOUT,
+ FingerprintManager.FINGERPRINT_ERROR_CANCELED,
"testError",
)
)
assertThat(message?.source).isEqualTo(BiometricSourceType.FINGERPRINT)
- assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_LOCKOUT)
+ assertThat(message?.id).isEqualTo(FingerprintManager.FINGERPRINT_ERROR_CANCELED)
assertThat(message?.message).isEqualTo("testError")
assertThat(message?.type).isEqualTo(BiometricMessageType.ERROR)
@@ -262,6 +262,34 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() {
assertThat(message?.type).isEqualTo(BiometricMessageType.FAIL)
}
+ @Test
+ fun message_fpError_lockoutFilteredOut() =
+ testScope.runTest {
+ val message by collectLastValue(underTest.message)
+
+ givenOnOccludingApp(true)
+ givenPrimaryAuthRequired(false)
+ runCurrent()
+
+ // permanent lockout error message
+ fingerprintAuthRepository.setAuthenticationStatus(
+ ErrorFingerprintAuthenticationStatus(
+ FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT,
+ "testPermanentLockoutMessageFiltered",
+ )
+ )
+ assertThat(message).isNull()
+
+ // temporary lockout error message
+ fingerprintAuthRepository.setAuthenticationStatus(
+ ErrorFingerprintAuthenticationStatus(
+ FingerprintManager.FINGERPRINT_ERROR_LOCKOUT,
+ "testLockoutMessageFiltered",
+ )
+ )
+ assertThat(message).isNull()
+ }
+
private fun givenOnOccludingApp(isOnOccludingApp: Boolean) {
keyguardRepository.setKeyguardOccluded(isOnOccludingApp)
keyguardRepository.setKeyguardShowing(isOnOccludingApp)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayoutTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayoutTest.kt
index 2e97208e44de..c771356a741e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayoutTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/DefaultLockscreenLayoutTest.kt
@@ -26,8 +26,10 @@ import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.AuthController
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.ui.view.KeyguardRootView
-import com.android.systemui.monet.utils.ArgbSubject.assertThat
+import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -42,9 +44,10 @@ class DefaultLockscreenLayoutTest : SysuiTestCase() {
private lateinit var defaultLockscreenLayout: DefaultLockscreenLayout
private lateinit var rootView: KeyguardRootView
@Mock private lateinit var authController: AuthController
- @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
@Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var windowManager: WindowManager
+ @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
+
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
index dff0f2909126..34d93fc8788e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
@@ -20,6 +20,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.doze.util.BurnInHelperWrapper
+import com.android.systemui.flags.FeatureFlags
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
@@ -45,6 +46,8 @@ import org.mockito.MockitoAnnotations
class KeyguardIndicationAreaViewModelTest : SysuiTestCase() {
@Mock private lateinit var burnInHelperWrapper: BurnInHelperWrapper
+ @Mock private lateinit var shortcutsCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel
+ @Mock private lateinit var featureFlags: FeatureFlags
private lateinit var underTest: KeyguardIndicationAreaViewModel
private lateinit var repository: FakeKeyguardRepository
@@ -83,6 +86,8 @@ class KeyguardIndicationAreaViewModelTest : SysuiTestCase() {
bottomAreaInteractor = KeyguardBottomAreaInteractor(repository = repository),
keyguardBottomAreaViewModel = bottomAreaViewModel,
burnInHelperWrapper = burnInHelperWrapper,
+ shortcutsCombinedViewModel = shortcutsCombinedViewModel,
+ featureFlags = featureFlags,
)
}
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
new file mode 100644
index 000000000000..ef38d54dc42f
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
@@ -0,0 +1,681 @@
+/*
+ * 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 android.app.admin.DevicePolicyManager
+import android.content.Intent
+import android.os.UserHandle
+import androidx.test.filters.SmallTest
+import com.android.internal.widget.LockPatternUtils
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogLaunchAnimator
+import com.android.systemui.animation.Expandable
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.dock.DockManagerFake
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.quickaffordance.BuiltInKeyguardQuickAffordanceKeys
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceProviderClientFactory
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLegacySettingSyncer
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceLocalUserSelectionManager
+import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceRemoteUserSelectionManager
+import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
+import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.settings.UserFileManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
+import com.android.systemui.statusbar.policy.KeyguardStateController
+import com.android.systemui.util.FakeSharedPreferences
+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 kotlinx.coroutines.flow.map
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.*
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentMatchers
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.MockitoAnnotations
+import kotlin.math.max
+import kotlin.math.min
+
+@SmallTest
+@RunWith(JUnit4::class)
+class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
+
+ @Mock private lateinit var activityStarter: ActivityStarter
+ @Mock private lateinit var devicePolicyManager: DevicePolicyManager
+ @Mock private lateinit var expandable: Expandable
+ @Mock private lateinit var userTracker: UserTracker
+ @Mock private lateinit var lockPatternUtils: LockPatternUtils
+ @Mock private lateinit var keyguardStateController: KeyguardStateController
+ @Mock private lateinit var launchAnimator: DialogLaunchAnimator
+ @Mock private lateinit var logger: KeyguardQuickAffordancesMetricsLogger
+
+ private lateinit var underTest: KeyguardQuickAffordancesCombinedViewModel
+
+ private lateinit var testScope: TestScope
+ private lateinit var repository: FakeKeyguardRepository
+ private lateinit var homeControlsQuickAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+ private lateinit var quickAccessWalletAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+ private lateinit var qrCodeScannerAffordanceConfig: FakeKeyguardQuickAffordanceConfig
+ private lateinit var dockManager: DockManagerFake
+ private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+ private lateinit var keyguardInteractor: KeyguardInteractor
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ overrideResource(R.bool.custom_lockscreen_shortcuts_enabled, true)
+ overrideResource(
+ R.array.config_keyguardQuickAffordanceDefaults,
+ arrayOf(
+ KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START + ":" +
+ BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS,
+ KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END + ":" +
+ BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+ )
+ )
+
+ homeControlsQuickAffordanceConfig =
+ FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS)
+ quickAccessWalletAffordanceConfig =
+ FakeKeyguardQuickAffordanceConfig(
+ BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET
+ )
+ qrCodeScannerAffordanceConfig =
+ FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER)
+ dockManager = DockManagerFake()
+ biometricSettingsRepository = FakeBiometricSettingsRepository()
+ val featureFlags =
+ FakeFeatureFlags().apply {
+ set(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA, true)
+ set(Flags.FACE_AUTH_REFACTOR, true)
+ set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, false)
+ set(Flags.LOCK_SCREEN_LONG_PRESS_DIRECT_TO_WPP, false)
+ }
+
+ val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
+ keyguardInteractor = withDeps.keyguardInteractor
+ repository = withDeps.repository
+
+ whenever(userTracker.userHandle).thenReturn(mock())
+ whenever(lockPatternUtils.getStrongAuthForUser(ArgumentMatchers.anyInt()))
+ .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED)
+ val testDispatcher = StandardTestDispatcher()
+ testScope = TestScope(testDispatcher)
+
+ val localUserSelectionManager =
+ KeyguardQuickAffordanceLocalUserSelectionManager(
+ context = context,
+ userFileManager =
+ mock<UserFileManager>().apply {
+ whenever(
+ getSharedPreferences(
+ ArgumentMatchers.anyString(),
+ ArgumentMatchers.anyInt(),
+ ArgumentMatchers.anyInt(),
+ )
+ )
+ .thenReturn(FakeSharedPreferences())
+ },
+ userTracker = userTracker,
+ broadcastDispatcher = fakeBroadcastDispatcher,
+ )
+ val remoteUserSelectionManager =
+ KeyguardQuickAffordanceRemoteUserSelectionManager(
+ scope = testScope.backgroundScope,
+ userTracker = userTracker,
+ clientFactory = FakeKeyguardQuickAffordanceProviderClientFactory(userTracker),
+ userHandle = UserHandle.SYSTEM,
+ )
+ val quickAffordanceRepository =
+ KeyguardQuickAffordanceRepository(
+ appContext = context,
+ scope = testScope.backgroundScope,
+ localUserSelectionManager = localUserSelectionManager,
+ remoteUserSelectionManager = remoteUserSelectionManager,
+ userTracker = userTracker,
+ legacySettingSyncer =
+ KeyguardQuickAffordanceLegacySettingSyncer(
+ scope = testScope.backgroundScope,
+ backgroundDispatcher = testDispatcher,
+ secureSettings = FakeSettings(),
+ selectionsManager = localUserSelectionManager,
+ ),
+ configs =
+ setOf(
+ homeControlsQuickAffordanceConfig,
+ quickAccessWalletAffordanceConfig,
+ qrCodeScannerAffordanceConfig,
+ ),
+ dumpManager = mock(),
+ userHandle = UserHandle.SYSTEM,
+ )
+
+ underTest = KeyguardQuickAffordancesCombinedViewModel(
+ quickAffordanceInteractor =
+ KeyguardQuickAffordanceInteractor(
+ keyguardInteractor = keyguardInteractor,
+ lockPatternUtils = lockPatternUtils,
+ keyguardStateController = keyguardStateController,
+ userTracker = userTracker,
+ activityStarter = activityStarter,
+ featureFlags = featureFlags,
+ repository = { quickAffordanceRepository },
+ launchAnimator = launchAnimator,
+ logger = logger,
+ devicePolicyManager = devicePolicyManager,
+ dockManager = dockManager,
+ biometricSettingsRepository = biometricSettingsRepository,
+ backgroundDispatcher = testDispatcher,
+ appContext = mContext,
+ ),
+ keyguardInteractor = keyguardInteractor
+ )
+ }
+
+ @Test
+ fun startButton_present_visibleModel_startsActivityOnClick() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val latest = collectLastValue(underTest.startButton)
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ isActivated = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = testConfig,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() =
+ testScope.runTest {
+ whenever(
+ devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId)
+ ).thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL)
+ repository.setKeyguardShowing(true)
+ val latest by collectLastValue(underTest.startButton)
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ isActivated = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest,
+ testConfig =
+ TestConfig(
+ isVisible = false,
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ ),
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun startButton_inPreviewMode_visibleEvenWhenKeyguardNotShowing() =
+ testScope.runTest {
+ underTest.onPreviewSlotSelected(
+ KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START
+ )
+ keyguardInteractor.previewMode.value =
+ KeyguardInteractor.PreviewMode(
+ isInPreviewMode = true,
+ shouldHighlightSelectedAffordance = true,
+ )
+
+ repository.setKeyguardShowing(false)
+ val latest = collectLastValue(underTest.startButton)
+
+ val icon: Icon = mock()
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ isActivated = true,
+ icon = icon,
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ ),
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = false,
+ isActivated = false,
+ icon = icon,
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ isSelected = true,
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ ),
+ configKey = configKey,
+ )
+ Truth.assertThat(latest()?.isSelected).isTrue()
+ }
+
+ @Test
+ fun endButton_inHiglightedPreviewMode_dimmedWhenOtherIsSelected() =
+ testScope.runTest {
+ underTest.onPreviewSlotSelected(
+ KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START
+ )
+ keyguardInteractor.previewMode.value =
+ KeyguardInteractor.PreviewMode(
+ isInPreviewMode = true,
+ shouldHighlightSelectedAffordance = true,
+ )
+
+ repository.setKeyguardShowing(false)
+ val endButton = collectLastValue(underTest.endButton)
+
+ val icon: Icon = mock()
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ isActivated = true,
+ icon = icon,
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ ),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_END,
+ testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ isActivated = true,
+ icon = icon,
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+ ),
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = endButton(),
+ testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = false,
+ isActivated = false,
+ icon = icon,
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ isDimmed = true,
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+ ),
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun endButton_present_visibleModel_doNothingOnClick() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val latest = collectLastValue(underTest.endButton)
+
+ val config =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent =
+ null, // This will cause it to tell the system that the click was handled.
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_END.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_END,
+ testConfig = config,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = config,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun startButton_notPresent_modelIsHidden() =
+ testScope.runTest {
+ val latest = collectLastValue(underTest.startButton)
+
+ val config =
+ TestConfig(
+ isVisible = false,
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = config,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = config,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun animateButtonReveal() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ val value = collectLastValue(underTest.startButton.map { it.animateReveal })
+
+ Truth.assertThat(value()).isFalse()
+ repository.setAnimateDozingTransitions(true)
+ Truth.assertThat(value()).isTrue()
+ repository.setAnimateDozingTransitions(false)
+ Truth.assertThat(value()).isFalse()
+ }
+
+ @Test
+ fun isClickable_trueWhenAlphaAtThreshold() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ repository.setKeyguardAlpha(
+ KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD
+ )
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ val latest = collectLastValue(underTest.startButton)
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = testConfig,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun isClickable_trueWhenAlphaAboveThreshold() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val latest = collectLastValue(underTest.startButton)
+ repository.setKeyguardAlpha(
+ min(
+ 1f,
+ KeyguardQuickAffordancesCombinedViewModel
+ .AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD + 0.1f
+ ),
+ )
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = true,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = testConfig,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun isClickable_falseWhenAlphaBelowThreshold() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val latest = collectLastValue(underTest.startButton)
+ repository.setKeyguardAlpha(
+ max(
+ 0f,
+ KeyguardQuickAffordancesCombinedViewModel
+ .AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD - 0.1f
+ ),
+ )
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = false,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = testConfig,
+ configKey = configKey,
+ )
+ }
+
+ @Test
+ fun isClickable_falseWhenAlphaAtZero() =
+ testScope.runTest {
+ repository.setKeyguardShowing(true)
+ val latest = collectLastValue(underTest.startButton)
+ repository.setKeyguardAlpha(0f)
+
+ val testConfig =
+ TestConfig(
+ isVisible = true,
+ isClickable = false,
+ icon = mock(),
+ canShowWhileLocked = false,
+ intent = Intent("action"),
+ slotId = KeyguardQuickAffordancePosition.BOTTOM_START.toSlotId(),
+ )
+ val configKey =
+ setUpQuickAffordanceModel(
+ position = KeyguardQuickAffordancePosition.BOTTOM_START,
+ testConfig = testConfig,
+ )
+
+ assertQuickAffordanceViewModel(
+ viewModel = latest(),
+ testConfig = testConfig,
+ configKey = configKey,
+ )
+ }
+
+ private suspend fun setUpQuickAffordanceModel(
+ position: KeyguardQuickAffordancePosition,
+ testConfig: TestConfig,
+ ): String {
+ val config =
+ when (position) {
+ KeyguardQuickAffordancePosition.BOTTOM_START -> homeControlsQuickAffordanceConfig
+ KeyguardQuickAffordancePosition.BOTTOM_END -> quickAccessWalletAffordanceConfig
+ }
+
+ val lockScreenState =
+ if (testConfig.isVisible) {
+ if (testConfig.intent != null) {
+ config.onTriggeredResult =
+ KeyguardQuickAffordanceConfig.OnTriggeredResult.StartActivity(
+ intent = testConfig.intent,
+ canShowWhileLocked = testConfig.canShowWhileLocked,
+ )
+ }
+ KeyguardQuickAffordanceConfig.LockScreenState.Visible(
+ icon = testConfig.icon ?: error("Icon is unexpectedly null!"),
+ activationState =
+ when (testConfig.isActivated) {
+ true -> ActivationState.Active
+ false -> ActivationState.Inactive
+ }
+ )
+ } else {
+ KeyguardQuickAffordanceConfig.LockScreenState.Hidden
+ }
+ config.setState(lockScreenState)
+ return "${position.toSlotId()}::${config.key}"
+ }
+
+ private fun assertQuickAffordanceViewModel(
+ viewModel: KeyguardQuickAffordanceViewModel?,
+ testConfig: TestConfig,
+ configKey: String,
+ ) {
+ checkNotNull(viewModel)
+ Truth.assertThat(viewModel.isVisible).isEqualTo(testConfig.isVisible)
+ Truth.assertThat(viewModel.isClickable).isEqualTo(testConfig.isClickable)
+ Truth.assertThat(viewModel.isActivated).isEqualTo(testConfig.isActivated)
+ Truth.assertThat(viewModel.isSelected).isEqualTo(testConfig.isSelected)
+ Truth.assertThat(viewModel.isDimmed).isEqualTo(testConfig.isDimmed)
+ Truth.assertThat(viewModel.slotId).isEqualTo(testConfig.slotId)
+ if (testConfig.isVisible) {
+ Truth.assertThat(viewModel.icon).isEqualTo(testConfig.icon)
+ viewModel.onClicked.invoke(
+ KeyguardQuickAffordanceViewModel.OnClickedParameters(
+ configKey = configKey,
+ expandable = expandable,
+ slotId = viewModel.slotId,
+ )
+ )
+ if (testConfig.intent != null) {
+ Truth.assertThat(
+ Mockito.mockingDetails(activityStarter).invocations
+ ).hasSize(1)
+ } else {
+ Mockito.verifyZeroInteractions(activityStarter)
+ }
+ } else {
+ Truth.assertThat(viewModel.isVisible).isFalse()
+ }
+ }
+
+ private data class TestConfig(
+ val isVisible: Boolean,
+ val isClickable: Boolean = false,
+ val isActivated: Boolean = false,
+ val icon: Icon? = null,
+ val canShowWhileLocked: Boolean = false,
+ val intent: Intent? = null,
+ val isSelected: Boolean = false,
+ val isDimmed: Boolean = false,
+ val slotId: String = ""
+ ) {
+ init {
+ check(!isVisible || icon != null) { "Must supply non-null icon if visible!" }
+ }
+ }
+} \ No newline at end of file
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
new file mode 100644
index 000000000000..05e933b9d572
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.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.systemui.keyguard.ui.viewmodel
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.google.common.truth.Truth
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.*
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+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
+ @Mock private lateinit var keyguardQuickAffordancesCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ val testDispatcher = StandardTestDispatcher()
+ testScope = TestScope(testDispatcher)
+
+ val featureFlags =
+ FakeFeatureFlags().apply {
+ set(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA, true)
+ set(Flags.FACE_AUTH_REFACTOR, true)
+ }
+
+ val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
+ keyguardInteractor = withDeps.keyguardInteractor
+ repository = withDeps.repository
+
+ underTest = KeyguardRootViewModel(
+ keyguardInteractor,
+ keyguardQuickAffordancesCombinedViewModel,
+ )
+ }
+
+ @Test
+ fun alpha() =
+ testScope.runTest {
+ val value = collectLastValue(underTest.alpha)
+
+ Truth.assertThat(value()).isEqualTo(1f)
+ repository.setKeyguardAlpha(0.1f)
+ Truth.assertThat(value()).isEqualTo(0.1f)
+ repository.setKeyguardAlpha(0.5f)
+ Truth.assertThat(value()).isEqualTo(0.5f)
+ repository.setKeyguardAlpha(0.2f)
+ Truth.assertThat(value()).isEqualTo(0.2f)
+ repository.setKeyguardAlpha(0f)
+ Truth.assertThat(value()).isEqualTo(0f)
+ }
+
+ @Test
+ fun alpha_inPreviewMode_doesNotChange() =
+ testScope.runTest {
+ val value = collectLastValue(underTest.alpha)
+ underTest.enablePreviewMode(
+ initiallySelectedSlotId = null,
+ shouldHighlightSelectedAffordance = false,
+ )
+
+ Truth.assertThat(value()).isEqualTo(1f)
+ repository.setKeyguardAlpha(0.1f)
+ Truth.assertThat(value()).isEqualTo(1f)
+ repository.setKeyguardAlpha(0.5f)
+ Truth.assertThat(value()).isEqualTo(1f)
+ repository.setKeyguardAlpha(0.2f)
+ Truth.assertThat(value()).isEqualTo(1f)
+ repository.setKeyguardAlpha(0f)
+ Truth.assertThat(value()).isEqualTo(1f)
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
index 708bb5507f10..19315803c740 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
@@ -98,8 +98,6 @@ import java.util.List;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
public class MediaOutputControllerTest extends SysuiTestCase {
-
- private static final String TEST_PACKAGE_NAME = "com.test.package.name";
private static final String TEST_DEVICE_1_ID = "test_device_1_id";
private static final String TEST_DEVICE_2_ID = "test_device_2_id";
private static final String TEST_DEVICE_3_ID = "test_device_3_id";
@@ -167,6 +165,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
final Notification mNotification = mock(Notification.class);
private Context mSpyContext;
+ private String mPackageName = null;
private MediaOutputController mMediaOutputController;
private LocalMediaManager mLocalMediaManager;
private List<MediaController> mMediaControllers = new ArrayList<>();
@@ -177,12 +176,14 @@ public class MediaOutputControllerTest extends SysuiTestCase {
@Before
public void setUp() {
+ mPackageName = mContext.getPackageName();
+
MockitoAnnotations.initMocks(this);
mContext.setMockPackageManager(mPackageManager);
mSpyContext = spy(mContext);
final UserHandle userHandle = mock(UserHandle.class);
when(mUserTracker.getUserHandle()).thenReturn(userHandle);
- when(mSessionMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(mSessionMediaController.getPackageName()).thenReturn(mPackageName);
when(mSessionMediaController.getPlaybackState()).thenReturn(mPlaybackState);
mMediaControllers.add(mSessionMediaController);
when(mMediaSessionManager.getActiveSessionsForUser(any(),
@@ -193,7 +194,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
mCachedBluetoothDeviceManager);
- mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME,
+ mMediaOutputController = new MediaOutputController(mSpyContext, mPackageName,
mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator,
mNearbyMediaDevicesManager, mAudioManager, mPowerExemptionManager,
@@ -231,7 +232,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(mNotification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
mNotification.extras = bundle;
when(bundle.getParcelable(Notification.EXTRA_MEDIA_SESSION,
MediaSession.Token.class)).thenReturn(token);
@@ -339,8 +340,8 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void tryToLaunchMediaApplication_intentNotNull_startActivity() {
when(mDialogLaunchAnimator.createActivityLaunchController(any(View.class))).thenReturn(
mController);
- Intent intent = new Intent(TEST_PACKAGE_NAME);
- doReturn(intent).when(mPackageManager).getLaunchIntentForPackage(TEST_PACKAGE_NAME);
+ Intent intent = new Intent(mPackageName);
+ doReturn(intent).when(mPackageManager).getLaunchIntentForPackage(mPackageName);
mMediaOutputController.start(mCallback);
mMediaOutputController.tryToLaunchMediaApplication(mDialogLaunchView);
@@ -355,7 +356,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mController);
mMediaOutputController.start(mCallback);
when(mLocalMediaManager.getLinkedItemComponentName()).thenReturn(
- new ComponentName(TEST_PACKAGE_NAME, ""));
+ new ComponentName(mPackageName, ""));
mMediaOutputController.tryToLaunchInAppRoutingIntent(TEST_DEVICE_1_ID, mDialogLaunchView);
@@ -891,7 +892,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getLargeIcon()).thenReturn(null);
@@ -910,7 +911,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getLargeIcon()).thenReturn(icon);
@@ -929,7 +930,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
when(notification.isMediaNotification()).thenReturn(false);
when(notification.getLargeIcon()).thenReturn(icon);
@@ -947,7 +948,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getSmallIcon()).thenReturn(null);
@@ -966,7 +967,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
when(entry.getSbn()).thenReturn(sbn);
when(sbn.getNotification()).thenReturn(notification);
- when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(sbn.getPackageName()).thenReturn(mPackageName);
when(notification.isMediaNotification()).thenReturn(true);
when(notification.getSmallIcon()).thenReturn(icon);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/BlendTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/BlendTest.java
deleted file mode 100644
index 5b3419d838f6..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/BlendTest.java
+++ /dev/null
@@ -1,109 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.blend.Blend;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class BlendTest extends SysuiTestCase {
- private static final int RED = 0xffff0000;
- private static final int BLUE = 0xff0000ff;
- private static final int GREEN = 0xff00ff00;
- private static final int YELLOW = 0xffffff00;
-
- @Test
- public void harmonize_redToBlue() {
- int blended = Blend.harmonize(RED, BLUE);
- assertThat(blended).isSameColorAs(0xffFB0057);
- }
-
- @Test
- public void harmonize_redToGreen() {
- int answer = Blend.harmonize(RED, GREEN);
- assertThat(answer).isSameColorAs(0xffD85600);
- }
-
- @Test
- public void harmonize_redToYellow() {
- int answer = Blend.harmonize(RED, YELLOW);
- assertThat(answer).isSameColorAs(0xffD85600);
- }
-
- @Test
- public void harmonize_blueToGreen() {
- int answer = Blend.harmonize(BLUE, GREEN);
- assertThat(answer).isSameColorAs(0xff0047A3);
- }
-
- @Test
- public void harmonize_blueToRed() {
- int answer = Blend.harmonize(BLUE, RED);
- assertThat(answer).isSameColorAs(0xff5700DC);
- }
-
- @Test
- public void harmonize_blueToYellow() {
- int answer = Blend.harmonize(BLUE, YELLOW);
- assertThat(answer).isSameColorAs(0xff0047A3);
- }
-
- @Test
- public void harmonize_greenToBlue() {
- int answer = Blend.harmonize(GREEN, BLUE);
- assertThat(answer).isSameColorAs(0xff00FC94);
- }
-
- @Test
- public void harmonize_greenToRed() {
- int answer = Blend.harmonize(GREEN, RED);
- assertThat(answer).isSameColorAs(0xffB1F000);
- }
-
- @Test
- public void harmonize_greenToYellow() {
- int answer = Blend.harmonize(GREEN, YELLOW);
- assertThat(answer).isSameColorAs(0xffB1F000);
- }
-
- @Test
- public void harmonize_yellowToBlue() {
- int answer = Blend.harmonize(YELLOW, BLUE);
- assertThat(answer).isSameColorAs(0xffEBFFBA);
- }
-
- @Test
- public void harmonize_yellowToGreen() {
- int answer = Blend.harmonize(YELLOW, GREEN);
- assertThat(answer).isSameColorAs(0xffEBFFBA);
- }
-
- @Test
- public void harmonize_yellowToRed() {
- int answer = Blend.harmonize(YELLOW, RED);
- assertThat(answer).isSameColorAs(0xffFFF6E3);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java
deleted file mode 100644
index 1a35502ceed6..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * 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.monet;
-
-import android.app.WallpaperColors;
-import android.graphics.Color;
-import android.testing.AndroidTestingRunner;
-import android.util.Log;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.graphics.cam.Cam;
-import com.android.systemui.SysuiTestCase;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-public class ColorSchemeTest extends SysuiTestCase {
- @Test
- public void testFilterTransparency() {
- ColorScheme colorScheme = new ColorScheme(Color.TRANSPARENT, false /* darkTheme */);
- Assert.assertEquals(colorScheme.getAllAccentColors(),
- new ColorScheme(0xFF1b6ef3, false).getAllAccentColors());
- }
-
- @Test
- public void testDontFilterOpaque() {
- ColorScheme colorScheme = new ColorScheme(0xFFFF0000, false /* darkTheme */);
- Assert.assertNotEquals(colorScheme.getAllAccentColors(),
- new ColorScheme(0xFF1b6ef3, false).getAllAccentColors());
- }
-
- @Test
- public void testUniqueColors() {
- WallpaperColors wallpaperColors = new WallpaperColors(Color.valueOf(0xffaec00a),
- Color.valueOf(0xffaec00a), Color.valueOf(0xffaec00a));
-
- List<Integer> rankedSeedColors = ColorScheme.getSeedColors(wallpaperColors);
- Assert.assertEquals(rankedSeedColors, List.of(0xffaec00a));
- }
-
- @Test
- public void testStyleApplied() {
- WallpaperColors wallpaperColors = new WallpaperColors(Color.valueOf(0xffaec00a),
- null, null);
- // Expressive applies hue rotations to the theme color. The input theme color has hue
- // 117, ensuring the hue changed significantly is a strong signal styles are being applied.
- ColorScheme colorScheme = new ColorScheme(wallpaperColors, false, Style.EXPRESSIVE);
- Assert.assertEquals(357.77, Cam.fromInt(colorScheme.getAccent1().getS500()).getHue(), 0.1);
- }
-
-
- @Test
- public void testFiltersInvalidColors() {
- WallpaperColors wallpaperColors = new WallpaperColors(Color.valueOf(0xff5e7ea2),
- Color.valueOf(0xff5e7ea2), Color.valueOf(0xff000000));
-
- List<Integer> rankedSeedColors = ColorScheme.getSeedColors(wallpaperColors);
- Assert.assertEquals(rankedSeedColors, List.of(0xff5e7ea2));
- }
-
- @Test
- public void testInvalidColorBecomesGBlue() {
- WallpaperColors wallpaperColors = new WallpaperColors(Color.valueOf(0xff000000), null,
- null);
-
- List<Integer> rankedSeedColors = ColorScheme.getSeedColors(wallpaperColors);
- Assert.assertEquals(rankedSeedColors, List.of(0xFF1b6ef3));
- }
-
- @Test
- public void testDontFilterRRGGBB() {
- ColorScheme colorScheme = new ColorScheme(0xFF0000, false /* darkTheme */);
- Assert.assertEquals(colorScheme.getAllAccentColors(),
- new ColorScheme(0xFFFF0000, false).getAllAccentColors());
- }
-
- @Test
- public void testNoPopulationSignal() {
- WallpaperColors wallpaperColors = new WallpaperColors(Color.valueOf(0xffaec00a),
- Color.valueOf(0xffbe0000), Color.valueOf(0xffcc040f));
-
- List<Integer> rankedSeedColors = ColorScheme.getSeedColors(wallpaperColors);
- Assert.assertEquals(rankedSeedColors, List.of(0xffaec00a, 0xffbe0000, 0xffcc040f));
- }
-
- @Test
- public void testTertiaryHueWrapsProperly() {
- int colorInt = 0xffB3588A; // H350 C50 T50
- ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */);
- int tertiaryMid = colorScheme.getAccent3().getAllShades().get(
- colorScheme.getShadeCount() / 2);
- Cam cam = Cam.fromInt(tertiaryMid);
- Assert.assertEquals(cam.getHue(), 50.0, 10.0);
- }
-
- @Test
- public void testSpritz() {
- int colorInt = 0xffB3588A; // H350 C50 T50
- ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
- Style.SPRITZ /* style */);
- int primaryMid = colorScheme.getAccent1().getAllShades().get(
- colorScheme.getShadeCount() / 2);
- Cam cam = Cam.fromInt(primaryMid);
- Assert.assertEquals(cam.getChroma(), 12.0, 1.0);
- }
-
- @Test
- public void testVibrant() {
- int colorInt = 0xffB3588A; // H350 C50 T50
- ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
- Style.VIBRANT /* style */);
- int neutralMid = colorScheme.getNeutral1().getAllShades().get(
- colorScheme.getShadeCount() / 2);
- Cam cam = Cam.fromInt(neutralMid);
- Assert.assertTrue("chroma was " + cam.getChroma(), Math.floor(cam.getChroma()) <= 12.0);
- }
-
- @Test
- public void testExpressive() {
- int colorInt = 0xffB3588A; // H350 C50 T50
- ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
- Style.EXPRESSIVE /* style */);
- int neutralMid = colorScheme.getNeutral1().getAllShades().get(
- colorScheme.getShadeCount() / 2);
- Cam cam = Cam.fromInt(neutralMid);
- Assert.assertTrue(cam.getChroma() <= 8.0);
- }
-
- @Test
- public void testMonochromatic() {
- int colorInt = 0xffB3588A; // H350 C50 T50
- ColorScheme colorScheme = new ColorScheme(colorInt, false /* darkTheme */,
- Style.MONOCHROMATIC /* style */);
- int neutralMid = colorScheme.getNeutral1().getAllShades().get(
- colorScheme.getShadeCount() / 2);
- Assert.assertTrue(
- Color.red(neutralMid) == Color.green(neutralMid)
- && Color.green(neutralMid) == Color.blue(neutralMid)
- );
- }
-
- @Test
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public void testToString() {
- new ColorScheme(Color.TRANSPARENT, false /* darkTheme */).toString();
- new ColorScheme(Color.argb(0, 0, 0, 0xf), false /* darkTheme */).toString();
- new ColorScheme(Color.argb(0xff, 0xff, 0, 0), false /* darkTheme */).toString();
- new ColorScheme(0xFFFFFFFF, false /* darkTheme */).toString();
-
- new ColorScheme(Color.TRANSPARENT, true /* darkTheme */).toString();
- new ColorScheme(Color.argb(0, 0, 0, 0xf), true /* darkTheme */).toString();
- new ColorScheme(0xFFFF0000, true /* darkTheme */).toString();
- new ColorScheme(0xFFFFFFFF, true /* darkTheme */).toString();
- }
-
- /**
- * Generate xml for SystemPaletteTest#testThemeStyles().
- */
- @Test
- public void generateThemeStyles() {
- StringBuilder xml = new StringBuilder();
- for (int hue = 0; hue < 360; hue += 60) {
- final int sourceColor = Cam.getInt(hue, 50f, 50f);
- final String sourceColorHex = Integer.toHexString(sourceColor);
-
- xml.append(" <theme color=\"").append(sourceColorHex).append("\">\n");
-
- for (Style style : Style.values()) {
- String styleName = style.name().toLowerCase();
- ColorScheme colorScheme = new ColorScheme(sourceColor, false, style);
- xml.append(" <").append(styleName).append(">");
-
- List<String> colors = new ArrayList<>();
-
- colorScheme.getAllHues().forEach(schemeHue -> {
- colors.add("ffffff");
- schemeHue.getAllShades().forEach(tone -> {
- colors.add(Integer.toHexString(tone).substring(2));
- });
- });
-
- xml.append(String.join(",", colors));
- xml.append("</").append(styleName).append(">\n");
- }
- xml.append(" </theme>\n");
- }
- Log.d("ColorSchemeXml", xml.toString());
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorUtilsTest.java
deleted file mode 100644
index 6a7f104a52d9..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorUtilsTest.java
+++ /dev/null
@@ -1,207 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.utils.ColorUtils;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class ColorUtilsTest extends SysuiTestCase {
-
- @Test
- public void argbFromLab() {
- assertThat(ColorUtils.argbFromLab(0.0, 0.0, 0.0)).isEqualTo(0xff000000);
- assertThat(ColorUtils.argbFromLab(0.25, 0.0, 0.0)).isEqualTo(0xff010101);
- assertThat(ColorUtils.argbFromLab(0.5, 0.0, 0.0)).isEqualTo(0xff020202);
- assertThat(ColorUtils.argbFromLab(0.75, 0.0, 0.0)).isEqualTo(0xff030303);
- assertThat(ColorUtils.argbFromLab(1.0, 0.0, 0.0)).isEqualTo(0xff040404);
- assertThat(ColorUtils.argbFromLab(1.5, 0.0, 0.0)).isEqualTo(0xff050505);
- assertThat(ColorUtils.argbFromLab(2.0, 0.0, 0.0)).isEqualTo(0xff070707);
- assertThat(ColorUtils.argbFromLab(3.0, 0.0, 0.0)).isEqualTo(0xff0b0b0b);
- assertThat(ColorUtils.argbFromLab(4.0, 0.0, 0.0)).isEqualTo(0xff0e0e0e);
- assertThat(ColorUtils.argbFromLab(5.0, 0.0, 0.0)).isEqualTo(0xff111111);
- assertThat(ColorUtils.argbFromLab(6.0, 0.0, 0.0)).isEqualTo(0xff131313);
- assertThat(ColorUtils.argbFromLab(7.0, 0.0, 0.0)).isEqualTo(0xff151515);
- assertThat(ColorUtils.argbFromLab(8.0, 0.0, 0.0)).isEqualTo(0xff181818);
- assertThat(ColorUtils.argbFromLab(9.0, 0.0, 0.0)).isEqualTo(0xff191919);
- assertThat(ColorUtils.argbFromLab(10.0, 0.0, 0.0)).isEqualTo(0xff1b1b1b);
- assertThat(ColorUtils.argbFromLab(20.0, 0.0, 0.0)).isEqualTo(0xff303030);
- assertThat(ColorUtils.argbFromLab(30.0, 0.0, 0.0)).isEqualTo(0xff474747);
- assertThat(ColorUtils.argbFromLab(40.0, 0.0, 0.0)).isEqualTo(0xff5e5e5e);
- assertThat(ColorUtils.argbFromLab(50.0, 0.0, 0.0)).isEqualTo(0xff777777);
- assertThat(ColorUtils.argbFromLab(60.0, 0.0, 0.0)).isEqualTo(0xff919191);
- assertThat(ColorUtils.argbFromLab(70.0, 0.0, 0.0)).isEqualTo(0xffababab);
- assertThat(ColorUtils.argbFromLab(80.0, 0.0, 0.0)).isEqualTo(0xffc6c6c6);
- assertThat(ColorUtils.argbFromLab(90.0, 0.0, 0.0)).isEqualTo(0xffe2e2e2);
- assertThat(ColorUtils.argbFromLab(100.0, 0.0, 0.0)).isEqualTo(0xffffffff);
- }
-
- @Test
- public void labFromArgb() {
- assertThat(ColorUtils.labFromArgb(0xff000000)[0]).isWithin(0.001).of(0.0);
- assertThat(ColorUtils.labFromArgb(0xff010101)[0]).isWithin(0.001).of(0.2741748000656514);
- assertThat(ColorUtils.labFromArgb(0xff020202)[0]).isWithin(0.001).of(0.5483496001313029);
- assertThat(ColorUtils.labFromArgb(0xff030303)[0]).isWithin(0.001).of(0.8225244001969543);
- assertThat(ColorUtils.labFromArgb(0xff040404)[0]).isWithin(0.001).of(1.0966992002626057);
- assertThat(ColorUtils.labFromArgb(0xff050505)[0]).isWithin(0.001).of(1.3708740003282571);
- assertThat(ColorUtils.labFromArgb(0xff060606)[0]).isWithin(0.001).of(1.645048800393912);
- assertThat(ColorUtils.labFromArgb(0xff070707)[0]).isWithin(0.001).of(1.9192236004595635);
- assertThat(ColorUtils.labFromArgb(0xff080808)[0]).isWithin(0.001).of(2.193398400525215);
- assertThat(ColorUtils.labFromArgb(0xff0c0c0c)[0]).isWithin(0.001).of(3.3209754491182544);
- assertThat(ColorUtils.labFromArgb(0xff101010)[0]).isWithin(0.001).of(4.680444846419661);
- assertThat(ColorUtils.labFromArgb(0xff181818)[0]).isWithin(0.001).of(8.248186036170349);
- assertThat(ColorUtils.labFromArgb(0xff202020)[0]).isWithin(0.001).of(12.250030101522828);
- assertThat(ColorUtils.labFromArgb(0xff404040)[0]).isWithin(0.001).of(27.093413739449055);
- assertThat(ColorUtils.labFromArgb(0xff808080)[0]).isWithin(0.001).of(53.585013452169036);
- assertThat(ColorUtils.labFromArgb(0xffffffff)[0]).isWithin(0.001).of(100.0);
- }
-
- @Test
- public void argbFromLstar() {
- assertThat(ColorUtils.argbFromLstar(0.0)).isEqualTo(0xff000000);
- assertThat(ColorUtils.argbFromLstar(0.25)).isEqualTo(0xff010101);
- assertThat(ColorUtils.argbFromLstar(0.5)).isEqualTo(0xff020202);
- assertThat(ColorUtils.argbFromLstar(0.75)).isEqualTo(0xff030303);
- assertThat(ColorUtils.argbFromLstar(1.0)).isEqualTo(0xff040404);
- assertThat(ColorUtils.argbFromLstar(1.5)).isEqualTo(0xff050505);
- assertThat(ColorUtils.argbFromLstar(2.0)).isEqualTo(0xff070707);
- assertThat(ColorUtils.argbFromLstar(3.0)).isEqualTo(0xff0b0b0b);
- assertThat(ColorUtils.argbFromLstar(4.0)).isEqualTo(0xff0e0e0e);
- assertThat(ColorUtils.argbFromLstar(5.0)).isEqualTo(0xff111111);
- assertThat(ColorUtils.argbFromLstar(6.0)).isEqualTo(0xff131313);
- assertThat(ColorUtils.argbFromLstar(7.0)).isEqualTo(0xff151515);
- assertThat(ColorUtils.argbFromLstar(8.0)).isEqualTo(0xff181818);
- assertThat(ColorUtils.argbFromLstar(9.0)).isEqualTo(0xff191919);
- assertThat(ColorUtils.argbFromLstar(10.0)).isEqualTo(0xff1b1b1b);
- assertThat(ColorUtils.argbFromLstar(20.0)).isEqualTo(0xff303030);
- assertThat(ColorUtils.argbFromLstar(30.0)).isEqualTo(0xff474747);
- assertThat(ColorUtils.argbFromLstar(40.0)).isEqualTo(0xff5e5e5e);
- assertThat(ColorUtils.argbFromLstar(50.0)).isEqualTo(0xff777777);
- assertThat(ColorUtils.argbFromLstar(60.0)).isEqualTo(0xff919191);
- assertThat(ColorUtils.argbFromLstar(70.0)).isEqualTo(0xffababab);
- assertThat(ColorUtils.argbFromLstar(80.0)).isEqualTo(0xffc6c6c6);
- assertThat(ColorUtils.argbFromLstar(90.0)).isEqualTo(0xffe2e2e2);
- assertThat(ColorUtils.argbFromLstar(100.0)).isEqualTo(0xffffffff);
- }
-
- @Test
- public void lstarFromArgb() {
- assertThat(ColorUtils.lstarFromArgb(0xff000000)).isWithin(0.001).of(0.0);
- assertThat(ColorUtils.lstarFromArgb(0xff010101)).isWithin(0.001).of(0.2741748000656518);
- assertThat(ColorUtils.lstarFromArgb(0xff020202)).isWithin(0.001).of(0.5483496001313036);
- assertThat(ColorUtils.lstarFromArgb(0xff030303)).isWithin(0.001).of(0.8225244001969553);
- assertThat(ColorUtils.lstarFromArgb(0xff040404)).isWithin(0.001).of(1.0966992002626073);
- assertThat(ColorUtils.lstarFromArgb(0xff050505)).isWithin(0.001).of(1.3708740003282587);
- assertThat(ColorUtils.lstarFromArgb(0xff060606)).isWithin(0.001).of(1.6450488003939105);
- assertThat(ColorUtils.lstarFromArgb(0xff070707)).isWithin(0.001).of(1.9192236004595624);
- assertThat(ColorUtils.lstarFromArgb(0xff080808)).isWithin(0.001).of(2.1933984005252145);
- assertThat(ColorUtils.lstarFromArgb(0xff0c0c0c)).isWithin(0.001).of(3.3209754491182557);
- assertThat(ColorUtils.lstarFromArgb(0xff101010)).isWithin(0.001).of(4.680444846419663);
- assertThat(ColorUtils.lstarFromArgb(0xff181818)).isWithin(0.001).of(8.248186036170349);
- assertThat(ColorUtils.lstarFromArgb(0xff202020)).isWithin(0.001).of(12.250030101522828);
- assertThat(ColorUtils.lstarFromArgb(0xff404040)).isWithin(0.001).of(27.093413739449055);
- assertThat(ColorUtils.lstarFromArgb(0xff808080)).isWithin(0.001).of(53.585013452169036);
- assertThat(ColorUtils.lstarFromArgb(0xffffffff)).isWithin(0.001).of(100.0);
- }
-
- @Test
- public void yFromLstar() {
- assertThat(ColorUtils.yFromLstar(0.0)).isWithin(1e-5).of(0.0);
- assertThat(ColorUtils.yFromLstar(0.1)).isWithin(1e-5).of(0.0110705);
- assertThat(ColorUtils.yFromLstar(0.2)).isWithin(1e-5).of(0.0221411);
- assertThat(ColorUtils.yFromLstar(0.3)).isWithin(1e-5).of(0.0332116);
- assertThat(ColorUtils.yFromLstar(0.4)).isWithin(1e-5).of(0.0442822);
- assertThat(ColorUtils.yFromLstar(0.5)).isWithin(1e-5).of(0.0553528);
- assertThat(ColorUtils.yFromLstar(1.0)).isWithin(1e-5).of(0.1107056);
- assertThat(ColorUtils.yFromLstar(2.0)).isWithin(1e-5).of(0.2214112);
- assertThat(ColorUtils.yFromLstar(3.0)).isWithin(1e-5).of(0.3321169);
- assertThat(ColorUtils.yFromLstar(4.0)).isWithin(1e-5).of(0.4428225);
- assertThat(ColorUtils.yFromLstar(5.0)).isWithin(1e-5).of(0.5535282);
- assertThat(ColorUtils.yFromLstar(8.0)).isWithin(1e-5).of(0.8856451);
- assertThat(ColorUtils.yFromLstar(10.0)).isWithin(1e-5).of(1.1260199);
- assertThat(ColorUtils.yFromLstar(15.0)).isWithin(1e-5).of(1.9085832);
- assertThat(ColorUtils.yFromLstar(20.0)).isWithin(1e-5).of(2.9890524);
- assertThat(ColorUtils.yFromLstar(25.0)).isWithin(1e-5).of(4.4154767);
- assertThat(ColorUtils.yFromLstar(30.0)).isWithin(1e-5).of(6.2359055);
- assertThat(ColorUtils.yFromLstar(40.0)).isWithin(1e-5).of(11.2509737);
- assertThat(ColorUtils.yFromLstar(50.0)).isWithin(1e-5).of(18.4186518);
- assertThat(ColorUtils.yFromLstar(60.0)).isWithin(1e-5).of(28.1233342);
- assertThat(ColorUtils.yFromLstar(70.0)).isWithin(1e-5).of(40.7494157);
- assertThat(ColorUtils.yFromLstar(80.0)).isWithin(1e-5).of(56.6812907);
- assertThat(ColorUtils.yFromLstar(90.0)).isWithin(1e-5).of(76.3033539);
- assertThat(ColorUtils.yFromLstar(95.0)).isWithin(1e-5).of(87.6183294);
- assertThat(ColorUtils.yFromLstar(99.0)).isWithin(1e-5).of(97.4360239);
- assertThat(ColorUtils.yFromLstar(100.0)).isWithin(1e-5).of(100.0);
- }
-
- @Test
- public void lstarFromY() {
- assertThat(ColorUtils.lstarFromY(0.0)).isWithin(1e-5).of(0.0);
- assertThat(ColorUtils.lstarFromY(0.1)).isWithin(1e-5).of(0.9032962);
- assertThat(ColorUtils.lstarFromY(0.2)).isWithin(1e-5).of(1.8065925);
- assertThat(ColorUtils.lstarFromY(0.3)).isWithin(1e-5).of(2.7098888);
- assertThat(ColorUtils.lstarFromY(0.4)).isWithin(1e-5).of(3.6131851);
- assertThat(ColorUtils.lstarFromY(0.5)).isWithin(1e-5).of(4.5164814);
- assertThat(ColorUtils.lstarFromY(0.8856451)).isWithin(1e-5).of(8.0);
- assertThat(ColorUtils.lstarFromY(1.0)).isWithin(1e-5).of(8.9914424);
- assertThat(ColorUtils.lstarFromY(2.0)).isWithin(1e-5).of(15.4872443);
- assertThat(ColorUtils.lstarFromY(3.0)).isWithin(1e-5).of(20.0438970);
- assertThat(ColorUtils.lstarFromY(4.0)).isWithin(1e-5).of(23.6714419);
- assertThat(ColorUtils.lstarFromY(5.0)).isWithin(1e-5).of(26.7347653);
- assertThat(ColorUtils.lstarFromY(10.0)).isWithin(1e-5).of(37.8424304);
- assertThat(ColorUtils.lstarFromY(15.0)).isWithin(1e-5).of(45.6341970);
- assertThat(ColorUtils.lstarFromY(20.0)).isWithin(1e-5).of(51.8372115);
- assertThat(ColorUtils.lstarFromY(25.0)).isWithin(1e-5).of(57.0754208);
- assertThat(ColorUtils.lstarFromY(30.0)).isWithin(1e-5).of(61.6542222);
- assertThat(ColorUtils.lstarFromY(40.0)).isWithin(1e-5).of(69.4695307);
- assertThat(ColorUtils.lstarFromY(50.0)).isWithin(1e-5).of(76.0692610);
- assertThat(ColorUtils.lstarFromY(60.0)).isWithin(1e-5).of(81.8381891);
- assertThat(ColorUtils.lstarFromY(70.0)).isWithin(1e-5).of(86.9968642);
- assertThat(ColorUtils.lstarFromY(80.0)).isWithin(1e-5).of(91.6848609);
- assertThat(ColorUtils.lstarFromY(90.0)).isWithin(1e-5).of(95.9967686);
- assertThat(ColorUtils.lstarFromY(95.0)).isWithin(1e-5).of(98.0335184);
- assertThat(ColorUtils.lstarFromY(99.0)).isWithin(1e-5).of(99.6120372);
- assertThat(ColorUtils.lstarFromY(100.0)).isWithin(1e-5).of(100.0);
- }
-
- @Test
- public void yToLstarToY() {
- for (double y = 0.0; y <= 100.0; y += 0.1) {
- double lstar = ColorUtils.lstarFromY(y);
- double reconstructedY = ColorUtils.yFromLstar(lstar);
- assertThat(reconstructedY).isWithin(1e-8).of(y);
- }
- }
-
- @Test
- public void lstarToYToLstar() {
- for (double lstar = 0.0; lstar <= 100.0; lstar += 0.1) {
- double y = ColorUtils.yFromLstar(lstar);
- double reconstructedLstar = ColorUtils.lstarFromY(y);
- assertThat(reconstructedLstar).isWithin(1e-8).of(lstar);
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ContrastTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/ContrastTest.java
deleted file mode 100644
index 8d3e40146900..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/ContrastTest.java
+++ /dev/null
@@ -1,73 +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.monet;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.contrast.Contrast;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class ContrastTest extends SysuiTestCase {
-
- @Test
- public void lighter_impossibleRatioErrors() {
- assertEquals(-1.0, Contrast.lighter(90.0, 10.0), 0.001);
- }
-
- @Test
- public void lighter_outOfBoundsInputAboveErrors() {
- assertEquals(-1.0, Contrast.lighter(110.0, 2.0), 0.001);
- }
-
- @Test
- public void lighter_outOfBoundsInputBelowErrors() {
- assertEquals(-1.0, Contrast.lighter(-10.0, 2.0), 0.001);
- }
-
- @Test
- public void lighterUnsafe_returnsMaxTone() {
- assertEquals(100, Contrast.lighterUnsafe(100.0, 2.0), 0.001);
- }
-
- @Test
- public void darker_impossibleRatioErrors() {
- assertEquals(-1.0, Contrast.darker(10.0, 20.0), 0.001);
- }
-
- @Test
- public void darker_outOfBoundsInputAboveErrors() {
- assertEquals(-1.0, Contrast.darker(110.0, 2.0), 0.001);
- }
-
- @Test
- public void darker_outOfBoundsInputBelowErrors() {
- assertEquals(-1.0, Contrast.darker(-10.0, 2.0), 0.001);
- }
-
- @Test
- public void darkerUnsafe_returnsMinTone() {
- assertEquals(0.0, Contrast.darkerUnsafe(0.0, 2.0), 0.001);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DislikeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DislikeTest.java
deleted file mode 100644
index bda7fcc8a595..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/DislikeTest.java
+++ /dev/null
@@ -1,81 +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.monet;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dislike.DislikeAnalyzer;
-import com.android.systemui.monet.hct.Hct;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class DislikeTest extends SysuiTestCase {
-
- @Test
- public void monkSkinToneScaleColorsLiked() {
- // From https://skintone.google#/get-started
- int[] monkSkinToneScaleColors =
- new int[]{
- 0xfff6ede4,
- 0xfff3e7db,
- 0xfff7ead0,
- 0xffeadaba,
- 0xffd7bd96,
- 0xffa07e56,
- 0xff825c43,
- 0xff604134,
- 0xff3a312a,
- 0xff292420,
- };
- for (int color : monkSkinToneScaleColors) {
- assertFalse(DislikeAnalyzer.isDisliked(Hct.fromInt(color)));
- }
- }
-
- @Test
- public void bileColorsDisliked() {
- int[] unlikable =
- new int[]{
- 0xff95884B, 0xff716B40, 0xffB08E00, 0xff4C4308, 0xff464521,
- };
- for (int color : unlikable) {
- assertTrue(DislikeAnalyzer.isDisliked(Hct.fromInt(color)));
- }
- }
-
- @Test
- public void bileColorsBecameLikable() {
- int[] unlikable =
- new int[]{
- 0xff95884B, 0xff716B40, 0xffB08E00, 0xff4C4308, 0xff464521,
- };
- for (int color : unlikable) {
- Hct hct = Hct.fromInt(color);
- assertTrue(DislikeAnalyzer.isDisliked(hct));
- Hct likable = DislikeAnalyzer.fixIfDisliked(hct);
- assertFalse(DislikeAnalyzer.isDisliked(likable));
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java
deleted file mode 100644
index 4ce32d2c1f00..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java
+++ /dev/null
@@ -1,207 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.monet.contrast.Contrast;
-import com.android.systemui.monet.dynamiccolor.DynamicColor;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.dynamiccolor.ToneDeltaConstraint;
-import com.android.systemui.monet.dynamiccolor.TonePolarity;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.DynamicScheme;
-import com.android.systemui.monet.scheme.SchemeContent;
-import com.android.systemui.monet.scheme.SchemeFidelity;
-import com.android.systemui.monet.scheme.SchemeMonochrome;
-import com.android.systemui.monet.scheme.SchemeTonalSpot;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class DynamicColorTest extends SysuiTestCase{
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void fromArgbNoBackground_doesntChangeForContrast() {
- final int blueArgb = 0xff0000ff;
- final DynamicColor dynamicColor = DynamicColor.fromArgb(blueArgb);
-
- final SchemeTonalSpot standardContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0);
- assertThat(dynamicColor.getArgb(standardContrast)).isSameColorAs(blueArgb);
-
- final SchemeTonalSpot minContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, -1.0);
- assertThat(dynamicColor.getArgb(minContrast)).isSameColorAs(blueArgb);
-
- final SchemeTonalSpot maxContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 1.0);
- assertThat(dynamicColor.getArgb(maxContrast)).isSameColorAs(blueArgb);
- }
-
- @Test
- public void toneDeltaConstraintNoPreference_evaluatesCorrectly() {
- final int blueArgb = 0xff0000ff;
- final int redArgb = 0xffff0000;
- final DynamicColor otherDynamicColor = DynamicColor.fromArgb(redArgb);
- final DynamicColor dynamicColor =
- DynamicColor.fromArgb(
- blueArgb,
- (s) -> 30.0,
- null,
- (s) -> new ToneDeltaConstraint(30, otherDynamicColor, TonePolarity.NO_PREFERENCE));
- final SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0);
- assertThat(dynamicColor.getArgb(scheme)).isSameColorAs(0xff0000ef);
- }
-
- @Test
- public void dynamicColor_withOpacity() {
- final DynamicColor dynamicColor =
- new DynamicColor(
- s -> 0.0,
- s -> 0.0,
- s -> s.isDark ? 100.0 : 0.0,
- s -> s.isDark ? 0.20 : 0.12,
- null,
- scheme ->
- DynamicColor.toneMinContrastDefault(
- (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null),
- scheme ->
- DynamicColor.toneMaxContrastDefault(
- (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null),
- null);
- final SchemeTonalSpot lightScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), false, 0.0);
- assertThat(dynamicColor.getArgb(lightScheme)).isSameColorAs(0x1f000000);
-
- final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0);
- assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff);
- }
-
- @Test
- public void respectsContrast() {
- final Hct[] seedColors =
- new Hct[] {
- Hct.fromInt(0xFFFF0000),
- Hct.fromInt(0xFFFFFF00),
- Hct.fromInt(0xFF00FF00),
- Hct.fromInt(0xFF0000FF)
- };
-
- final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0};
-
- for (Hct seedColor : seedColors) {
- for (double contrastLevel : contrastLevels) {
- for (boolean isDark : new boolean[] {false, true}) {
- final DynamicScheme[] schemes =
- new DynamicScheme[] {
- new SchemeContent(seedColor, isDark, contrastLevel),
- new SchemeMonochrome(seedColor, isDark, contrastLevel),
- new SchemeTonalSpot(seedColor, isDark, contrastLevel),
- new SchemeFidelity(seedColor, isDark, contrastLevel)
- };
- for (final DynamicScheme scheme : schemes) {
- assertTrue(
- pairSatisfiesContrast(scheme, dynamicColors.onPrimary(), dynamicColors.primary()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onPrimaryContainer(), dynamicColors.primaryContainer()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onSecondary(), dynamicColors.secondary()));
- assertTrue(
- pairSatisfiesContrast(
- scheme,
- dynamicColors.onSecondaryContainer(),
- dynamicColors.secondaryContainer()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onTertiary(), dynamicColors.tertiary()));
- assertTrue(
- pairSatisfiesContrast(
- scheme,
- dynamicColors.onTertiaryContainer(),
- dynamicColors.tertiaryContainer()));
- assertTrue(
- pairSatisfiesContrast(scheme, dynamicColors.onError(), dynamicColors.error()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onErrorContainer(), dynamicColors.errorContainer()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onBackground(), dynamicColors.background()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.onSurfaceVariant(), dynamicColors.surfaceVariant()));
- assertTrue(
- pairSatisfiesContrast(
- scheme, dynamicColors.inverseOnSurface(), dynamicColors.inverseSurface()));
- }
- }
- }
- }
- }
-
- @Test
- public void valuesAreCorrect() {
- // Checks that the values of certain dynamic colors match Dart results.
- assertThat(
- dynamicColors
- .onPrimaryContainer()
- .getArgb(new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5)))
- .isSameColorAs(0xFFFFE5E1);
- assertThat(
- dynamicColors
- .onSecondaryContainer()
- .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5)))
- .isSameColorAs(0xFFFFFCFF);
- assertThat(
- dynamicColors
- .onTertiaryContainer()
- .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5)))
- .isSameColorAs(0xFF616600);
- assertThat(
- dynamicColors
- .inverseSurface()
- .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0)))
- .isSameColorAs(0xFF2F2F3B);
- assertThat(
- dynamicColors
- .inversePrimary()
- .getArgb(new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5)))
- .isSameColorAs(0xFFFF907F);
- assertThat(
- dynamicColors
- .outlineVariant()
- .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0)))
- .isSameColorAs(0xFF484831);
- }
-
- private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) {
- double fgTone = fg.getHct(scheme).getTone();
- double bgTone = bg.getHct(scheme).getTone();
- double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0;
- return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement;
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/HctTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/HctTest.java
deleted file mode 100644
index e9ca8a653e41..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/HctTest.java
+++ /dev/null
@@ -1,320 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.hct.Cam16;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.hct.ViewingConditions;
-import com.android.systemui.monet.utils.ColorUtils;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class HctTest extends SysuiTestCase {
- private static final int RED = 0xffff0000;
- private static final int GREEN = 0xff00ff00;
- private static final int BLUE = 0xff0000ff;
- private static final int WHITE = 0xffffffff;
- private static final int BLACK = 0xff000000;
- private static final int MIDGRAY = 0xff777777;
-
- public static final ViewingConditions VIEWING_CONDITIONS_WHITE_BACKGROUND =
- ViewingConditions.make(
- new double[]{
- ColorUtils.whitePointD65()[0],
- ColorUtils.whitePointD65()[1],
- ColorUtils.whitePointD65()[2]
- },
- (200.0 / Math.PI * ColorUtils.yFromLstar(50.0) / 100.f),
- 100.0,
- 2.0,
- false);
-
- public static final ViewingConditions VIEWING_CONDITIONS_BLACK_BACKGROUND =
- ViewingConditions.make(
- new double[]{
- ColorUtils.whitePointD65()[0],
- ColorUtils.whitePointD65()[1],
- ColorUtils.whitePointD65()[2]
- },
- (200.0 / Math.PI * ColorUtils.yFromLstar(50.0) / 100.f),
- 0.0,
- 2.0,
- false);
-
- @Test
- public void camFromArgb_red() {
- Cam16 cam = Cam16.fromInt(RED);
-
- assertEquals(27.408, cam.getHue(), 0.001);
- assertEquals(113.357, cam.getChroma(), 0.001);
- assertEquals(46.445, cam.getJ(), 0.001);
- assertEquals(89.494, cam.getM(), 0.001);
- assertEquals(91.889, cam.getS(), 0.001);
- assertEquals(105.988, cam.getQ(), 0.001);
- }
-
- @Test
- public void camFromArgb_green() {
- Cam16 cam = Cam16.fromInt(GREEN);
-
- assertEquals(142.139, cam.getHue(), 0.001);
- assertEquals(108.410, cam.getChroma(), 0.001);
- assertEquals(79.331, cam.getJ(), 0.001);
- assertEquals(85.587, cam.getM(), 0.001);
- assertEquals(78.604, cam.getS(), 0.001);
- assertEquals(138.520, cam.getQ(), 0.001);
- }
-
- @Test
- public void camFromArgb_blue() {
- Cam16 cam = Cam16.fromInt(BLUE);
-
- assertEquals(282.788, cam.getHue(), 0.001);
- assertEquals(87.230, cam.getChroma(), 0.001);
- assertEquals(25.465, cam.getJ(), 0.001);
- assertEquals(68.867, cam.getM(), 0.001);
- assertEquals(93.674, cam.getS(), 0.001);
- assertEquals(78.481, cam.getQ(), 0.001);
- }
-
- @Test
- public void camFromArgb_white() {
- Cam16 cam = Cam16.fromInt(WHITE);
-
- assertEquals(209.492, cam.getHue(), 0.001);
- assertEquals(2.869, cam.getChroma(), 0.001);
- assertEquals(100.0, cam.getJ(), 0.001);
- assertEquals(2.265, cam.getM(), 0.001);
- assertEquals(12.068, cam.getS(), 0.001);
- assertEquals(155.521, cam.getQ(), 0.001);
- }
-
- @Test
- public void camFromArgb_black() {
- Cam16 cam = Cam16.fromInt(BLACK);
-
- assertEquals(0.0, cam.getHue(), 0.001);
- assertEquals(0.0, cam.getChroma(), 0.001);
- assertEquals(0.0, cam.getJ(), 0.001);
- assertEquals(0.0, cam.getM(), 0.001);
- assertEquals(0.0, cam.getS(), 0.001);
- assertEquals(0.0, cam.getQ(), 0.001);
- }
-
- @Test
- public void camToArgbToCam_red() {
- Cam16 cam = Cam16.fromInt(RED);
- int argb = cam.toInt();
- assertEquals(RED, argb);
- }
-
- @Test
- public void camToArgbToCam_green() {
- Cam16 cam = Cam16.fromInt(GREEN);
- int argb = cam.toInt();
- assertEquals(GREEN, argb);
- }
-
- @Test
- public void camToArgbToCam_blue() {
- Cam16 cam = Cam16.fromInt(BLUE);
- int argb = cam.toInt();
- assertEquals(BLUE, argb);
- }
-
- @Test
- public void viewingConditions_default() {
- ViewingConditions vc = ViewingConditions.DEFAULT;
-
- assertEquals(0.184, vc.getN(), 0.001);
- assertEquals(29.981, vc.getAw(), 0.001);
- assertEquals(1.016, vc.getNbb(), 0.001);
- assertEquals(1.021, vc.getRgbD()[0], 0.001);
- assertEquals(0.986, vc.getRgbD()[1], 0.001);
- assertEquals(0.933, vc.getRgbD()[2], 0.001);
- assertEquals(0.789, vc.getFlRoot(), 0.001);
- }
-
- private boolean colorIsOnBoundary(int argb) {
- return ColorUtils.redFromArgb(argb) == 0
- || ColorUtils.redFromArgb(argb) == 255
- || ColorUtils.greenFromArgb(argb) == 0
- || ColorUtils.greenFromArgb(argb) == 255
- || ColorUtils.blueFromArgb(argb) == 0
- || ColorUtils.blueFromArgb(argb) == 255;
- }
-
- @Test
- public void correctness() {
- for (int hue = 15; hue < 360; hue += 30) {
- for (int chroma = 0; chroma <= 100; chroma += 10) {
- for (int tone = 20; tone <= 80; tone += 10) {
- Hct hctColor = Hct.from((double) hue, (double) chroma, (double) tone);
-
- if (chroma > 0) {
- assertEquals(
- "Incorrect hue for H" + hue + " C" + chroma + " T" + tone,
- hue,
- hctColor.getHue(),
- 4.0);
- }
-
- assertTrue(
- "Negative chroma for H" + hue + " C" + chroma + " T" + tone,
- hctColor.getChroma() >= 0.0);
-
- assertTrue(
- "Chroma too high for H" + hue + " C" + chroma + " T" + tone,
- hctColor.getChroma() <= chroma + 2.5);
-
- if (hctColor.getChroma() < chroma - 2.5) {
- assertTrue(
- "Color not on boundary for non-sRGB color for H"
- + hue
- + " C"
- + chroma
- + " T"
- + tone,
- colorIsOnBoundary(hctColor.toInt()));
- }
-
- assertEquals(tone, hctColor.getTone(), 0.5);
- }
- }
- }
- }
-
- @Test
- public void relativity_redInBlack() {
- final int colorToTest = RED;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff9F5C51)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_redInWhite() {
- final int colorToTest = RED;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xffFF5D48)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_greenInBlack() {
- final int colorToTest = GREEN;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xffACD69D)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_greenInWhite() {
- final int colorToTest = GREEN;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff8EFF77)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_blueInBlack() {
- final int colorToTest = BLUE;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff343654)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_blueInWhite() {
- final int colorToTest = BLUE;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff3F49FF)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_whiteInBlack() {
- final int colorToTest = WHITE;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xffFFFFFF)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_whiteInWhite() {
- final int colorToTest = WHITE;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xffFFFFFF)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_midgrayInBlack() {
- final int colorToTest = MIDGRAY;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff605F5F)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_midgrayInWhite() {
- final int colorToTest = MIDGRAY;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff8E8E8E)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_blackInBlack() {
- final int colorToTest = BLACK;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff000000)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_BLACK_BACKGROUND).toInt());
- }
-
- @Test
- public void relativity_blackInWhite() {
- final int colorToTest = BLACK;
- final Hct hct = Hct.fromInt(colorToTest);
- assertThat(0xff000000)
- .isSameColorAs(
- hct.inViewingConditions(VIEWING_CONDITIONS_WHITE_BACKGROUND).toInt());
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/MathUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/MathUtilsTest.java
deleted file mode 100644
index 6b8437a6e46e..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/MathUtilsTest.java
+++ /dev/null
@@ -1,99 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.utils.MathUtils;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class MathUtilsTest extends SysuiTestCase {
-
- @Test
- public void signum() {
- assertThat(MathUtils.signum(1.5)).isEqualTo(1);
- assertThat(MathUtils.signum(0)).isEqualTo(0);
- assertThat(MathUtils.signum(-3.0)).isEqualTo(-1);
- }
-
- @Test
- public void sanitizeDegreesInt() {
- assertThat(MathUtils.sanitizeDegreesInt(0)).isEqualTo(0);
- assertThat(MathUtils.sanitizeDegreesInt(30)).isEqualTo(30);
- assertThat(MathUtils.sanitizeDegreesInt(150)).isEqualTo(150);
- assertThat(MathUtils.sanitizeDegreesInt(360)).isEqualTo(0);
- assertThat(MathUtils.sanitizeDegreesInt(450)).isEqualTo(90);
- assertThat(MathUtils.sanitizeDegreesInt(1000000)).isEqualTo(280);
- assertThat(MathUtils.sanitizeDegreesInt(-10)).isEqualTo(350);
- assertThat(MathUtils.sanitizeDegreesInt(-90)).isEqualTo(270);
- assertThat(MathUtils.sanitizeDegreesInt(-1000000)).isEqualTo(80);
- }
-
- @Test
- public void sanitizeDegreesDouble() {
- assertThat(MathUtils.sanitizeDegreesDouble(0.0)).isWithin(0.001).of(0.0);
- assertThat(MathUtils.sanitizeDegreesDouble(30.0)).isWithin(0.001).of(30.0);
- assertThat(MathUtils.sanitizeDegreesDouble(150.0)).isWithin(0.001).of(150.0);
- assertThat(MathUtils.sanitizeDegreesDouble(360.0)).isWithin(0.001).of(0.0);
- assertThat(MathUtils.sanitizeDegreesDouble(450.0)).isWithin(0.001).of(90.0);
- assertThat(MathUtils.sanitizeDegreesDouble(1000000.0)).isWithin(0.001).of(280.0);
- assertThat(MathUtils.sanitizeDegreesDouble(-10.0)).isWithin(0.001).of(350.0);
- assertThat(MathUtils.sanitizeDegreesDouble(-90.0)).isWithin(0.001).of(270.0);
- assertThat(MathUtils.sanitizeDegreesDouble(-1000000.0)).isWithin(0.001).of(80.0);
- assertThat(MathUtils.sanitizeDegreesDouble(100.375)).isWithin(0.001).of(100.375);
- assertThat(MathUtils.sanitizeDegreesDouble(123456.789)).isWithin(0.001).of(336.789);
- assertThat(MathUtils.sanitizeDegreesDouble(-200.625)).isWithin(0.001).of(159.375);
- assertThat(MathUtils.sanitizeDegreesDouble(-123456.789)).isWithin(0.001).of(23.211);
- }
-
- @Test
- public void rotationDirection() {
- for (double from = 0.0; from < 360.0; from += 15.0) {
- for (double to = 7.5; to < 360.0; to += 15.0) {
- double expectedAnswer = originalRotationDirection(from, to);
- double actualAnswer = MathUtils.rotationDirection(from, to);
- assertThat(actualAnswer).isEqualTo(expectedAnswer);
- assertThat(Math.abs(actualAnswer)).isEqualTo(1.0);
- }
- }
- }
-
- // Original implementation for MathUtils.rotationDirection.
- // Included here to test equivalence with new implementation.
- private static double originalRotationDirection(double from, double to) {
- double a = to - from;
- double b = to - from + 360.0;
- double c = to - from - 360.0;
- double aAbs = Math.abs(a);
- double bAbs = Math.abs(b);
- double cAbs = Math.abs(c);
- if (aAbs <= bAbs && aAbs <= cAbs) {
- return a >= 0.0 ? 1.0 : -1.0;
- } else if (bAbs <= aAbs && bAbs <= cAbs) {
- return b >= 0.0 ? 1.0 : -1.0;
- } else {
- return c >= 0.0 ? 1.0 : -1.0;
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/PalettesTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/PalettesTest.java
deleted file mode 100644
index 0b65fdfa740b..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/PalettesTest.java
+++ /dev/null
@@ -1,116 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.hct.Cam16;
-import com.android.systemui.monet.palettes.CorePalette;
-import com.android.systemui.monet.palettes.TonalPalette;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class PalettesTest extends SysuiTestCase {
-
- @Test
- public void tones_ofBlue() {
- int color = 0xff0000ff;
- Cam16 cam = Cam16.fromInt(color);
- TonalPalette tones = TonalPalette.fromHueAndChroma(cam.getHue(), cam.getChroma());
- assertThat(tones.tone(100)).isEqualTo(0xFFFFFFFF);
- assertThat(tones.tone(95)).isEqualTo(0xfff1efff);
- assertThat(tones.tone(90)).isEqualTo(0xffe0e0ff);
- assertThat(tones.tone(80)).isEqualTo(0xffbec2ff);
- assertThat(tones.tone(70)).isEqualTo(0xff9da3ff);
- assertThat(tones.tone(60)).isEqualTo(0xff7c84ff);
- assertThat(tones.tone(50)).isEqualTo(0xff5a64ff);
- assertThat(tones.tone(40)).isEqualTo(0xff343dff);
- assertThat(tones.tone(30)).isEqualTo(0xff0000ef);
- assertThat(tones.tone(20)).isEqualTo(0xff0001ac);
- assertThat(tones.tone(10)).isEqualTo(0xff00006e);
- assertThat(tones.tone(0)).isEqualTo(0xff000000);
- }
-
- @Test
- public void keyTones_ofBlue() {
- CorePalette core = CorePalette.of(0xff0000ff);
-
- assertThat(core.a1.tone(100)).isEqualTo(0xFFFFFFFF);
- assertThat(core.a1.tone(95)).isEqualTo(0xfff1efff);
- assertThat(core.a1.tone(90)).isEqualTo(0xffe0e0ff);
- assertThat(core.a1.tone(80)).isEqualTo(0xffbec2ff);
- assertThat(core.a1.tone(70)).isEqualTo(0xff9da3ff);
- assertThat(core.a1.tone(60)).isEqualTo(0xff7c84ff);
- assertThat(core.a1.tone(50)).isEqualTo(0xff5a64ff);
- assertThat(core.a1.tone(40)).isEqualTo(0xff343dff);
- assertThat(core.a1.tone(30)).isEqualTo(0xff0000ef);
- assertThat(core.a1.tone(20)).isEqualTo(0xff0001ac);
- assertThat(core.a1.tone(10)).isEqualTo(0xff00006e);
- assertThat(core.a1.tone(0)).isEqualTo(0xff000000);
-
- assertThat(core.a2.tone(100)).isEqualTo(0xffffffff);
- assertThat(core.a2.tone(95)).isEqualTo(0xfff1efff);
- assertThat(core.a2.tone(90)).isEqualTo(0xffe1e0f9);
- assertThat(core.a2.tone(80)).isEqualTo(0xffc5c4dd);
- assertThat(core.a2.tone(70)).isEqualTo(0xffa9a9c1);
- assertThat(core.a2.tone(60)).isEqualTo(0xff8f8fa6);
- assertThat(core.a2.tone(50)).isEqualTo(0xff75758b);
- assertThat(core.a2.tone(40)).isEqualTo(0xff5c5d72);
- assertThat(core.a2.tone(30)).isEqualTo(0xff444559);
- assertThat(core.a2.tone(20)).isEqualTo(0xff2e2f42);
- assertThat(core.a2.tone(10)).isEqualTo(0xff191a2c);
- assertThat(core.a2.tone(0)).isEqualTo(0xff000000);
- }
-
- @Test
- public void keyTones_contentOfBlue() {
- CorePalette core = CorePalette.contentOf(0xff0000ff);
-
- assertThat(core.a1.tone(100)).isEqualTo(0xffffffff);
- assertThat(core.a1.tone(95)).isEqualTo(0xfff1efff);
- assertThat(core.a1.tone(90)).isEqualTo(0xffe0e0ff);
- assertThat(core.a1.tone(80)).isEqualTo(0xffbec2ff);
- assertThat(core.a1.tone(70)).isEqualTo(0xff9da3ff);
- assertThat(core.a1.tone(60)).isEqualTo(0xff7c84ff);
- assertThat(core.a1.tone(50)).isEqualTo(0xff5a64ff);
- assertThat(core.a1.tone(40)).isEqualTo(0xff343dff);
- assertThat(core.a1.tone(30)).isEqualTo(0xff0000ef);
- assertThat(core.a1.tone(20)).isEqualTo(0xff0001ac);
- assertThat(core.a1.tone(10)).isEqualTo(0xff00006e);
- assertThat(core.a1.tone(0)).isEqualTo(0xff000000);
-
- assertThat(core.a2.tone(100)).isEqualTo(0xffffffff);
- assertThat(core.a2.tone(95)).isEqualTo(0xfff1efff);
- assertThat(core.a2.tone(90)).isEqualTo(0xffe0e0ff);
- assertThat(core.a2.tone(80)).isEqualTo(0xffc1c3f4);
- assertThat(core.a2.tone(70)).isEqualTo(0xffa5a7d7);
- assertThat(core.a2.tone(60)).isEqualTo(0xff8b8dbb);
- assertThat(core.a2.tone(50)).isEqualTo(0xff7173a0);
- assertThat(core.a2.tone(40)).isEqualTo(0xff585b86);
- assertThat(core.a2.tone(30)).isEqualTo(0xff40436d);
- assertThat(core.a2.tone(20)).isEqualTo(0xff2a2d55);
- assertThat(core.a2.tone(10)).isEqualTo(0xff14173f);
- assertThat(core.a2.tone(0)).isEqualTo(0xff000000);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/QuantizerMapTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/QuantizerMapTest.java
deleted file mode 100644
index 6a282a1fdb7c..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/QuantizerMapTest.java
+++ /dev/null
@@ -1,93 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.quantize.QuantizerMap;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.Map;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class QuantizerMapTest extends SysuiTestCase {
- private static final int RED = 0xffff0000;
- private static final int GREEN = 0xff00ff00;
- private static final int BLUE = 0xff0000ff;
- private static final QuantizerMap quantizer = new QuantizerMap();
-
- @Test
- public void quantize_1R() {
- Map<Integer, Integer> answer = quantizer.quantize(new int[]{RED}, 128).colorToCount;
-
- assertThat(answer).hasSize(1);
- assertThat(answer).containsEntry(RED, 1);
- }
-
- @Test
- public void quantize_1G() {
- Map<Integer, Integer> answer = quantizer.quantize(new int[]{GREEN}, 128).colorToCount;
-
- assertThat(answer).hasSize(1);
- assertThat(answer).containsEntry(GREEN, 1);
- }
-
- @Test
- public void quantize_1B() {
- Map<Integer, Integer> answer = quantizer.quantize(new int[]{BLUE}, 128).colorToCount;
-
- assertThat(answer).hasSize(1);
- assertThat(answer).containsEntry(BLUE, 1);
- }
-
- @Test
- public void quantize_5B() {
- Map<Integer, Integer> answer =
- quantizer.quantize(new int[]{BLUE, BLUE, BLUE, BLUE, BLUE}, 128).colorToCount;
-
- assertThat(answer).hasSize(1);
- assertThat(answer).containsEntry(BLUE, 5);
- }
-
- @Test
- public void quantize_2R3G() {
- Map<Integer, Integer> answer =
- quantizer.quantize(new int[]{RED, RED, GREEN, GREEN, GREEN}, 128).colorToCount;
-
- assertThat(answer).hasSize(2);
- assertThat(answer).containsEntry(RED, 2);
- assertThat(answer).containsEntry(GREEN, 3);
- }
-
- @Test
- public void quantize_1R1G1B() {
- Map<Integer, Integer> answer =
- quantizer.quantize(new int[]{RED, GREEN, BLUE}, 128).colorToCount;
-
- assertThat(answer).hasSize(3);
- assertThat(answer).containsEntry(RED, 1);
- assertThat(answer).containsEntry(GREEN, 1);
- assertThat(answer).containsEntry(BLUE, 1);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/README.md b/packages/SystemUI/tests/src/com/android/systemui/monet/README.md
deleted file mode 100644
index a3e025700a26..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-The tests in this folder are imported from Google's internal source repository.
-
-For instructions on importing, see:
- frameworks/base/packages/SystemUI/tests/src/com/android/systemui/monet/README \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java
deleted file mode 100644
index 704aed81e9c4..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java
+++ /dev/null
@@ -1,253 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeContent;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeContentTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff080CFF);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff656DD3);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff81009F);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff767684);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff757589);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF1218FF);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF0001C3);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF000181);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF5660FF);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF2D36FF);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E3);
- }
-
- @Test
- public void lightTheme_minContrast_tertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFB042CC);
- }
-
- @Test
- public void lightTheme_standardContrast_tertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF9221AF);
- }
-
- @Test
- public void lightTheme_maxContrast_tertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF73008E);
- }
-
- @Test
- public void lightTheme_minContrast_objectionableTertiaryContainerLightens() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFD03A71);
- }
-
- @Test
- public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFAC1B57);
- }
-
- @Test
- public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF870040);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCBCDFF);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCECFFF);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFD6D6FF);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF5660FF);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFBEC2FF);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFF6F4FF);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFFC4C6FF);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF7A83FF);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFA4AAFF);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF0001C6);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFCF60EA);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFEB8CFF);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF63007B);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java
deleted file mode 100644
index 32a589d0ea6e..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java
+++ /dev/null
@@ -1,199 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeExpressive;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeExpressiveTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff35855F);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff8C6D8C);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff806EA1);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff79757F);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff7A7585);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff924b28);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff401400);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff6f3010);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff99512e);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff351000);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffd0bc);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffb595);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfffff3ee);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffbb9e);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xfff99f75);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff622706);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java
deleted file mode 100644
index 6844a92185e0..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java
+++ /dev/null
@@ -1,254 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeFidelity;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeFidelityTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff080CFF);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff656DD3);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff9D0002);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff767684);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff757589);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff1218ff);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0001c3);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5660ff);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff2d36ff);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3);
- }
-
- @Test
- public void lightTheme_minContrast_tertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd93628);
- }
-
- @Test
- public void lightTheme_standardContrast_tertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb31910);
- }
-
- @Test
- public void lightTheme_maxContrast_tertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff8c0002);
- }
-
- @Test
- public void lightTheme_minContrast_objectionableTertiaryContainerLightens() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a);
- }
-
- @Test
- public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a);
- }
-
- @Test
- public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4d4300);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcbcdff);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcecfff);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff7a83ff);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa4aaff);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfffe513e);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffFF9181);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff790001);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d);
- }
-
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java
deleted file mode 100644
index 4bca2c4f08f4..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java
+++ /dev/null
@@ -1,254 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeFruitSalad;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeFruitSaladTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff0091C0);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff3A7E9E);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff6E72AC);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff777682);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff75758B);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007ea7);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff006688);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff002635);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffC2E8FF);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffC2E8FF);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff004862);
- }
-
- @Test
- public void lightTheme_minContrast_tertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffE0E0FF);
- }
-
- @Test
- public void lightTheme_standardContrast_tertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffE0E0FF);
- }
-
- @Test
- public void lightTheme_maxContrast_tertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xFF3A3E74);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff006C90);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff001E2B);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffACE1FF);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007EA7);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF76D1FF);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFECF7FF);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xFF004D67);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xFF004D67);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xFF83D5FF);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff55C0F2);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffC2E8FF);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff003E54);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffADB0EF);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffe0e0ff);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff30346A);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c);
- }
-
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java
deleted file mode 100644
index d5114222c2a0..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java
+++ /dev/null
@@ -1,252 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeMonochrome;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeMonochromeTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff3c3c3c);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5f5f5f);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3b3b3b);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3a3a3a);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d9d9);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcdcdcd);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffcccccc);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffa3a3a3);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd4d4d4);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd5d5d5);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff393939);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff000000);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff404040);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd1d1d1);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff000000);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff393939);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-
- @Test
- public void darkTheme_monochromeSpec() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(100);
- assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(10);
- assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(85);
- assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(0);
- assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(80);
- assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(10);
- assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(30);
- assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(90);
- assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(90);
- assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(10);
- assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(60);
- assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(0);
- }
-
- @Test
- public void lightTheme_monochromeSpec() {
- SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(0);
- assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(90);
- assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(25);
- assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(100);
- assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(40);
- assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(100);
- assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(85);
- assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(10);
- assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(25);
- assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(90);
- assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(49);
- assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(100);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java
deleted file mode 100644
index 4f3fc7d50b61..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java
+++ /dev/null
@@ -1,217 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeNeutral;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeNeutralTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff767685);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff777680);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff75758B);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff787678);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff787678);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5d5d6c);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff21212e);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff414250);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff636372);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff1a1b27);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d8ea);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffc6c5d6);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffcac9da);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffb5b3c4);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff373846);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb3b3cb);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffe1e0f9);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff37374b);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java
deleted file mode 100644
index ece3f9a16c48..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java
+++ /dev/null
@@ -1,253 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeRainbow;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeRainbowTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff696FC4);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff75758B);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff936B84);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff070707);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5056A9);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0F136A);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffE0E0FF);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffE0E0FF);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff34398B);
- }
-
- @Test
- public void lightTheme_minContrast_tertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffffd8ee);
- }
-
- @Test
- public void lightTheme_standardContrast_tertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffffd8ee);
- }
-
- @Test
- public void lightTheme_maxContrast_tertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff5A384E);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff565CB0);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff050865);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffd6d6ff);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff383E8F);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff383E8F);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffc4c6ff);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffa9afff);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffe0e0ff);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff292f81);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffd5a8c3);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xffffd8ee);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(
- 0xff4f2e44);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTest.java
deleted file mode 100644
index 859b65ba408e..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTest.java
+++ /dev/null
@@ -1,201 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.scheme.Scheme;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeTest extends SysuiTestCase {
-
- @Test
- public void lightScheme_ofBlue() {
- Scheme scheme = Scheme.light(0xff0000ff);
- assertThat(scheme.getPrimary()).isSameColorAs(0xff343DFF);
- }
-
- @Test
- public void darkScheme_ofBlue() {
- Scheme scheme = Scheme.dark(0xff0000ff);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffBEC2FF);
- }
-
- @Test
- public void thirdPartyScheme_light() {
- Scheme scheme = Scheme.light(0xff6750A4);
- assertThat(scheme.getPrimary()).isSameColorAs(0xff6750A4);
- assertThat(scheme.getSecondary()).isSameColorAs(0xff625B71);
- assertThat(scheme.getTertiary()).isSameColorAs(0xff7e5260);
- assertThat(scheme.getSurface()).isSameColorAs(0xfffffbff);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xff1c1b1e);
- }
-
- @Test
- public void thirdPartyScheme_dark() {
- Scheme scheme = Scheme.dark(0xff6750A4);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffcfbcff);
- assertThat(scheme.getSecondary()).isSameColorAs(0xffcbc2db);
- assertThat(scheme.getTertiary()).isSameColorAs(0xffefb8c8);
- assertThat(scheme.getSurface()).isSameColorAs(0xff1c1b1e);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xffe6e1e6);
- }
-
- @Test
- public void lightSchemeFromHighChromaColor() {
- Scheme scheme = Scheme.light(0xfffa2bec);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffab00a2);
- assertThat(scheme.getOnPrimary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getPrimaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getOnPrimaryContainer()).isSameColorAs(0xff390035);
- assertThat(scheme.getSecondary()).isSameColorAs(0xff6e5868);
- assertThat(scheme.getOnSecondary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getSecondaryContainer()).isSameColorAs(0xfff8daee);
- assertThat(scheme.getOnSecondaryContainer()).isSameColorAs(0xff271624);
- assertThat(scheme.getTertiary()).isSameColorAs(0xff815343);
- assertThat(scheme.getOnTertiary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getTertiaryContainer()).isSameColorAs(0xffffdbd0);
- assertThat(scheme.getOnTertiaryContainer()).isSameColorAs(0xff321207);
- assertThat(scheme.getError()).isSameColorAs(0xffba1a1a);
- assertThat(scheme.getOnError()).isSameColorAs(0xffffffff);
- assertThat(scheme.getErrorContainer()).isSameColorAs(0xffffdad6);
- assertThat(scheme.getOnErrorContainer()).isSameColorAs(0xff410002);
- assertThat(scheme.getBackground()).isSameColorAs(0xfffffbff);
- assertThat(scheme.getOnBackground()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getSurface()).isSameColorAs(0xfffffbff);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getSurfaceVariant()).isSameColorAs(0xffeedee7);
- assertThat(scheme.getOnSurfaceVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getOutline()).isSameColorAs(0xff80747b);
- assertThat(scheme.getOutlineVariant()).isSameColorAs(0xffd2c2cb);
- assertThat(scheme.getShadow()).isSameColorAs(0xff000000);
- assertThat(scheme.getScrim()).isSameColorAs(0xff000000);
- assertThat(scheme.getInverseSurface()).isSameColorAs(0xff342f32);
- assertThat(scheme.getInverseOnSurface()).isSameColorAs(0xfff8eef2);
- assertThat(scheme.getInversePrimary()).isSameColorAs(0xffffabee);
- }
-
- @Test
- public void darkSchemeFromHighChromaColor() {
- Scheme scheme = Scheme.dark(0xfffa2bec);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffffabee);
- assertThat(scheme.getOnPrimary()).isSameColorAs(0xff5c0057);
- assertThat(scheme.getPrimaryContainer()).isSameColorAs(0xff83007b);
- assertThat(scheme.getOnPrimaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getSecondary()).isSameColorAs(0xffdbbed1);
- assertThat(scheme.getOnSecondary()).isSameColorAs(0xff3e2a39);
- assertThat(scheme.getSecondaryContainer()).isSameColorAs(0xff554050);
- assertThat(scheme.getOnSecondaryContainer()).isSameColorAs(0xfff8daee);
- assertThat(scheme.getTertiary()).isSameColorAs(0xfff5b9a5);
- assertThat(scheme.getOnTertiary()).isSameColorAs(0xff4c2619);
- assertThat(scheme.getTertiaryContainer()).isSameColorAs(0xff663c2d);
- assertThat(scheme.getOnTertiaryContainer()).isSameColorAs(0xffffdbd0);
- assertThat(scheme.getError()).isSameColorAs(0xffffb4ab);
- assertThat(scheme.getOnError()).isSameColorAs(0xff690005);
- assertThat(scheme.getErrorContainer()).isSameColorAs(0xff93000a);
- assertThat(scheme.getOnErrorContainer()).isSameColorAs(0xffffb4ab);
- assertThat(scheme.getBackground()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getOnBackground()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getSurface()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getSurfaceVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getOnSurfaceVariant()).isSameColorAs(0xffd2c2cb);
- assertThat(scheme.getOutline()).isSameColorAs(0xff9a8d95);
- assertThat(scheme.getOutlineVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getShadow()).isSameColorAs(0xff000000);
- assertThat(scheme.getScrim()).isSameColorAs(0xff000000);
- assertThat(scheme.getInverseSurface()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getInverseOnSurface()).isSameColorAs(0xff342f32);
- assertThat(scheme.getInversePrimary()).isSameColorAs(0xffab00a2);
- }
-
- @Test
- public void lightContentSchemeFromHighChromaColor() {
- Scheme scheme = Scheme.lightContent(0xfffa2bec);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffab00a2);
- assertThat(scheme.getOnPrimary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getPrimaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getOnPrimaryContainer()).isSameColorAs(0xff390035);
- assertThat(scheme.getSecondary()).isSameColorAs(0xff7f4e75);
- assertThat(scheme.getOnSecondary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getSecondaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getOnSecondaryContainer()).isSameColorAs(0xff330b2f);
- assertThat(scheme.getTertiary()).isSameColorAs(0xff9c4323);
- assertThat(scheme.getOnTertiary()).isSameColorAs(0xffffffff);
- assertThat(scheme.getTertiaryContainer()).isSameColorAs(0xffffdbd0);
- assertThat(scheme.getOnTertiaryContainer()).isSameColorAs(0xff390c00);
- assertThat(scheme.getError()).isSameColorAs(0xffba1a1a);
- assertThat(scheme.getOnError()).isSameColorAs(0xffffffff);
- assertThat(scheme.getErrorContainer()).isSameColorAs(0xffffdad6);
- assertThat(scheme.getOnErrorContainer()).isSameColorAs(0xff410002);
- assertThat(scheme.getBackground()).isSameColorAs(0xfffffbff);
- assertThat(scheme.getOnBackground()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getSurface()).isSameColorAs(0xfffffbff);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getSurfaceVariant()).isSameColorAs(0xffeedee7);
- assertThat(scheme.getOnSurfaceVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getOutline()).isSameColorAs(0xff80747b);
- assertThat(scheme.getOutlineVariant()).isSameColorAs(0xffd2c2cb);
- assertThat(scheme.getShadow()).isSameColorAs(0xff000000);
- assertThat(scheme.getScrim()).isSameColorAs(0xff000000);
- assertThat(scheme.getInverseSurface()).isSameColorAs(0xff342f32);
- assertThat(scheme.getInverseOnSurface()).isSameColorAs(0xfff8eef2);
- assertThat(scheme.getInversePrimary()).isSameColorAs(0xffffabee);
- }
-
- @Test
- public void darkContentSchemeFromHighChromaColor() {
- Scheme scheme = Scheme.darkContent(0xfffa2bec);
- assertThat(scheme.getPrimary()).isSameColorAs(0xffffabee);
- assertThat(scheme.getOnPrimary()).isSameColorAs(0xff5c0057);
- assertThat(scheme.getPrimaryContainer()).isSameColorAs(0xff83007b);
- assertThat(scheme.getOnPrimaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getSecondary()).isSameColorAs(0xfff0b4e1);
- assertThat(scheme.getOnSecondary()).isSameColorAs(0xff4b2145);
- assertThat(scheme.getSecondaryContainer()).isSameColorAs(0xff64375c);
- assertThat(scheme.getOnSecondaryContainer()).isSameColorAs(0xffffd7f3);
- assertThat(scheme.getTertiary()).isSameColorAs(0xffffb59c);
- assertThat(scheme.getOnTertiary()).isSameColorAs(0xff5c1900);
- assertThat(scheme.getTertiaryContainer()).isSameColorAs(0xff7d2c0d);
- assertThat(scheme.getOnTertiaryContainer()).isSameColorAs(0xffffdbd0);
- assertThat(scheme.getError()).isSameColorAs(0xffffb4ab);
- assertThat(scheme.getOnError()).isSameColorAs(0xff690005);
- assertThat(scheme.getErrorContainer()).isSameColorAs(0xff93000a);
- assertThat(scheme.getOnErrorContainer()).isSameColorAs(0xffffb4ab);
- assertThat(scheme.getBackground()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getOnBackground()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getSurface()).isSameColorAs(0xff1f1a1d);
- assertThat(scheme.getOnSurface()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getSurfaceVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getOnSurfaceVariant()).isSameColorAs(0xffd2c2cb);
- assertThat(scheme.getOutline()).isSameColorAs(0xff9a8d95);
- assertThat(scheme.getOutlineVariant()).isSameColorAs(0xff4e444b);
- assertThat(scheme.getShadow()).isSameColorAs(0xff000000);
- assertThat(scheme.getScrim()).isSameColorAs(0xff000000);
- assertThat(scheme.getInverseSurface()).isSameColorAs(0xffeae0e4);
- assertThat(scheme.getInverseOnSurface()).isSameColorAs(0xff342f32);
- assertThat(scheme.getInversePrimary()).isSameColorAs(0xffab00a2);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java
deleted file mode 100644
index 01d199b02f26..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java
+++ /dev/null
@@ -1,362 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeTonalSpot;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeTonalSpotTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff6E72AC);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff75758B);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff936B84);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff78767A);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff777680);
- }
-
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff545999);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff161a59);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff383c7c);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff5a5fa0);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0e1253);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_minContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff5f5e65);
- }
-
- @Test
- public void lightTheme_standardContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1b1b21);
- }
-
- @Test
- public void lightTheme_maxContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1a1a20);
- }
-
- @Test
- public void lightTheme_minContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffcfcfe7);
- }
-
- @Test
- public void lightTheme_standardContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void lightTheme_maxContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffababc3);
- }
-
- @Test
- public void lightTheme_minContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfff3c3df);
- }
-
- @Test
- public void lightTheme_standardContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void lightTheme_maxContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffcda0bb);
- }
-
- @Test
- public void lightTheme_minContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffc2bb);
- }
-
- @Test
- public void lightTheme_standardContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffffff);
- }
-
- @Test
- public void lightTheme_maxContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffff8d80);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffabaff7);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff2e3271);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd5a8c3);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffffd8ee);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4f2e44);
- }
-
- @Test
- public void darkTheme_minContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xfffffbff);
- }
-
- @Test
- public void darkTheme_standardContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff2e2f42);
- }
-
- @Test
- public void darkTheme_maxContrast_onSecondary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff505165);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfffffbff);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff46263b);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiary() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff6b485f);
- }
-
- @Test
- public void darkTheme_minContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xfffffbff);
- }
-
- @Test
- public void darkTheme_standardContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xff690005);
- }
-
- @Test
- public void darkTheme_maxContrast_onError() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffa80710);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318);
- }
-
- @Test
- public void darkTheme_minContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffa4a2a9);
- }
-
- @Test
- public void darkTheme_standardContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe4e1e9);
- }
-
- @Test
- public void darkTheme_maxContrast_onSurface() {
- SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe5e2ea);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java
deleted file mode 100644
index 0fb53eb6066c..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java
+++ /dev/null
@@ -1,217 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.scheme.SchemeVibrant;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@Ignore("b/279581953")
-@SmallTest
-@RunWith(JUnit4.class)
-public final class SchemeVibrantTest extends SysuiTestCase {
-
- private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors();
-
- @Test
- public void testKeyColors() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0);
-
- assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff080CFF);
- assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff7B7296);
- assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff886C9D);
- assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff777682);
- assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme))
- .isSameColorAs(0xff767685);
- }
-
- @Test
- public void lightTheme_minContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff);
- }
-
- @Test
- public void lightTheme_standardContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff343dff);
- }
-
- @Test
- public void lightTheme_maxContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181);
- }
-
- @Test
- public void lightTheme_minContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void lightTheme_standardContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void lightTheme_maxContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3);
- }
-
- @Test
- public void lightTheme_minContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff3e47ff);
- }
-
- @Test
- public void lightTheme_standardContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff00006e);
- }
-
- @Test
- public void lightTheme_maxContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff);
- }
-
- @Test
- public void lightTheme_minContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_standardContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void lightTheme_maxContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff);
- }
-
- @Test
- public void darkTheme_minContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff);
- }
-
- @Test
- public void darkTheme_standardContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff);
- }
-
- @Test
- public void darkTheme_maxContrast_primary() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff);
- }
-
- @Test
- public void darkTheme_minContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef);
- }
-
- @Test
- public void darkTheme_standardContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef);
- }
-
- @Test
- public void darkTheme_maxContrast_primaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff);
- }
-
- @Test
- public void darkTheme_minContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa9afff);
- }
-
- @Test
- public void darkTheme_standardContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff);
- }
-
- @Test
- public void darkTheme_maxContrast_onPrimaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6);
- }
-
- @Test
- public void darkTheme_minContrast_onTertiaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffc9a9df);
- }
-
- @Test
- public void darkTheme_standardContrast_onTertiaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfff2daff);
- }
-
- @Test
- public void darkTheme_maxContrast_onTertiaryContainer() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff472e5b);
- }
-
- @Test
- public void darkTheme_minContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-
- @Test
- public void darkTheme_standardContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-
- @Test
- public void darkTheme_maxContrast_surface() {
- SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0);
- assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ScoreTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/ScoreTest.java
deleted file mode 100644
index 47ad43c87a38..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/ScoreTest.java
+++ /dev/null
@@ -1,72 +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.monet;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.score.Score;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class ScoreTest extends SysuiTestCase {
-
- @Test
- public void score_picksMostChromatic() {
- Map<Integer, Integer> colorsToPopulation = new HashMap<>();
- colorsToPopulation.put(0xFF0000FF, 1);
- colorsToPopulation.put(0xFFFF0000, 1);
- colorsToPopulation.put(0xFF00FF00, 1);
-
- List<Integer> scores = Score.score(colorsToPopulation);
-
- assertThat(scores.get(0)).isEqualTo(0xffff0000);
- assertThat(scores.get(1)).isEqualTo(0xff00ff00);
- assertThat(scores.get(2)).isEqualTo(0xff0000ff);
- }
-
- @Test
- public void score_usesGblueFallback() {
- Map<Integer, Integer> colorsToPopulation = new HashMap<>();
- colorsToPopulation.put(0xFF000000, 1);
-
- List<Integer> scores = Score.score(colorsToPopulation);
-
- assertThat(scores).containsExactly(0xff4285f4);
- }
-
- @Test
- public void score_dedupesNearbyHues() {
- Map<Integer, Integer> colorsToPopulation = new HashMap<>();
- colorsToPopulation.put(0xff008772, 1);
- colorsToPopulation.put(0xff318477, 1);
-
- List<Integer> scores = Score.score(colorsToPopulation);
-
- assertThat(scores).containsExactly(0xff008772);
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/TemperatureCacheTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/TemperatureCacheTest.java
deleted file mode 100644
index c304e92e445e..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/TemperatureCacheTest.java
+++ /dev/null
@@ -1,127 +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.monet;
-
-import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.monet.hct.Hct;
-import com.android.systemui.monet.temperature.TemperatureCache;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.List;
-
-@SmallTest
-@RunWith(JUnit4.class)
-public final class TemperatureCacheTest extends SysuiTestCase {
-
- @Test
- public void testRawTemperature() {
- final Hct blueHct = Hct.fromInt(0xff0000ff);
- final double blueTemp = TemperatureCache.rawTemperature(blueHct);
- assertEquals(-1.393, blueTemp, 0.001);
-
- final Hct redHct = Hct.fromInt(0xffff0000);
- final double redTemp = TemperatureCache.rawTemperature(redHct);
- assertEquals(2.351, redTemp, 0.001);
-
- final Hct greenHct = Hct.fromInt(0xff00ff00);
- final double greenTemp = TemperatureCache.rawTemperature(greenHct);
- assertEquals(-0.267, greenTemp, 0.001);
-
- final Hct whiteHct = Hct.fromInt(0xffffffff);
- final double whiteTemp = TemperatureCache.rawTemperature(whiteHct);
- assertEquals(-0.5, whiteTemp, 0.001);
-
- final Hct blackHct = Hct.fromInt(0xff000000);
- final double blackTemp = TemperatureCache.rawTemperature(blackHct);
- assertEquals(-0.5, blackTemp, 0.001);
- }
-
- @Test
- public void testComplement() {
- final int blueComplement =
- new TemperatureCache(Hct.fromInt(0xff0000ff)).getComplement().toInt();
- assertThat(0xff9D0002).isSameColorAs(blueComplement);
-
- final int redComplement = new TemperatureCache(
- Hct.fromInt(0xffff0000)).getComplement().toInt();
- assertThat(0xff007BFC).isSameColorAs(redComplement);
-
- final int greenComplement =
- new TemperatureCache(Hct.fromInt(0xff00ff00)).getComplement().toInt();
- assertThat(0xffFFD2C9).isSameColorAs(greenComplement);
-
- final int whiteComplement =
- new TemperatureCache(Hct.fromInt(0xffffffff)).getComplement().toInt();
- assertThat(0xffffffff).isSameColorAs(whiteComplement);
-
- final int blackComplement =
- new TemperatureCache(Hct.fromInt(0xff000000)).getComplement().toInt();
- assertThat(0xff000000).isSameColorAs(blackComplement);
- }
-
- @Test
- public void testAnalogous() {
- final List<Hct> blueAnalogous =
- new TemperatureCache(Hct.fromInt(0xff0000ff)).getAnalogousColors();
- assertThat(0xff00590C).isSameColorAs(blueAnalogous.get(0).toInt());
- assertThat(0xff00564E).isSameColorAs(blueAnalogous.get(1).toInt());
- assertThat(0xff0000ff).isSameColorAs(blueAnalogous.get(2).toInt());
- assertThat(0xff6700CC).isSameColorAs(blueAnalogous.get(3).toInt());
- assertThat(0xff81009F).isSameColorAs(blueAnalogous.get(4).toInt());
-
- final List<Hct> redAnalogous =
- new TemperatureCache(Hct.fromInt(0xffff0000)).getAnalogousColors();
- assertThat(0xffF60082).isSameColorAs(redAnalogous.get(0).toInt());
- assertThat(0xffFC004C).isSameColorAs(redAnalogous.get(1).toInt());
- assertThat(0xffff0000).isSameColorAs(redAnalogous.get(2).toInt());
- assertThat(0xffD95500).isSameColorAs(redAnalogous.get(3).toInt());
- assertThat(0xffAF7200).isSameColorAs(redAnalogous.get(4).toInt());
-
- final List<Hct> greenAnalogous =
- new TemperatureCache(Hct.fromInt(0xff00ff00)).getAnalogousColors();
- assertThat(0xffCEE900).isSameColorAs(greenAnalogous.get(0).toInt());
- assertThat(0xff92F500).isSameColorAs(greenAnalogous.get(1).toInt());
- assertThat(0xff00ff00).isSameColorAs(greenAnalogous.get(2).toInt());
- assertThat(0xff00FD6F).isSameColorAs(greenAnalogous.get(3).toInt());
- assertThat(0xff00FAB3).isSameColorAs(greenAnalogous.get(4).toInt());
-
- final List<Hct> blackAnalogous =
- new TemperatureCache(Hct.fromInt(0xff000000)).getAnalogousColors();
- assertThat(0xff000000).isSameColorAs(blackAnalogous.get(0).toInt());
- assertThat(0xff000000).isSameColorAs(blackAnalogous.get(1).toInt());
- assertThat(0xff000000).isSameColorAs(blackAnalogous.get(2).toInt());
- assertThat(0xff000000).isSameColorAs(blackAnalogous.get(3).toInt());
- assertThat(0xff000000).isSameColorAs(blackAnalogous.get(4).toInt());
-
- final List<Hct> whiteAnalogous =
- new TemperatureCache(Hct.fromInt(0xffffffff)).getAnalogousColors();
- assertThat(0xffffffff).isSameColorAs(whiteAnalogous.get(0).toInt());
- assertThat(0xffffffff).isSameColorAs(whiteAnalogous.get(1).toInt());
- assertThat(0xffffffff).isSameColorAs(whiteAnalogous.get(2).toInt());
- assertThat(0xffffffff).isSameColorAs(whiteAnalogous.get(3).toInt());
- assertThat(0xffffffff).isSameColorAs(whiteAnalogous.get(4).toInt());
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/utils/ArgbSubject.java b/packages/SystemUI/tests/src/com/android/systemui/monet/utils/ArgbSubject.java
deleted file mode 100644
index f3040c815f0e..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/utils/ArgbSubject.java
+++ /dev/null
@@ -1,59 +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.monet.utils;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureMetadata;
-import com.google.common.truth.Subject;
-
-/** Enables assertions involving colors as integers to log as hex codes instead of raw integers. */
-public final class ArgbSubject extends Subject {
-
- public static ArgbSubject assertThat(int argb) {
- return assertAbout(ArgbSubject::new).that(argb);
- }
-
- private final int actual;
-
- private ArgbSubject(FailureMetadata failureMetadata, int subject) {
- super(failureMetadata, subject);
- this.actual = subject;
- }
-
- @Override
- protected String actualCustomStringRepresentation() {
- return userFriendlyHexCode(actual);
- }
-
- public void isSameColorAs(int otherArgb) {
- if (otherArgb != actual) {
- failWithActual("color", userFriendlyHexCode(otherArgb));
- }
- }
-
- private static String userFriendlyHexCode(int integer) {
- String hexString = Integer.toHexString(integer);
- if (hexString.length() > 6) {
- return String.format("#%s", hexString.substring(hexString.length() - 6));
- } else if (hexString.length() == 6) {
- return String.format("#%s", hexString);
- } else {
- return String.format("??? #%s", hexString);
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/retail/data/repository/RetailModeSettingsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/retail/data/repository/RetailModeSettingsRepositoryTest.kt
index d7682b20a98d..421c35595026 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/retail/data/repository/RetailModeSettingsRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/retail/data/repository/RetailModeSettingsRepositoryTest.kt
@@ -26,6 +26,7 @@ import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -51,6 +52,7 @@ class RetailModeSettingsRepositoryTest : SysuiTestCase() {
fun retailMode_defaultFalse() =
testScope.runTest {
val value by collectLastValue(underTest.retailMode)
+ runCurrent()
assertThat(value).isFalse()
assertThat(underTest.inRetailMode).isFalse()
@@ -60,6 +62,7 @@ class RetailModeSettingsRepositoryTest : SysuiTestCase() {
fun retailMode_false() =
testScope.runTest {
val value by collectLastValue(underTest.retailMode)
+ runCurrent()
globalSettings.putInt(SETTING, 0)
@@ -71,6 +74,7 @@ class RetailModeSettingsRepositoryTest : SysuiTestCase() {
fun retailMode_true() =
testScope.runTest {
val value by collectLastValue(underTest.retailMode)
+ runCurrent()
globalSettings.putInt(SETTING, 1)
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 202c7bf0d5fd..47ca49d03cc7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -97,6 +97,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteracto
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
+import com.android.systemui.keyguard.ui.view.KeyguardRootView;
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel;
@@ -314,6 +315,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
@Mock private ShadeInteractor mShadeInteractor;
@Mock private JavaAdapter mJavaAdapter;
@Mock private CastController mCastController;
+ @Mock private KeyguardRootView mKeyguardRootView;
protected final int mMaxUdfpsBurnInOffsetY = 5;
protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
@@ -618,7 +620,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
mKeyguardInteractor,
mActivityStarter,
mKeyguardViewConfigurator,
- mKeyguardFaceAuthInteractor);
+ mKeyguardFaceAuthInteractor,
+ mKeyguardRootView);
mNotificationPanelViewController.initDependencies(
mCentralSurfaces,
null,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index bf25f2975253..2501f85798aa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -55,6 +55,7 @@ import com.android.systemui.shade.carrier.ShadeCarrierGroupController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusIconContainer
+import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -123,6 +124,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
@Mock private lateinit var qsBatteryModeController: QsBatteryModeController
@Mock private lateinit var nextAlarmController: NextAlarmController
@Mock private lateinit var activityStarter: ActivityStarter
+ @Mock private lateinit var mStatusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory
@JvmField @Rule val mockitoRule = MockitoJUnit.rule()
var viewVisibility = View.GONE
@@ -194,6 +196,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
qsBatteryModeController,
nextAlarmController,
activityStarter,
+ mStatusOverlayHoverListenerFactory
)
whenever(view.isAttachedToWindow).thenReturn(true)
shadeHeaderController.init()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt
index c57b64db2c5c..5b919d9a6a82 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt
@@ -23,6 +23,7 @@ import android.testing.TestableLooper.RunWithLooper
import androidx.lifecycle.Lifecycle
import com.android.systemui.SysuiTestCase
import com.android.systemui.settings.UserTracker
+import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture
import com.android.wifitrackerlib.WifiEntry
import com.android.wifitrackerlib.WifiPickerTracker
@@ -31,7 +32,6 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
-import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyList
import org.mockito.Captor
import org.mockito.Mock
@@ -52,7 +52,7 @@ class AccessPointControllerImplTest : SysuiTestCase() {
private lateinit var userTracker: UserTracker
@Mock
private lateinit var wifiPickerTrackerFactory:
- AccessPointControllerImpl.WifiPickerTrackerFactory
+ WifiPickerTrackerFactory
@Mock
private lateinit var wifiPickerTracker: WifiPickerTracker
@Mock
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 045a63cd44a0..91aa1388c31e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
+import static com.android.systemui.flags.Flags.FP_LISTEN_OCCLUDING_APPS;
import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
@@ -125,12 +126,15 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
@Mock
private ViewRootImpl mViewRootImpl;
private final FakeSystemClock mSystemClock = new FakeSystemClock();
+ private FakeFeatureFlags mFeatureFlags;
private BiometricUnlockController mBiometricUnlockController;
- private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mFeatureFlags = new FakeFeatureFlags();
+ mFeatureFlags.set(FP_LISTEN_OCCLUDING_APPS, false);
+ mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
TestableResources res = getContext().getOrCreateTestableResources();
when(mKeyguardStateController.isShowing()).thenReturn(true);
when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true);
@@ -156,7 +160,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
mBiometricUnlockController.addListener(mBiometricUnlockEventsListener);
when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(mStrongAuthTracker);
when(mStatusBarKeyguardViewManager.getViewRootImpl()).thenReturn(mViewRootImpl);
- mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
}
@Test
@@ -428,7 +431,25 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
@Test
public void onFPFailureNoHaptics_notInteractive_showLockScreen() {
- // GIVEN no vibrator and device is dreaming
+ mFeatureFlags.set(FP_LISTEN_OCCLUDING_APPS, true);
+
+ // GIVEN no vibrator and device is not interactive
+ when(mVibratorHelper.hasVibrator()).thenReturn(false);
+ when(mUpdateMonitor.isDeviceInteractive()).thenReturn(false);
+ when(mUpdateMonitor.isDreaming()).thenReturn(false);
+
+ // WHEN FP fails
+ mBiometricUnlockController.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);
+
+ // THEN wakeup the device
+ verify(mPowerManager).wakeUp(anyLong(), anyInt(), anyString());
+ }
+
+ @Test
+ public void onFPFailureNoHaptics_notInteractive_showLockScreen_doNotListenOccludingApps() {
+ mFeatureFlags.set(FP_LISTEN_OCCLUDING_APPS, false);
+
+ // GIVEN no vibrator and device is not interactive
when(mVibratorHelper.hasVibrator()).thenReturn(false);
when(mUpdateMonitor.isDeviceInteractive()).thenReturn(false);
when(mUpdateMonitor.isDreaming()).thenReturn(false);
@@ -442,6 +463,24 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
@Test
public void onFPFailureNoHaptics_dreaming_showLockScreen() {
+ mFeatureFlags.set(FP_LISTEN_OCCLUDING_APPS, true);
+
+ // GIVEN no vibrator and device is dreaming
+ when(mVibratorHelper.hasVibrator()).thenReturn(false);
+ when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true);
+ when(mUpdateMonitor.isDreaming()).thenReturn(true);
+
+ // WHEN FP fails
+ mBiometricUnlockController.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);
+
+ // THEN never wakeup the device
+ verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
+ }
+
+ @Test
+ public void onFPFailureNoHaptics_dreaming_showLockScreen_doNotListeOccludingApps() {
+ mFeatureFlags.set(FP_LISTEN_OCCLUDING_APPS, false);
+
// GIVEN no vibrator and device is dreaming
when(mVibratorHelper.hasVibrator()).thenReturn(false);
when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index 530085191e96..4872deb10ee3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -513,6 +513,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mNotificationShadeWindowViewControllerLazy,
mNotificationShelfController,
mStackScrollerController,
+ mNotificationPresenter,
mDozeParameters,
mScrimController,
mLockscreenWallpaperLazy,
@@ -590,7 +591,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
// TODO(b/277764509): we should be able to call mCentralSurfaces.start() and have all the
// below values initialized automatically.
mCentralSurfaces.mDozeScrimController = mDozeScrimController;
- mCentralSurfaces.mPresenter = mNotificationPresenter;
mCentralSurfaces.mKeyguardIndicationController = mKeyguardIndicationController;
mCentralSurfaces.mBarService = mBarService;
mCentralSurfaces.mGestureWakeLock = mPowerManager.newWakeLock(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
index e838a480f3cc..d100c687d802 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
@@ -122,6 +122,7 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
@Mock private KeyguardLogger mLogger;
@Mock private NotificationMediaManager mNotificationMediaManager;
+ @Mock private StatusOverlayHoverListenerFactory mStatusOverlayHoverListenerFactory;
private TestShadeViewStateProvider mShadeViewStateProvider;
private KeyguardStatusBarView mKeyguardStatusBarView;
@@ -171,7 +172,8 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
mCommandQueue,
mFakeExecutor,
mLogger,
- mNotificationMediaManager
+ mNotificationMediaManager,
+ mStatusOverlayHoverListenerFactory
);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
index 7de0075c45ff..2e92bb948c60 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt
@@ -69,6 +69,8 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
@Mock
private lateinit var configurationController: ConfigurationController
@Mock
+ private lateinit var mStatusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory
+ @Mock
private lateinit var userChipViewModel: StatusBarUserChipViewModel
@Mock
private lateinit var centralSurfacesImpl: CentralSurfacesImpl
@@ -204,7 +206,8 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
sceneInteractor,
shadeLogger,
viewUtil,
- configurationController
+ configurationController,
+ mStatusOverlayHoverListenerFactory
).create(view).also {
it.init()
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListenerTest.kt
new file mode 100644
index 000000000000..63508e193bb8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListenerTest.kt
@@ -0,0 +1,192 @@
+/*
+ * 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.statusbar.phone
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.PaintDrawable
+import android.os.SystemClock
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import android.testing.TestableLooper.RunWithLooper
+import android.testing.ViewUtils
+import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroupOverlay
+import android.widget.LinearLayout
+import androidx.annotation.ColorInt
+import androidx.test.filters.SmallTest
+import com.android.systemui.R
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange
+import com.android.systemui.statusbar.policy.FakeConfigurationController
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.flow.MutableStateFlow
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.verify
+
+@RunWith(AndroidTestingRunner::class)
+@RunWithLooper(setAsMainLooper = true)
+@SmallTest
+class StatusOverlayHoverListenerTest : SysuiTestCase() {
+
+ private val viewOverlay = mock<ViewGroupOverlay>()
+ private val overlayCaptor = argumentCaptor<Drawable>()
+ private val darkDispatcher = mock<SysuiDarkIconDispatcher>()
+ private val darkChange: MutableStateFlow<DarkChange> = MutableStateFlow(DarkChange.EMPTY)
+
+ private val factory =
+ StatusOverlayHoverListenerFactory(
+ context.resources,
+ FakeConfigurationController(),
+ darkDispatcher
+ )
+ private val view = TestableStatusContainer(context, viewOverlay)
+
+ private lateinit var looper: TestableLooper
+
+ @Before
+ fun setUp() {
+ looper = TestableLooper.get(this)
+ whenever(darkDispatcher.darkChangeFlow()).thenReturn(darkChange)
+ }
+
+ @Test
+ fun onHoverStarted_addsOverlay() {
+ view.setUpHoverListener()
+
+ view.hoverStarted()
+
+ assertThat(overlayDrawable).isNotNull()
+ }
+
+ @Test
+ fun onHoverEnded_removesOverlay() {
+ view.setUpHoverListener()
+
+ view.hoverStarted() // stopped callback will be called only if hover has started
+ view.hoverStopped()
+
+ verify(viewOverlay).clear()
+ }
+
+ @Test
+ fun onHoverStarted_overlayHasLightColor() {
+ view.setUpHoverListener()
+
+ view.hoverStarted()
+
+ assertThat(overlayColor)
+ .isEqualTo(context.resources.getColor(R.color.status_bar_icons_hover_color_light))
+ }
+
+ @Test
+ fun onDarkAwareHoverStarted_withBlackIcons_overlayHasDarkColor() {
+ view.setUpDarkAwareHoverListener()
+ setIconsTint(Color.BLACK)
+
+ view.hoverStarted()
+
+ assertThat(overlayColor)
+ .isEqualTo(context.resources.getColor(R.color.status_bar_icons_hover_color_dark))
+ }
+
+ @Test
+ fun onHoverStarted_withBlackIcons_overlayHasLightColor() {
+ view.setUpHoverListener()
+ setIconsTint(Color.BLACK)
+
+ view.hoverStarted()
+
+ assertThat(overlayColor)
+ .isEqualTo(context.resources.getColor(R.color.status_bar_icons_hover_color_light))
+ }
+
+ @Test
+ fun onDarkAwareHoverStarted_withWhiteIcons_overlayHasLightColor() {
+ view.setUpDarkAwareHoverListener()
+ setIconsTint(Color.WHITE)
+
+ view.hoverStarted()
+
+ assertThat(overlayColor)
+ .isEqualTo(context.resources.getColor(R.color.status_bar_icons_hover_color_light))
+ }
+
+ private fun View.setUpHoverListener() {
+ setOnHoverListener(factory.createListener(view))
+ attachView(view)
+ }
+
+ private fun View.setUpDarkAwareHoverListener() {
+ setOnHoverListener(factory.createDarkAwareListener(view))
+ attachView(view)
+ }
+
+ private fun attachView(view: View) {
+ ViewUtils.attachView(view)
+ // attaching is async so processAllMessages is required for view.repeatWhenAttached to run
+ looper.processAllMessages()
+ }
+
+ private val overlayDrawable: Drawable
+ get() {
+ verify(viewOverlay).add(overlayCaptor.capture())
+ return overlayCaptor.value
+ }
+
+ private val overlayColor
+ get() = (overlayDrawable as PaintDrawable).paint.color
+
+ private fun setIconsTint(@ColorInt color: Int) {
+ // passing empty ArrayList is equivalent to just accepting passed color as icons color
+ darkChange.value = DarkChange(/* areas= */ ArrayList(), /* darkIntensity= */ 1f, color)
+ }
+
+ private fun TestableStatusContainer.hoverStarted() {
+ injectHoverEvent(hoverEvent(MotionEvent.ACTION_HOVER_ENTER))
+ }
+
+ private fun TestableStatusContainer.hoverStopped() {
+ injectHoverEvent(hoverEvent(MotionEvent.ACTION_HOVER_EXIT))
+ }
+
+ class TestableStatusContainer(context: Context, private val mockOverlay: ViewGroupOverlay) :
+ LinearLayout(context) {
+
+ fun injectHoverEvent(event: MotionEvent) = dispatchHoverEvent(event)
+
+ override fun getOverlay() = mockOverlay
+ }
+
+ private fun hoverEvent(action: Int): MotionEvent {
+ return MotionEvent.obtain(
+ /* downTime= */ SystemClock.uptimeMillis(),
+ /* eventTime= */ SystemClock.uptimeMillis(),
+ /* action= */ action,
+ /* x= */ 0f,
+ /* y= */ 0f,
+ /* metaState= */ 0
+ )
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
index 3cf5f5249f1a..fef042be65a8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
@@ -36,6 +36,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.RoboPilotTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
@@ -48,23 +49,25 @@ import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import java.util.concurrent.Executor
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
+/**
+ * Note: Any new tests added here may also need to be added to [WifiRepositoryViaTrackerLibTest].
+ */
@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -81,7 +84,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
private lateinit var executor: Executor
private lateinit var connectivityRepository: ConnectivityRepository
- private val dispatcher = UnconfinedTestDispatcher()
+ private val dispatcher = StandardTestDispatcher()
private val testScope = TestScope(dispatcher)
@Before
@@ -109,6 +112,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
whenever(wifiManager.isWifiEnabled).thenReturn(true)
underTest = createRepo()
+ testScope.runCurrent()
assertThat(underTest.isWifiEnabled.value).isTrue()
}
@@ -116,53 +120,43 @@ class WifiRepositoryImplTest : SysuiTestCase() {
@Test
fun isWifiEnabled_networkCapabilitiesChanged_valueUpdated() =
testScope.runTest {
- // We need to call launch on the flows so that they start updating
- val networkJob = underTest.wifiNetwork.launchIn(this)
- val enabledJob = underTest.isWifiEnabled.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
+ val latest by collectLastValue(underTest.isWifiEnabled)
whenever(wifiManager.isWifiEnabled).thenReturn(true)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
- assertThat(underTest.isWifiEnabled.value).isTrue()
+ assertThat(latest).isTrue()
whenever(wifiManager.isWifiEnabled).thenReturn(false)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
- assertThat(underTest.isWifiEnabled.value).isFalse()
-
- networkJob.cancel()
- enabledJob.cancel()
+ assertThat(latest).isFalse()
}
@Test
fun isWifiEnabled_networkLost_valueUpdated() =
testScope.runTest {
- // We need to call launch on the flows so that they start updating
- val networkJob = underTest.wifiNetwork.launchIn(this)
- val enabledJob = underTest.isWifiEnabled.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
+ val latest by collectLastValue(underTest.isWifiEnabled)
whenever(wifiManager.isWifiEnabled).thenReturn(true)
getNetworkCallback().onLost(NETWORK)
- assertThat(underTest.isWifiEnabled.value).isTrue()
+ assertThat(latest).isTrue()
whenever(wifiManager.isWifiEnabled).thenReturn(false)
getNetworkCallback().onLost(NETWORK)
- assertThat(underTest.isWifiEnabled.value).isFalse()
-
- networkJob.cancel()
- enabledJob.cancel()
+ assertThat(latest).isFalse()
}
@Test
fun isWifiEnabled_intentsReceived_valueUpdated() =
testScope.runTest {
- underTest = createRepo()
-
- val job = underTest.isWifiEnabled.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiEnabled)
whenever(wifiManager.isWifiEnabled).thenReturn(true)
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
@@ -170,7 +164,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
Intent(WifiManager.WIFI_STATE_CHANGED_ACTION),
)
- assertThat(underTest.isWifiEnabled.value).isTrue()
+ assertThat(latest).isTrue()
whenever(wifiManager.isWifiEnabled).thenReturn(false)
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
@@ -178,76 +172,61 @@ class WifiRepositoryImplTest : SysuiTestCase() {
Intent(WifiManager.WIFI_STATE_CHANGED_ACTION),
)
- assertThat(underTest.isWifiEnabled.value).isFalse()
-
- job.cancel()
+ assertThat(latest).isFalse()
}
@Test
fun isWifiEnabled_bothIntentAndNetworkUpdates_valueAlwaysUpdated() =
testScope.runTest {
- underTest = createRepo()
-
- val networkJob = underTest.wifiNetwork.launchIn(this)
- val enabledJob = underTest.isWifiEnabled.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
+ val latest by collectLastValue(underTest.isWifiEnabled)
whenever(wifiManager.isWifiEnabled).thenReturn(false)
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(WifiManager.WIFI_STATE_CHANGED_ACTION),
)
- assertThat(underTest.isWifiEnabled.value).isFalse()
+ assertThat(latest).isFalse()
whenever(wifiManager.isWifiEnabled).thenReturn(true)
getNetworkCallback().onLost(NETWORK)
- assertThat(underTest.isWifiEnabled.value).isTrue()
+ assertThat(latest).isTrue()
whenever(wifiManager.isWifiEnabled).thenReturn(false)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
- assertThat(underTest.isWifiEnabled.value).isFalse()
+ assertThat(latest).isFalse()
whenever(wifiManager.isWifiEnabled).thenReturn(true)
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(WifiManager.WIFI_STATE_CHANGED_ACTION),
)
- assertThat(underTest.isWifiEnabled.value).isTrue()
-
- networkJob.cancel()
- enabledJob.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_initiallyGetsDefault() =
- testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
-
- assertThat(underTest.isWifiDefault.value).isFalse()
-
- job.cancel()
- }
+ testScope.runTest { assertThat(underTest.isWifiDefault.value).isFalse() }
@Test
fun isWifiDefault_wifiNetwork_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val wifiInfo = mock<WifiInfo>().apply { whenever(this.ssid).thenReturn(SSID) }
getDefaultNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
/** Regression test for b/266628069. */
@Test
fun isWifiDefault_transportInfoIsNotWifi_andNoWifiTransport_false() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val transportInfo =
VpnTransportInfo(
@@ -264,16 +243,14 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, networkCapabilities)
- assertThat(underTest.isWifiDefault.value).isFalse()
-
- job.cancel()
+ assertThat(latest).isFalse()
}
/** Regression test for b/266628069. */
@Test
fun isWifiDefault_transportInfoIsNotWifi_butHasWifiTransport_true() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val transportInfo =
VpnTransportInfo(
@@ -290,15 +267,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, networkCapabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_carrierMergedViaCellular_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val carrierMergedInfo =
mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
@@ -312,15 +287,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_carrierMergedViaCellular_withVcnTransport_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -331,15 +304,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_carrierMergedViaWifi_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val carrierMergedInfo =
mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
@@ -353,15 +324,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_carrierMergedViaWifi_withVcnTransport_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -372,15 +341,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_cellularAndWifiTransports_usesCellular_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -391,15 +358,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_cellularNotVcnNetwork_isFalse() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -409,15 +374,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
- assertThat(underTest.isWifiDefault.value).isFalse()
-
- job.cancel()
+ assertThat(latest).isFalse()
}
@Test
fun isWifiDefault_isCarrierMergedViaUnderlyingWifi_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val underlyingNetwork = mock<Network>()
val carrierMergedInfo =
@@ -444,15 +407,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, mainCapabilities)
// THEN the wifi network is carrier merged, so wifi is default
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_isCarrierMergedViaUnderlyingCellular_isTrue() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
val underlyingCarrierMergedNetwork = mock<Network>()
val carrierMergedInfo =
@@ -478,46 +439,38 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, mainCapabilities)
// THEN the wifi network is carrier merged, so wifi is default
- assertThat(underTest.isWifiDefault.value).isTrue()
-
- job.cancel()
+ assertThat(latest).isTrue()
}
@Test
fun isWifiDefault_wifiNetworkLost_isFalse() =
testScope.runTest {
- val job = underTest.isWifiDefault.launchIn(this)
+ val latest by collectLastValue(underTest.isWifiDefault)
// First, add a network
getDefaultNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
- assertThat(underTest.isWifiDefault.value).isTrue()
+ assertThat(latest).isTrue()
// WHEN the network is lost
getDefaultNetworkCallback().onLost(NETWORK)
// THEN we update to false
- assertThat(underTest.isWifiDefault.value).isFalse()
-
- job.cancel()
+ assertThat(latest).isFalse()
}
@Test
fun wifiNetwork_initiallyGetsDefault() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
assertThat(latest).isEqualTo(WIFI_NETWORK_DEFAULT)
-
- job.cancel()
}
@Test
fun wifiNetwork_primaryWifiNetworkAdded_flowHasNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -533,15 +486,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(SSID)
-
- job.cancel()
}
@Test
fun wifiNetwork_isCarrierMerged_flowHasCarrierMerged() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -553,15 +503,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_isCarrierMergedViaUnderlyingWifi_flowHasCarrierMerged() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val underlyingNetwork = mock<Network>()
val carrierMergedInfo =
@@ -590,15 +537,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
// THEN the wifi network is carrier merged
assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_isCarrierMergedViaUnderlyingCellular_flowHasCarrierMerged() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val underlyingCarrierMergedNetwork = mock<Network>()
val carrierMergedInfo =
@@ -628,15 +572,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
// THEN the wifi network is carrier merged
assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_carrierMergedButInvalidSubId_flowHasInvalid() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -652,15 +593,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
)
assertThat(latest).isInstanceOf(WifiNetworkModel.Invalid::class.java)
-
- job.cancel()
}
@Test
fun wifiNetwork_isCarrierMerged_getsCorrectValues() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val rssi = -57
val wifiInfo =
@@ -687,15 +625,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
assertThat(latestCarrierMerged.level).isEqualTo(2)
// numberOfLevels = maxSignalLevel + 1
assertThat(latestCarrierMerged.numberOfLevels).isEqualTo(6)
-
- job.cancel()
}
@Test
fun wifiNetwork_notValidated_networkNotValidated() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(
@@ -704,15 +639,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
)
assertThat((latest as WifiNetworkModel.Active).isValidated).isFalse()
-
- job.cancel()
}
@Test
fun wifiNetwork_validated_networkValidated() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(
@@ -721,15 +653,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
)
assertThat((latest as WifiNetworkModel.Active).isValidated).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_nonPrimaryWifiNetworkAdded_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -741,16 +670,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
/** Regression test for b/266628069. */
@Test
fun wifiNetwork_transportInfoIsNotWifi_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val transportInfo =
VpnTransportInfo(
@@ -761,15 +687,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(transportInfo))
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_cellularVcnNetworkAdded_flowHasNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -783,15 +706,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(SSID)
-
- job.cancel()
}
@Test
fun wifiNetwork_nonPrimaryCellularVcnNetworkAdded_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -807,15 +727,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_cellularNotVcnNetworkAdded_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -826,15 +743,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_cellularAndWifiTransports_usesCellular() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val capabilities =
mock<NetworkCapabilities>().apply {
@@ -849,15 +763,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(SSID)
-
- job.cancel()
}
@Test
fun wifiNetwork_newPrimaryWifiNetwork_flowHasNewNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
// Start with the original network
getNetworkCallback()
@@ -882,15 +793,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(newNetworkId)
assertThat(latestActive.ssid).isEqualTo(newSsid)
-
- job.cancel()
}
@Test
fun wifiNetwork_newNonPrimaryWifiNetwork_flowHasOldNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
// Start with the original network
getNetworkCallback()
@@ -915,15 +823,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(SSID)
-
- job.cancel()
}
@Test
fun wifiNetwork_newNetworkCapabilities_flowHasNewData() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -958,30 +863,24 @@ class WifiRepositoryImplTest : SysuiTestCase() {
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(newSsid)
assertThat(latestActive.isValidated).isFalse()
-
- job.cancel()
}
@Test
fun wifiNetwork_noCurrentNetwork_networkLost_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
// WHEN we receive #onLost without any #onCapabilitiesChanged beforehand
getNetworkCallback().onLost(NETWORK)
// THEN there's no crash and we still have no network
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_currentActiveNetworkLost_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
@@ -992,16 +891,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
// THEN we update to no network
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
/** Possible regression test for b/278618530. */
@Test
fun wifiNetwork_currentCarrierMergedNetworkLost_flowHasNoNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1019,15 +915,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
// THEN we update to no network
assertThat(latest is WifiNetworkModel.Inactive).isTrue()
-
- job.cancel()
}
@Test
fun wifiNetwork_unknownNetworkLost_flowHasPreviousNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
@@ -1042,15 +935,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
val latestActive = latest as WifiNetworkModel.Active
assertThat(latestActive.networkId).isEqualTo(NETWORK_ID)
assertThat(latestActive.ssid).isEqualTo(SSID)
-
- job.cancel()
}
@Test
fun wifiNetwork_notCurrentNetworkLost_flowHasCurrentNetwork() =
testScope.runTest {
- var latest: WifiNetworkModel? = null
- val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
@@ -1067,16 +957,13 @@ class WifiRepositoryImplTest : SysuiTestCase() {
// THEN we still have the new network
assertThat((latest as WifiNetworkModel.Active).networkId).isEqualTo(newNetworkId)
-
- job.cancel()
}
/** Regression test for b/244173280. */
@Test
fun wifiNetwork_multipleSubscribers_newSubscribersGetCurrentValue() =
testScope.runTest {
- var latest1: WifiNetworkModel? = null
- val job1 = underTest.wifiNetwork.onEach { latest1 = it }.launchIn(this)
+ val latest1 by collectLastValue(underTest.wifiNetwork)
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(PRIMARY_WIFI_INFO))
@@ -1087,23 +974,19 @@ class WifiRepositoryImplTest : SysuiTestCase() {
assertThat(latest1Active.ssid).isEqualTo(SSID)
// WHEN we add a second subscriber after having already emitted a value
- var latest2: WifiNetworkModel? = null
- val job2 = underTest.wifiNetwork.onEach { latest2 = it }.launchIn(this)
+ val latest2 by collectLastValue(underTest.wifiNetwork)
// THEN the second subscribe receives the already-emitted value
assertThat(latest2 is WifiNetworkModel.Active).isTrue()
val latest2Active = latest2 as WifiNetworkModel.Active
assertThat(latest2Active.networkId).isEqualTo(NETWORK_ID)
assertThat(latest2Active.ssid).isEqualTo(SSID)
-
- job1.cancel()
- job2.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_inactiveNetwork_false() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1116,14 +999,12 @@ class WifiRepositoryImplTest : SysuiTestCase() {
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_carrierMergedNetwork_false() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1133,16 +1014,15 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
+ testScope.runCurrent()
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_invalidNetwork_false() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1156,16 +1036,15 @@ class WifiRepositoryImplTest : SysuiTestCase() {
NETWORK,
createWifiNetworkCapabilities(wifiInfo),
)
+ testScope.runCurrent()
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_activeNetwork_nullSsid_false() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1175,16 +1054,15 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
+ testScope.runCurrent()
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_activeNetwork_unknownSsid_false() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1194,16 +1072,15 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
+ testScope.runCurrent()
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_activeNetwork_validSsid_true() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
val wifiInfo =
mock<WifiInfo>().apply {
@@ -1213,16 +1090,15 @@ class WifiRepositoryImplTest : SysuiTestCase() {
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
+ testScope.runCurrent()
assertThat(underTest.isWifiConnectedWithValidSsid()).isTrue()
-
- job.cancel()
}
@Test
fun isWifiConnectedWithValidSsid_activeToInactive_trueToFalse() =
testScope.runTest {
- val job = underTest.wifiNetwork.launchIn(this)
+ collectLastValue(underTest.wifiNetwork)
// Start with active
val wifiInfo =
@@ -1232,71 +1108,60 @@ class WifiRepositoryImplTest : SysuiTestCase() {
}
getNetworkCallback()
.onCapabilitiesChanged(NETWORK, createWifiNetworkCapabilities(wifiInfo))
+ testScope.runCurrent()
+
assertThat(underTest.isWifiConnectedWithValidSsid()).isTrue()
// WHEN the network is lost
getNetworkCallback().onLost(NETWORK)
+ testScope.runCurrent()
// THEN the isWifiConnected updates
assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
-
- job.cancel()
}
@Test
fun wifiActivity_callbackGivesNone_activityFlowHasNone() =
testScope.runTest {
- var latest: DataActivityModel? = null
- val job = underTest.wifiActivity.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiActivity)
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_NONE)
assertThat(latest)
.isEqualTo(DataActivityModel(hasActivityIn = false, hasActivityOut = false))
-
- job.cancel()
}
@Test
fun wifiActivity_callbackGivesIn_activityFlowHasIn() =
testScope.runTest {
- var latest: DataActivityModel? = null
- val job = underTest.wifiActivity.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiActivity)
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_IN)
assertThat(latest)
.isEqualTo(DataActivityModel(hasActivityIn = true, hasActivityOut = false))
-
- job.cancel()
}
@Test
fun wifiActivity_callbackGivesOut_activityFlowHasOut() =
testScope.runTest {
- var latest: DataActivityModel? = null
- val job = underTest.wifiActivity.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiActivity)
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_OUT)
assertThat(latest)
.isEqualTo(DataActivityModel(hasActivityIn = false, hasActivityOut = true))
-
- job.cancel()
}
@Test
fun wifiActivity_callbackGivesInout_activityFlowHasInAndOut() =
testScope.runTest {
- var latest: DataActivityModel? = null
- val job = underTest.wifiActivity.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.wifiActivity)
getTrafficStateCallback().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT)
assertThat(latest)
.isEqualTo(DataActivityModel(hasActivityIn = true, hasActivityOut = true))
-
- job.cancel()
}
private fun createRepo(): WifiRepositoryImpl {
@@ -1314,18 +1179,21 @@ class WifiRepositoryImplTest : SysuiTestCase() {
}
private fun getTrafficStateCallback(): TrafficStateCallback {
+ testScope.runCurrent()
val callbackCaptor = argumentCaptor<TrafficStateCallback>()
verify(wifiManager).registerTrafficStateCallback(any(), callbackCaptor.capture())
return callbackCaptor.value!!
}
private fun getNetworkCallback(): ConnectivityManager.NetworkCallback {
+ testScope.runCurrent()
val callbackCaptor = argumentCaptor<ConnectivityManager.NetworkCallback>()
verify(connectivityManager).registerNetworkCallback(any(), callbackCaptor.capture())
return callbackCaptor.value!!
}
private fun getDefaultNetworkCallback(): ConnectivityManager.NetworkCallback {
+ testScope.runCurrent()
val callbackCaptor = argumentCaptor<ConnectivityManager.NetworkCallback>()
verify(connectivityManager).registerDefaultNetworkCallback(callbackCaptor.capture())
return callbackCaptor.value!!
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLibTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLibTest.kt
new file mode 100644
index 000000000000..7002cbb6ab21
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryViaTrackerLibTest.kt
@@ -0,0 +1,665 @@
+/*
+ * 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.statusbar.pipeline.wifi.data.repository.prod
+
+import android.net.wifi.WifiManager
+import android.net.wifi.WifiManager.UNKNOWN_SSID
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.statusbar.connectivity.WifiPickerTrackerFactory
+import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT
+import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.argumentCaptor
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.time.FakeSystemClock
+import com.android.wifitrackerlib.MergedCarrierEntry
+import com.android.wifitrackerlib.WifiEntry
+import com.android.wifitrackerlib.WifiPickerTracker
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+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.Test
+
+/**
+ * Note: Most of these tests are duplicates of [WifiRepositoryImplTest] tests.
+ *
+ * Any new tests added here may also need to be added to [WifiRepositoryImplTest].
+ */
+@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class WifiRepositoryViaTrackerLibTest : SysuiTestCase() {
+
+ private lateinit var underTest: WifiRepositoryViaTrackerLib
+
+ private val executor = FakeExecutor(FakeSystemClock())
+ private val logger = LogBuffer("name", maxSize = 100, logcatEchoTracker = mock())
+ private val tableLogger = mock<TableLogBuffer>()
+ private val wifiManager =
+ mock<WifiManager>().apply { whenever(this.maxSignalLevel).thenReturn(10) }
+ private val wifiPickerTrackerFactory = mock<WifiPickerTrackerFactory>()
+ private val wifiPickerTracker = mock<WifiPickerTracker>()
+
+ private val callbackCaptor = argumentCaptor<WifiPickerTracker.WifiPickerTrackerCallback>()
+
+ private val dispatcher = StandardTestDispatcher()
+ private val testScope = TestScope(dispatcher)
+
+ @Before
+ fun setUp() {
+ whenever(wifiPickerTrackerFactory.create(any(), capture(callbackCaptor)))
+ .thenReturn(wifiPickerTracker)
+ underTest = createRepo()
+ }
+
+ @Test
+ fun isWifiEnabled_enabled_true() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiEnabled)
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_ENABLED)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isTrue()
+ }
+
+ @Test
+ fun isWifiEnabled_enabling_false() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiEnabled)
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_ENABLING)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiEnabled_disabling_true() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiEnabled)
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_DISABLING)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiEnabled_disabled_false() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiEnabled)
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_DISABLED)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiEnabled_respondsToUpdates() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiEnabled)
+ executor.runAllReady()
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_ENABLED)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isTrue()
+
+ whenever(wifiPickerTracker.wifiState).thenReturn(WifiManager.WIFI_STATE_DISABLED)
+ getCallback().onWifiStateChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiDefault_initiallyGetsDefault() =
+ testScope.runTest { assertThat(underTest.isWifiDefault.value).isFalse() }
+
+ @Test
+ fun isWifiDefault_wifiNetwork_isTrue() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiDefault)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply { whenever(this.isDefaultNetwork).thenReturn(true) }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isTrue()
+ }
+
+ @Test
+ fun isWifiDefault_carrierMerged_isTrue() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiDefault)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isDefaultNetwork).thenReturn(true)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isTrue()
+ }
+
+ @Test
+ fun isWifiDefault_wifiNetworkNotDefault_isFalse() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiDefault)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply { whenever(this.isDefaultNetwork).thenReturn(false) }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiDefault_carrierMergedNotDefault_isFalse() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiDefault)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isDefaultNetwork).thenReturn(false)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun isWifiDefault_noWifiNetwork_isFalse() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isWifiDefault)
+
+ // First, add a network
+ val wifiEntry =
+ mock<WifiEntry>().apply { whenever(this.isDefaultNetwork).thenReturn(true) }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isTrue()
+
+ // WHEN the network is lost
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+
+ // THEN we update to false
+ assertThat(latest).isFalse()
+ }
+
+ @Test
+ fun wifiNetwork_initiallyGetsDefault() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ assertThat(latest).isEqualTo(WIFI_NETWORK_DEFAULT)
+ }
+
+ @Test
+ fun wifiNetwork_primaryWifiNetworkAdded_flowHasNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(3)
+ whenever(this.ssid).thenReturn(SSID)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest is WifiNetworkModel.Active).isTrue()
+ val latestActive = latest as WifiNetworkModel.Active
+ assertThat(latestActive.level).isEqualTo(3)
+ assertThat(latestActive.ssid).isEqualTo(SSID)
+ }
+
+ @Test
+ fun wifiNetwork_isCarrierMerged_flowHasCarrierMerged() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(3)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
+ val latestMerged = latest as WifiNetworkModel.CarrierMerged
+ assertThat(latestMerged.level).isEqualTo(3)
+ // numberOfLevels = maxSignalLevel + 1
+ }
+
+ @Test
+ fun wifiNetwork_isCarrierMerged_getsMaxSignalLevel() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ whenever(wifiManager.maxSignalLevel).thenReturn(5)
+
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
+ val latestMerged = latest as WifiNetworkModel.CarrierMerged
+ // numberOfLevels = maxSignalLevel + 1
+ assertThat(latestMerged.numberOfLevels).isEqualTo(6)
+ }
+
+ /* TODO(b/292534484): Re-enable this test once WifiTrackerLib gives us the subscription ID.
+ @Test
+ fun wifiNetwork_carrierMergedButInvalidSubId_flowHasInvalid() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiInfo =
+ mock<WifiInfo>().apply {
+ whenever(this.isPrimary).thenReturn(true)
+ whenever(this.isCarrierMerged).thenReturn(true)
+ whenever(this.subscriptionId).thenReturn(INVALID_SUBSCRIPTION_ID)
+ }
+
+ getNetworkCallback()
+ .onCapabilitiesChanged(
+ NETWORK,
+ createWifiNetworkCapabilities(wifiInfo),
+ )
+
+ assertThat(latest).isInstanceOf(WifiNetworkModel.Invalid::class.java)
+ }
+
+ */
+
+ @Test
+ fun wifiNetwork_notValidated_networkNotValidated() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.hasInternetAccess()).thenReturn(false)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat((latest as WifiNetworkModel.Active).isValidated).isFalse()
+ }
+
+ @Test
+ fun wifiNetwork_validated_networkValidated() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.hasInternetAccess()).thenReturn(true)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat((latest as WifiNetworkModel.Active).isValidated).isTrue()
+ }
+
+ @Test
+ fun wifiNetwork_nonPrimaryWifiNetworkAdded_flowHasNoNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply { whenever(this.isPrimaryNetwork).thenReturn(false) }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isEqualTo(WifiNetworkModel.Inactive)
+ }
+
+ @Test
+ fun wifiNetwork_nonPrimaryCarrierMergedNetworkAdded_flowHasNoNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(false)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest).isEqualTo(WifiNetworkModel.Inactive)
+ }
+
+ @Test
+ fun wifiNetwork_newPrimaryWifiNetwork_flowHasNewNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ // Start with the original network
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(3)
+ whenever(this.ssid).thenReturn("AB")
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest is WifiNetworkModel.Active).isTrue()
+ var latestActive = latest as WifiNetworkModel.Active
+ assertThat(latestActive.level).isEqualTo(3)
+ assertThat(latestActive.ssid).isEqualTo("AB")
+
+ // WHEN we update to a new primary network
+ val newWifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(4)
+ whenever(this.ssid).thenReturn("CD")
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(newWifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ // THEN we use the new network
+ assertThat(latest is WifiNetworkModel.Active).isTrue()
+ latestActive = latest as WifiNetworkModel.Active
+ assertThat(latestActive.level).isEqualTo(4)
+ assertThat(latestActive.ssid).isEqualTo("CD")
+ }
+
+ @Test
+ fun wifiNetwork_noCurrentNetwork_networkLost_flowHasNoNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ // WHEN we receive a null network without any networks beforehand
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+
+ // THEN there's no crash and we still have no network
+ assertThat(latest is WifiNetworkModel.Inactive).isTrue()
+ }
+
+ @Test
+ fun wifiNetwork_currentActiveNetworkLost_flowHasNoNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.ssid).thenReturn(SSID)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat((latest as WifiNetworkModel.Active).ssid).isEqualTo(SSID)
+
+ // WHEN we lose our current network
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+
+ // THEN we update to no network
+ assertThat(latest is WifiNetworkModel.Inactive).isTrue()
+ }
+
+ /** Possible regression test for b/278618530. */
+ @Test
+ fun wifiNetwork_currentCarrierMergedNetworkLost_flowHasNoNetwork() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(3)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest is WifiNetworkModel.CarrierMerged).isTrue()
+ assertThat((latest as WifiNetworkModel.CarrierMerged).level).isEqualTo(3)
+
+ // WHEN we lose our current network
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+
+ // THEN we update to no network
+ assertThat(latest is WifiNetworkModel.Inactive).isTrue()
+ }
+
+ /** Regression test for b/244173280. */
+ @Test
+ fun wifiNetwork_multipleSubscribers_newSubscribersGetCurrentValue() =
+ testScope.runTest {
+ val latest1 by collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.level).thenReturn(1)
+ whenever(this.ssid).thenReturn(SSID)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(latest1 is WifiNetworkModel.Active).isTrue()
+ val latest1Active = latest1 as WifiNetworkModel.Active
+ assertThat(latest1Active.level).isEqualTo(1)
+ assertThat(latest1Active.ssid).isEqualTo(SSID)
+
+ // WHEN we add a second subscriber after having already emitted a value
+ val latest2 by collectLastValue(underTest.wifiNetwork)
+
+ // THEN the second subscribe receives the already-emitted value
+ assertThat(latest2 is WifiNetworkModel.Active).isTrue()
+ val latest2Active = latest2 as WifiNetworkModel.Active
+ assertThat(latest2Active.level).isEqualTo(1)
+ assertThat(latest2Active.ssid).isEqualTo(SSID)
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_inactiveNetwork_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_nonPrimaryNetwork_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply { whenever(this.isPrimaryNetwork).thenReturn(false) }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_carrierMergedNetwork_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<MergedCarrierEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ /* TODO(b/292534484): Re-enable this test once WifiTrackerLib gives us the subscription ID.
+ @Test
+ fun isWifiConnectedWithValidSsid_invalidNetwork_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiInfo =
+ mock<WifiInfo>().apply {
+ whenever(this.isPrimary).thenReturn(true)
+ whenever(this.isCarrierMerged).thenReturn(true)
+ whenever(this.subscriptionId).thenReturn(INVALID_SUBSCRIPTION_ID)
+ }
+
+ getNetworkCallback()
+ .onCapabilitiesChanged(
+ NETWORK,
+ createWifiNetworkCapabilities(wifiInfo),
+ )
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ */
+
+ @Test
+ fun isWifiConnectedWithValidSsid_activeNetwork_nullSsid_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.ssid).thenReturn(null)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_activeNetwork_unknownSsid_false() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.ssid).thenReturn(UNKNOWN_SSID)
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_activeNetwork_validSsid_true() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.ssid).thenReturn("fakeSsid")
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isTrue()
+ }
+
+ @Test
+ fun isWifiConnectedWithValidSsid_activeToInactive_trueToFalse() =
+ testScope.runTest {
+ collectLastValue(underTest.wifiNetwork)
+
+ // Start with active
+ val wifiEntry =
+ mock<WifiEntry>().apply {
+ whenever(this.isPrimaryNetwork).thenReturn(true)
+ whenever(this.ssid).thenReturn("fakeSsid")
+ }
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(wifiEntry)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isTrue()
+
+ // WHEN the network is lost
+ whenever(wifiPickerTracker.connectedWifiEntry).thenReturn(null)
+ getCallback().onWifiEntriesChanged()
+ testScope.runCurrent()
+
+ // THEN the isWifiConnected updates
+ assertThat(underTest.isWifiConnectedWithValidSsid()).isFalse()
+ }
+
+ private fun getCallback(): WifiPickerTracker.WifiPickerTrackerCallback {
+ testScope.runCurrent()
+ return callbackCaptor.value
+ }
+
+ private fun createRepo(): WifiRepositoryViaTrackerLib {
+ return WifiRepositoryViaTrackerLib(
+ testScope.backgroundScope,
+ executor,
+ wifiPickerTrackerFactory,
+ wifiManager,
+ logger,
+ tableLogger,
+ )
+ }
+
+ private companion object {
+ const val SSID = "AB"
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
index fc2277b9c803..6fe88c100fdc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
@@ -17,7 +17,9 @@
package com.android.systemui.statusbar.pipeline.wifi.domain.interactor
import android.net.wifi.WifiManager
+import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.systemui.RoboPilotTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
@@ -25,18 +27,22 @@ import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnec
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.yield
import org.junit.Before
import org.junit.Test
+import org.junit.runner.RunWith
@OptIn(ExperimentalCoroutinesApi::class)
@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
@SmallTest
+@RoboPilotTest
+@RunWith(AndroidJUnit4::class)
class WifiInteractorImplTest : SysuiTestCase() {
private lateinit var underTest: WifiInteractor
@@ -44,6 +50,8 @@ class WifiInteractorImplTest : SysuiTestCase() {
private lateinit var connectivityRepository: FakeConnectivityRepository
private lateinit var wifiRepository: FakeWifiRepository
+ private val testScope = TestScope()
+
@Before
fun setUp() {
connectivityRepository = FakeConnectivityRepository()
@@ -53,11 +61,12 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_unavailableNetwork_outputsNull() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(WifiNetworkModel.Unavailable)
var latest: String? = "default"
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isNull()
@@ -66,11 +75,12 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_inactiveNetwork_outputsNull() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(WifiNetworkModel.Inactive)
var latest: String? = "default"
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isNull()
@@ -79,13 +89,14 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_carrierMergedNetwork_outputsNull() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(
WifiNetworkModel.CarrierMerged(networkId = 1, subscriptionId = 2, level = 1)
)
var latest: String? = "default"
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isNull()
@@ -94,7 +105,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_isPasspointAccessPoint_outputsPasspointName() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(
WifiNetworkModel.Active(
networkId = 1,
@@ -106,6 +117,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
var latest: String? = null
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isEqualTo("friendly")
@@ -114,7 +126,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_isOnlineSignUpForPasspoint_outputsPasspointName() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(
WifiNetworkModel.Active(
networkId = 1,
@@ -126,6 +138,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
var latest: String? = null
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isEqualTo("friendly")
@@ -134,7 +147,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_unknownSsid_outputsNull() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(
WifiNetworkModel.Active(
networkId = 1,
@@ -145,6 +158,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
var latest: String? = "default"
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isNull()
@@ -153,7 +167,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun ssid_validSsid_outputsSsid() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
wifiRepository.setWifiNetwork(
WifiNetworkModel.Active(
networkId = 1,
@@ -164,6 +178,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
var latest: String? = null
val job = underTest.ssid.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isEqualTo("MyAwesomeWifiNetwork")
@@ -172,7 +187,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun isEnabled_matchesRepoIsEnabled() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
var latest: Boolean? = null
val job = underTest.isEnabled.onEach { latest = it }.launchIn(this)
@@ -193,7 +208,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun isDefault_matchesRepoIsDefault() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
var latest: Boolean? = null
val job = underTest.isDefault.onEach { latest = it }.launchIn(this)
@@ -214,7 +229,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun wifiNetwork_matchesRepoWifiNetwork() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
val wifiNetwork =
WifiNetworkModel.Active(
networkId = 45,
@@ -227,6 +242,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
var latest: WifiNetworkModel? = null
val job = underTest.wifiNetwork.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isEqualTo(wifiNetwork)
@@ -235,7 +251,7 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun activity_matchesRepoWifiActivity() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
var latest: DataActivityModel? = null
val job = underTest.activity.onEach { latest = it }.launchIn(this)
@@ -259,11 +275,12 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun isForceHidden_repoHasWifiHidden_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.WIFI))
var latest: Boolean? = null
val job = underTest.isForceHidden.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isTrue()
@@ -272,16 +289,15 @@ class WifiInteractorImplTest : SysuiTestCase() {
@Test
fun isForceHidden_repoDoesNotHaveWifiHidden_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
connectivityRepository.setForceHiddenIcons(setOf())
var latest: Boolean? = null
val job = underTest.isForceHidden.onEach { latest = it }.launchIn(this)
+ runCurrent()
assertThat(latest).isFalse()
job.cancel()
}
}
-
-private val IMMEDIATE = Dispatchers.Main.immediate
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
index cb469ead83cb..bdeba2a2f4c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
@@ -16,8 +16,11 @@
package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel
+import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.systemui.RoboPilotTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
@@ -36,23 +39,19 @@ import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkMode
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.yield
-import org.junit.After
+import kotlinx.coroutines.test.TestScope
+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.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
-@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
@SmallTest
+@RoboPilotTest
+@RunWith(AndroidJUnit4::class)
class WifiViewModelTest : SysuiTestCase() {
private lateinit var underTest: WifiViewModel
@@ -66,7 +65,7 @@ class WifiViewModelTest : SysuiTestCase() {
private lateinit var interactor: WifiInteractor
private lateinit var airplaneModeViewModel: AirplaneModeViewModel
private val shouldShowSignalSpacerProviderFlow = MutableStateFlow(false)
- private lateinit var scope: CoroutineScope
+ private val testScope = TestScope()
@Before
fun setUp() {
@@ -76,7 +75,6 @@ class WifiViewModelTest : SysuiTestCase() {
wifiRepository = FakeWifiRepository()
wifiRepository.setIsWifiEnabled(true)
interactor = WifiInteractorImpl(connectivityRepository, wifiRepository)
- scope = CoroutineScope(IMMEDIATE)
airplaneModeViewModel =
AirplaneModeViewModelImpl(
AirplaneModeInteractor(
@@ -84,17 +82,12 @@ class WifiViewModelTest : SysuiTestCase() {
connectivityRepository,
),
tableLogBuffer,
- scope,
+ testScope.backgroundScope,
)
createAndSetViewModel()
}
- @After
- fun tearDown() {
- scope.cancel()
- }
-
// See [WifiViewModelIconParameterizedTest] for additional view model tests.
// Note on testing: [WifiViewModel] exposes 3 different instances of
@@ -104,104 +97,65 @@ class WifiViewModelTest : SysuiTestCase() {
@Test
fun wifiIcon_allLocationViewModelsReceiveSameData() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
val home = viewModelForLocation(underTest, StatusBarLocation.HOME)
val keyguard = viewModelForLocation(underTest, StatusBarLocation.KEYGUARD)
val qs = viewModelForLocation(underTest, StatusBarLocation.QS)
- var latestHome: WifiIcon? = null
- val jobHome = home.wifiIcon.onEach { latestHome = it }.launchIn(this)
-
- var latestKeyguard: WifiIcon? = null
- val jobKeyguard = keyguard.wifiIcon.onEach { latestKeyguard = it }.launchIn(this)
-
- var latestQs: WifiIcon? = null
- val jobQs = qs.wifiIcon.onEach { latestQs = it }.launchIn(this)
+ val latestHome by collectLastValue(home.wifiIcon)
+ val latestKeyguard by collectLastValue(keyguard.wifiIcon)
+ val latestQs by collectLastValue(qs.wifiIcon)
wifiRepository.setWifiNetwork(
WifiNetworkModel.Active(NETWORK_ID, isValidated = true, level = 1)
)
- yield()
assertThat(latestHome).isInstanceOf(WifiIcon.Visible::class.java)
assertThat(latestHome).isEqualTo(latestKeyguard)
assertThat(latestKeyguard).isEqualTo(latestQs)
-
- jobHome.cancel()
- jobKeyguard.cancel()
- jobQs.cancel()
}
@Test
fun activity_showActivityConfigFalse_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(false)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var activityIn: Boolean? = null
- val activityInJob =
- underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this)
-
- var activityOut: Boolean? = null
- val activityOutJob =
- underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this)
-
- var activityContainer: Boolean? = null
- val activityContainerJob =
- underTest.isActivityContainerVisible
- .onEach { activityContainer = it }
- .launchIn(this)
+ val activityIn by collectLastValue(underTest.isActivityInViewVisible)
+ val activityOut by collectLastValue(underTest.isActivityOutViewVisible)
+ val activityContainer by collectLastValue(underTest.isActivityContainerVisible)
// Verify that on launch, we receive false.
assertThat(activityIn).isFalse()
assertThat(activityOut).isFalse()
assertThat(activityContainer).isFalse()
-
- activityInJob.cancel()
- activityOutJob.cancel()
- activityContainerJob.cancel()
}
@Test
fun activity_showActivityConfigFalse_noUpdatesReceived() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(false)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var activityIn: Boolean? = null
- val activityInJob =
- underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this)
-
- var activityOut: Boolean? = null
- val activityOutJob =
- underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this)
-
- var activityContainer: Boolean? = null
- val activityContainerJob =
- underTest.isActivityContainerVisible
- .onEach { activityContainer = it }
- .launchIn(this)
+ val activityIn by collectLastValue(underTest.isActivityInViewVisible)
+ val activityOut by collectLastValue(underTest.isActivityOutViewVisible)
+ val activityContainer by collectLastValue(underTest.isActivityContainerVisible)
// WHEN we update the repo to have activity
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
// THEN we didn't update to the new activity (because our config is false)
assertThat(activityIn).isFalse()
assertThat(activityOut).isFalse()
assertThat(activityContainer).isFalse()
-
- activityInJob.cancel()
- activityOutJob.cancel()
- activityContainerJob.cancel()
}
@Test
fun activity_nullSsid_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
@@ -209,38 +163,23 @@ class WifiViewModelTest : SysuiTestCase() {
WifiNetworkModel.Active(NETWORK_ID, ssid = null, level = 1)
)
- var activityIn: Boolean? = null
- val activityInJob =
- underTest.isActivityInViewVisible.onEach { activityIn = it }.launchIn(this)
-
- var activityOut: Boolean? = null
- val activityOutJob =
- underTest.isActivityOutViewVisible.onEach { activityOut = it }.launchIn(this)
-
- var activityContainer: Boolean? = null
- val activityContainerJob =
- underTest.isActivityContainerVisible
- .onEach { activityContainer = it }
- .launchIn(this)
+ val activityIn by collectLastValue(underTest.isActivityInViewVisible)
+ val activityOut by collectLastValue(underTest.isActivityOutViewVisible)
+ val activityContainer by collectLastValue(underTest.isActivityContainerVisible)
// WHEN we update the repo to have activity
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
// THEN we still output false because our network's SSID is null
assertThat(activityIn).isFalse()
assertThat(activityOut).isFalse()
assertThat(activityContainer).isFalse()
-
- activityInJob.cancel()
- activityOutJob.cancel()
- activityContainerJob.cancel()
}
@Test
fun activity_allLocationViewModelsReceiveSameData() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
@@ -249,250 +188,187 @@ class WifiViewModelTest : SysuiTestCase() {
val keyguard = viewModelForLocation(underTest, StatusBarLocation.KEYGUARD)
val qs = viewModelForLocation(underTest, StatusBarLocation.QS)
- var latestHome: Boolean? = null
- val jobHome = home.isActivityInViewVisible.onEach { latestHome = it }.launchIn(this)
-
- var latestKeyguard: Boolean? = null
- val jobKeyguard =
- keyguard.isActivityInViewVisible.onEach { latestKeyguard = it }.launchIn(this)
-
- var latestQs: Boolean? = null
- val jobQs = qs.isActivityInViewVisible.onEach { latestQs = it }.launchIn(this)
+ val latestHome by collectLastValue(home.isActivityInViewVisible)
+ val latestKeyguard by collectLastValue(keyguard.isActivityInViewVisible)
+ val latestQs by collectLastValue(qs.isActivityInViewVisible)
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latestHome).isTrue()
assertThat(latestKeyguard).isTrue()
assertThat(latestQs).isTrue()
-
- jobHome.cancel()
- jobKeyguard.cancel()
- jobQs.cancel()
}
@Test
fun activityIn_hasActivityInTrue_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityInViewVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityInViewVisible)
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun activityIn_hasActivityInFalse_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityInViewVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityInViewVisible)
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun activityOut_hasActivityOutTrue_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityOutViewVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityOutViewVisible)
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun activityOut_hasActivityOutFalse_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityOutViewVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityOutViewVisible)
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun activityContainer_hasActivityInTrue_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityContainerVisible)
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = false)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun activityContainer_hasActivityOutTrue_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityContainerVisible)
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun activityContainer_inAndOutTrue_outputsTrue() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityContainerVisible)
val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun activityContainer_inAndOutFalse_outputsFalse() =
- runBlocking(IMMEDIATE) {
+ testScope.runTest {
whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
createAndSetViewModel()
wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
- var latest: Boolean? = null
- val job = underTest.isActivityContainerVisible.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.isActivityContainerVisible)
val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
wifiRepository.setWifiActivity(activity)
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun airplaneSpacer_notAirplaneMode_outputsFalse() =
- runBlocking(IMMEDIATE) {
- var latest: Boolean? = null
- val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this)
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isAirplaneSpacerVisible)
airplaneModeRepository.setIsAirplaneMode(false)
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun airplaneSpacer_airplaneForceHidden_outputsFalse() =
- runBlocking(IMMEDIATE) {
- var latest: Boolean? = null
- val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this)
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isAirplaneSpacerVisible)
airplaneModeRepository.setIsAirplaneMode(true)
connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.AIRPLANE))
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun airplaneSpacer_airplaneIconVisible_outputsTrue() =
- runBlocking(IMMEDIATE) {
- var latest: Boolean? = null
- val job = underTest.isAirplaneSpacerVisible.onEach { latest = it }.launchIn(this)
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isAirplaneSpacerVisible)
airplaneModeRepository.setIsAirplaneMode(true)
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
@Test
fun signalSpacer_firstSubNotShowingNetworkTypeIcon_outputsFalse() =
- runBlocking(IMMEDIATE) {
- var latest: Boolean? = null
- val job = underTest.isSignalSpacerVisible.onEach { latest = it }.launchIn(this)
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isSignalSpacerVisible)
shouldShowSignalSpacerProviderFlow.value = false
- yield()
assertThat(latest).isFalse()
-
- job.cancel()
}
@Test
fun signalSpacer_firstSubIsShowingNetworkTypeIcon_outputsTrue() =
- runBlocking(IMMEDIATE) {
- var latest: Boolean? = null
- val job = underTest.isSignalSpacerVisible.onEach { latest = it }.launchIn(this)
+ testScope.runTest {
+ val latest by collectLastValue(underTest.isSignalSpacerVisible)
shouldShowSignalSpacerProviderFlow.value = true
- yield()
assertThat(latest).isTrue()
-
- job.cancel()
}
private fun createAndSetViewModel() {
@@ -507,7 +383,7 @@ class WifiViewModelTest : SysuiTestCase() {
context,
tableLogBuffer,
interactor,
- scope,
+ testScope.backgroundScope,
wifiConstants,
)
}
@@ -518,5 +394,3 @@ class WifiViewModelTest : SysuiTestCase() {
WifiNetworkModel.Active(NETWORK_ID, ssid = "AB", level = 1)
}
}
-
-private val IMMEDIATE = Dispatchers.Main.immediate
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
index 5b418eddc4f5..5a54aff72af4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
@@ -692,6 +692,7 @@ class UserInteractorTest : SysuiTestCase() {
val userInfos = createUserInfos(count = 2, includeGuest = false)
userRepository.setUserInfos(userInfos)
userRepository.setSelectedUserInfo(userInfos[0])
+ runCurrent()
val refreshUsersCallCount = userRepository.refreshUsersCallCount
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
@@ -712,6 +713,7 @@ class UserInteractorTest : SysuiTestCase() {
val userInfos = createUserInfos(count = 2, includeGuest = false)
userRepository.setUserInfos(userInfos)
userRepository.setSelectedUserInfo(userInfos[0])
+ runCurrent()
val refreshUsersCallCount = userRepository.refreshUsersCallCount
fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
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 8428566270de..e6894d7240f8 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
@@ -22,6 +22,7 @@ import com.android.systemui.common.shared.model.Position
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
import com.android.systemui.keyguard.shared.model.BiometricUnlockSource
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
+import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.ScreenModel
import com.android.systemui.keyguard.shared.model.ScreenState
import com.android.systemui.keyguard.shared.model.StatusBarState
@@ -115,6 +116,20 @@ class FakeKeyguardRepository : KeyguardRepository {
private val _isQuickSettingsVisible = MutableStateFlow(false)
override val isQuickSettingsVisible: Flow<Boolean> = _isQuickSettingsVisible.asStateFlow()
+ private val _keyguardAlpha = MutableStateFlow(1f)
+ override val keyguardAlpha: StateFlow<Float> = _keyguardAlpha
+
+ private val _keyguardRootViewVisibility =
+ MutableStateFlow(
+ KeyguardRootViewVisibilityState(
+ 0,
+ goingToFullShade = false,
+ occlusionTransitionRunning = false
+ )
+ )
+ override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> =
+ _keyguardRootViewVisibility.asStateFlow()
+
override fun setQuickSettingsVisible(isVisible: Boolean) {
_isQuickSettingsVisible.value = isVisible
}
@@ -132,6 +147,8 @@ class FakeKeyguardRepository : KeyguardRepository {
_animateBottomAreaDozingTransitions.tryEmit(animate)
}
+
+ @Deprecated("Deprecated as part of b/278057014")
override fun setBottomAreaAlpha(alpha: Float) {
_bottomAreaAlpha.value = alpha
}
@@ -223,4 +240,18 @@ class FakeKeyguardRepository : KeyguardRepository {
override fun isUdfpsSupported(): Boolean {
return _isUdfpsSupported.value
}
+
+ override fun setKeyguardAlpha(alpha: Float) {
+ _keyguardAlpha.value = alpha
+ }
+
+ override fun setKeyguardVisibility(
+ statusBarState: Int,
+ goingToFullShade: Boolean,
+ occlusionTransitionRunning: Boolean
+ ) {
+ _keyguardRootViewVisibility.value = KeyguardRootViewVisibilityState(
+ statusBarState, goingToFullShade, occlusionTransitionRunning
+ )
+ }
}
diff --git a/packages/VpnDialogs/res/values-pt-rPT/strings.xml b/packages/VpnDialogs/res/values-pt-rPT/strings.xml
index 95f7c1abe0f3..c1be1d1c4b01 100644
--- a/packages/VpnDialogs/res/values-pt-rPT/strings.xml
+++ b/packages/VpnDialogs/res/values-pt-rPT/strings.xml
@@ -17,8 +17,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Pedido de ligação"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> pretende configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na fonte. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; aparece na parte superior do seu ecrã quando a VPN está ativa."</string>
- <string name="warning" product="tv" msgid="5188957997628124947">"A app <xliff:g id="APP">%s</xliff:g> pretende configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na origem. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; aparece no ecrã quando a VPN está ativa."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> quer configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na fonte. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; aparece na parte superior do seu ecrã quando a VPN está ativa."</string>
+ <string name="warning" product="tv" msgid="5188957997628124947">"A app <xliff:g id="APP">%s</xliff:g> quer configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na origem. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; aparece no ecrã quando a VPN está ativa."</string>
<string name="legacy_title" msgid="192936250066580964">"A VPN está ligada"</string>
<string name="session" msgid="6470628549473641030">"Sessão"</string>
<string name="duration" msgid="3584782459928719435">"Duração:"</string>
diff --git a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml
index 648e1d4cf383..b437b69e15bd 100644
--- a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml
+++ b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="display_cutout_emulation_overlay" msgid="3814493834951357513">"ከተቆረጠው አከባቢ በታች የመተግበሪያዎች ምስልን ስራ"</string>
+ <string name="display_cutout_emulation_overlay" msgid="3814493834951357513">"ከተቆረጠው አከባቢ በታች የመተግበሪያዎች ምስልን ሥራ"</string>
</resources>
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 58b61b36af17..c0967db47315 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -33,6 +33,7 @@ import static java.util.Arrays.asList;
import static java.util.Arrays.copyOfRange;
import android.accessibilityservice.MagnificationConfig;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiContext;
@@ -41,6 +42,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.PointF;
+import android.graphics.Rect;
import android.graphics.Region;
import android.os.Handler;
import android.os.Looper;
@@ -147,6 +149,20 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
private PointerCoords[] mTempPointerCoords;
private PointerProperties[] mTempPointerProperties;
+
+ @VisibleForTesting static final int OVERSCROLL_NONE = 0;
+ @VisibleForTesting static final int OVERSCROLL_LEFT_EDGE = 1;
+ @VisibleForTesting static final int OVERSCROLL_RIGHT_EDGE = 2;
+ @VisibleForTesting static final int OVERSCROLL_VERTICAL_EDGE = 3;
+
+ @IntDef({
+ OVERSCROLL_NONE,
+ OVERSCROLL_LEFT_EDGE,
+ OVERSCROLL_RIGHT_EDGE,
+ OVERSCROLL_VERTICAL_EDGE
+ })
+ public @interface OverscrollState {}
+
@VisibleForTesting boolean mIsSinglePanningEnabled;
public FullScreenMagnificationGestureHandler(@UiContext Context context,
FullScreenMagnificationController fullScreenMagnificationController,
@@ -842,8 +858,11 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
transitToPanningScalingStateAndClear();
} else if (mIsSinglePanningEnabled
&& isActivated()
- && event.getPointerCount() == 1
- && !isOverscroll(event)) {
+ && event.getPointerCount() == 1) {
+ if (overscrollState(event, mFirstPointerDownLocation)
+ == OVERSCROLL_VERTICAL_EDGE) {
+ transitionToDelegatingStateAndClear();
+ }
transitToSinglePanningStateAndClear();
} else {
transitionToDelegatingStateAndClear();
@@ -881,20 +900,6 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
}
- private boolean isOverscroll(MotionEvent event) {
- if (!pointerDownValid(mFirstPointerDownLocation)) {
- return false;
- }
- float dX = event.getX() - mFirstPointerDownLocation.x;
- float dY = event.getY() - mFirstPointerDownLocation.y;
- boolean didOverscroll =
- mFullScreenMagnificationController.isAtLeftEdge(mDisplayId) && dX > 0
- || mFullScreenMagnificationController.isAtRightEdge(mDisplayId) && dX < 0
- || mFullScreenMagnificationController.isAtTopEdge(mDisplayId) && dY > 0
- || mFullScreenMagnificationController.isAtBottomEdge(mDisplayId) && dY < 0;
- return didOverscroll;
- }
-
private void storePointerDownLocation(PointF pointerDownLocation, MotionEvent event) {
final int index = event.getActionIndex();
pointerDownLocation.set(event.getX(index), event.getY(index));
@@ -1172,7 +1177,9 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
private void zoomOn(float centerX, float centerY) {
- if (DEBUG_DETECTING) Slog.i(mLogTag, "zoomOn(" + centerX + ", " + centerY + ")");
+ if (DEBUG_DETECTING) {
+ Slog.i(mLogTag, "zoomOn(" + centerX + ", " + centerY + ")");
+ }
final float scale = MathUtils.constrain(
mFullScreenMagnificationController.getPersistedScale(mDisplayId),
@@ -1189,7 +1196,9 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
private void zoomOff() {
- if (DEBUG_DETECTING) Slog.i(mLogTag, "zoomOff()");
+ if (DEBUG_DETECTING) {
+ Slog.i(mLogTag, "zoomOff()");
+ }
mFullScreenMagnificationController.reset(mDisplayId, /* animate */ true);
}
@@ -1218,6 +1227,28 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
+ '}';
}
+ private int overscrollState(MotionEvent event, PointF firstPointerDownLocation) {
+ if (!pointerValid(firstPointerDownLocation)) {
+ return OVERSCROLL_NONE;
+ }
+ float dX = event.getX() - firstPointerDownLocation.x;
+ float dY = event.getY() - firstPointerDownLocation.y;
+ if (mFullScreenMagnificationController.isAtLeftEdge(mDisplayId) && dX > 0) {
+ return OVERSCROLL_LEFT_EDGE;
+ } else if (mFullScreenMagnificationController.isAtRightEdge(mDisplayId) && dX < 0) {
+ return OVERSCROLL_RIGHT_EDGE;
+ } else if (mFullScreenMagnificationController.isAtTopEdge(mDisplayId) && dY > 0
+ || mFullScreenMagnificationController.isAtBottomEdge(mDisplayId) && dY < 0) {
+ return OVERSCROLL_VERTICAL_EDGE;
+ }
+ return OVERSCROLL_NONE;
+ }
+
+ private boolean pointerValid(PointF pointerDownLocation) {
+ return !(Float.isNaN(pointerDownLocation.x) && Float.isNaN(pointerDownLocation.y));
+ }
+
+
private static final class MotionEventInfo {
private static final int MAX_POOL_SIZE = 10;
@@ -1343,10 +1374,29 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
private final FullScreenMagnificationVibrationHelper
mFullScreenMagnificationVibrationHelper;
- SinglePanningState(Context context, FullScreenMagnificationVibrationHelper
- fullScreenMagnificationVibrationHelper) {
+ @VisibleForTesting int mOverscrollState;
+
+ // mPivotEdge is the point on the edge of the screen when the magnified view hits the edge
+ // This point sets the center of magnified view when warp/scale effect is triggered
+ private final PointF mPivotEdge;
+
+ // mReachedEdgeCoord is the user's pointer location on the screen when the magnified view
+ // has hit the edge
+ private final PointF mReachedEdgeCoord;
+ // mEdgeCooldown value will be set to true when user hits the edge and will be set to false
+ // once the user moves x distance away from the edge. This is so that vibrating haptic
+ // doesn't get triggered by slight movements
+ private boolean mEdgeCooldown;
+
+ SinglePanningState(
+ Context context,
+ FullScreenMagnificationVibrationHelper fullScreenMagnificationVibrationHelper) {
mScrollGestureDetector = new GestureDetector(context, this, Handler.getMain());
mFullScreenMagnificationVibrationHelper = fullScreenMagnificationVibrationHelper;
+ mOverscrollState = OVERSCROLL_NONE;
+ mPivotEdge = new PointF(Float.NaN, Float.NaN);
+ mReachedEdgeCoord = new PointF(Float.NaN, Float.NaN);
+ mEdgeCooldown = false;
}
@Override
@@ -1355,6 +1405,16 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
switch (action) {
case ACTION_UP:
case ACTION_CANCEL:
+ if (mOverscrollState == OVERSCROLL_LEFT_EDGE
+ || mOverscrollState == OVERSCROLL_RIGHT_EDGE) {
+ mFullScreenMagnificationController.setScaleAndCenter(
+ mDisplayId,
+ mFullScreenMagnificationController.getPersistedScale(mDisplayId),
+ mPivotEdge.x,
+ mPivotEdge.y,
+ true,
+ AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
+ }
clear();
transitionTo(mDetectingState);
break;
@@ -1382,11 +1442,22 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
+ " isAtEdge: "
+ mFullScreenMagnificationController.isAtEdge(mDisplayId));
}
- // TODO: b/280812104 Dispatch events before Delegation
if (mFullScreenMagnificationController.isAtEdge(mDisplayId)) {
+ playEdgeVibration(second);
+ setPivotEdge();
+ }
+ if (mOverscrollState == OVERSCROLL_NONE) {
+ mOverscrollState = overscrollState(second, new PointF(first.getX(), first.getY()));
+ } else if (mOverscrollState == OVERSCROLL_VERTICAL_EDGE) {
clear();
transitionTo(mDelegatingState);
- vibrateIfNeeded();
+ } else {
+ boolean reset = warpEffectReset(second);
+ if (reset) {
+ mFullScreenMagnificationController.reset(mDisplayId, /* animate */ true);
+ clear();
+ transitionTo(mDetectingState);
+ }
}
return /* event consumed: */ true;
}
@@ -1405,7 +1476,116 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
return "SinglePanningState{"
+ "isEdgeOfView="
+ mFullScreenMagnificationController.isAtEdge(mDisplayId)
+ + "overscrollStatus="
+ + mOverscrollState
+ "}";
}
+
+ private void playEdgeVibration(MotionEvent event) {
+ if (mOverscrollState == OVERSCROLL_NONE) {
+ vibrateIfNeeded(event);
+ }
+ }
+
+ private void setPivotEdge() {
+ if (!pointerValid(mPivotEdge)) {
+ Rect bounds = new Rect();
+ mFullScreenMagnificationController.getMagnificationBounds(mDisplayId, bounds);
+ if (mOverscrollState == OVERSCROLL_LEFT_EDGE) {
+ mPivotEdge.set(
+ bounds.left,
+ mFullScreenMagnificationController.getCenterY(mDisplayId));
+ } else if (mOverscrollState == OVERSCROLL_RIGHT_EDGE) {
+ mPivotEdge.set(
+ bounds.right,
+ mFullScreenMagnificationController.getCenterY(mDisplayId));
+ }
+ }
+ }
+
+ private boolean warpEffectReset(MotionEvent second) {
+ float scale = calculateOverscrollScale(second);
+ if (scale < 0) return false;
+ mFullScreenMagnificationController.setScaleAndCenter(
+ /* displayId= */ mDisplayId,
+ /* scale= */ scale,
+ /* centerX= */ mPivotEdge.x,
+ /* centerY= */ mPivotEdge.y,
+ /* animate= */ true,
+ /* id= */ AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
+ if (scale == 1.0f) {
+ return true;
+ }
+ return false;
+ }
+
+ private float calculateOverscrollScale(MotionEvent second) {
+ // if at left and overshootDistX is negative or if at right and overshootDistX is
+ // positive then user is not in overscroll state anymore overscroll state. Reset
+ // overscroll values by clearing
+ float overshootDistX = second.getX() - mReachedEdgeCoord.x;
+ if ((mOverscrollState == OVERSCROLL_LEFT_EDGE && overshootDistX < 0)
+ || (mOverscrollState == OVERSCROLL_RIGHT_EDGE && overshootDistX > 0)) {
+ clear();
+ return -1.0f;
+ }
+ float overshootDistY = second.getY() - mReachedEdgeCoord.y;
+ float overshootDist = (float) (Math.hypot(abs(overshootDistX), abs(overshootDistY)));
+ Rect bounds = new Rect();
+ mFullScreenMagnificationController.getMagnificationBounds(mDisplayId, bounds);
+ float overShootFraction = overshootDist / (float) bounds.width();
+ float minDist = 0.05f * bounds.width();
+ if (mEdgeCooldown && (overshootDist > minDist)) {
+ mEdgeCooldown = false;
+ }
+ float scale = (1 - overShootFraction) * getSensitivityScale();
+ scale =
+ MathUtils.constrain(
+ /* amount= */ scale,
+ /* low= */ 1.0f,
+ /* high= */ mFullScreenMagnificationController.getPersistedScale(
+ mDisplayId));
+ return scale;
+ }
+
+ private float getSensitivityScale() {
+ float magnificationScale =
+ mFullScreenMagnificationController.getPersistedScale(mDisplayId);
+ float sensitivityFactor = 0.0f;
+ if (magnificationScale < 1.7f) {
+ sensitivityFactor = 1.0f;
+ } else if (magnificationScale < 2.0f) {
+ sensitivityFactor = 1.0f;
+ } else if (magnificationScale < 2.2f) {
+ sensitivityFactor = 0.95f;
+ } else if (magnificationScale < 2.5f) {
+ sensitivityFactor = 1.1f;
+ } else if (magnificationScale < 2.7f) {
+ sensitivityFactor = 1.3f;
+ } else if (magnificationScale < 3.0f) {
+ sensitivityFactor = 1.0f;
+ } else {
+ sensitivityFactor = 1.0f;
+ }
+ return magnificationScale * sensitivityFactor;
+ }
+
+ private void vibrateIfNeeded(MotionEvent event) {
+ if ((mFullScreenMagnificationController.isAtLeftEdge(mDisplayId)
+ || mFullScreenMagnificationController.isAtRightEdge(mDisplayId))
+ && !mEdgeCooldown) {
+ mFullScreenMagnificationVibrationHelper.vibrateIfSettingEnabled();
+ mReachedEdgeCoord.set(event.getX(), event.getY());
+ mEdgeCooldown = true;
+ }
+ }
+
+ @Override
+ public void clear() {
+ mOverscrollState = OVERSCROLL_NONE;
+ mPivotEdge.set(Float.NaN, Float.NaN);
+ mReachedEdgeCoord.set(Float.NaN, Float.NaN);
+ mEdgeCooldown = false;
+ }
}
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 7b459aa4a0ad..b76e99eb5431 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -2472,6 +2472,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
+ @Override
+ public void requestHideFillUiWhenDestroyed(AutofillId id) {
+ synchronized (mLock) {
+ // NOTE: We allow this call in a destroyed state as the UI is
+ // asked to go away after we get destroyed, so let it do that.
+ try {
+ mClient.requestHideFillUiWhenDestroyed(this.id, id);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error requesting to hide fill UI", e);
+ }
+
+ mInlineSessionController.hideInlineSuggestionsUiLocked(id);
+ }
+ }
+
// AutoFillUiCallback
@Override
public void cancelSession() {
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index f92d38dc0deb..d479dfb512ca 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -95,6 +95,7 @@ public final class AutoFillUI {
void requestShowFillUi(AutofillId id, int width, int height,
IAutofillWindowPresenter presenter);
void requestHideFillUi(AutofillId id);
+ void requestHideFillUiWhenDestroyed(AutofillId id);
void startIntentSenderAndFinishSession(IntentSender intentSender);
void startIntentSender(IntentSender intentSender, Intent intent);
void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent);
@@ -289,6 +290,13 @@ public final class AutoFillUI {
}
@Override
+ public void requestHideFillUiWhenDestroyed() {
+ if (mCallback != null) {
+ mCallback.requestHideFillUiWhenDestroyed(focusedId);
+ }
+ }
+
+ @Override
public void startIntentSender(IntentSender intentSender) {
if (mCallback != null) {
mCallback.startIntentSenderAndFinishSession(intentSender);
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index cdfe7bb4f4a7..cdd9ef4e1a76 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -91,6 +91,7 @@ final class FillUi {
void requestShowFillUi(int width, int height,
IAutofillWindowPresenter windowPresenter);
void requestHideFillUi();
+ void requestHideFillUiWhenDestroyed();
void startIntentSender(IntentSender intentSender);
void dispatchUnhandledKey(KeyEvent keyEvent);
void cancelSession();
@@ -482,7 +483,7 @@ final class FillUi {
}
mCallback.onDestroy();
if (notifyClient) {
- mCallback.requestHideFillUi();
+ mCallback.requestHideFillUiWhenDestroyed();
}
mDestroyed = true;
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 4d4328dd14e8..be52b1c8bb1b 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -815,7 +815,9 @@ public class CompanionDeviceManagerService extends SystemService {
}
@Override
+ @EnforcePermission(MANAGE_COMPANION_DEVICES)
public void enableSecureTransport(boolean enabled) {
+ enableSecureTransport_enforcePermission();
mTransportManager.enableSecureTransport(enabled);
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index 7736e2bc6481..52eef47b3759 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -261,6 +261,8 @@ public final class OverlayManagerService extends SystemService {
private final OverlayActorEnforcer mActorEnforcer;
+ private int mPrevStartedUserId = -1;
+
public OverlayManagerService(@NonNull final Context context) {
super(context);
try {
@@ -338,6 +340,10 @@ public final class OverlayManagerService extends SystemService {
}
private void onStartUser(@UserIdInt int newUserId) {
+ // Do nothing when start a user that is the same as the one started previously.
+ if (newUserId == mPrevStartedUserId) {
+ return;
+ }
try {
traceBegin(TRACE_TAG_RRO, "OMS#onStartUser " + newUserId);
// ensure overlays in the settings are up-to-date, and propagate
@@ -348,6 +354,7 @@ public final class OverlayManagerService extends SystemService {
} finally {
traceEnd(TRACE_TAG_RRO);
}
+ mPrevStartedUserId = newUserId;
}
private static String[] getDefaultOverlayPackages() {
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 134b041cb242..7e1560ada784 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -166,6 +166,7 @@ import com.android.internal.util.CollectionUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.EventLogTags;
import com.android.server.LocalManagerRegistry;
+import com.android.server.SystemConfig;
import com.android.server.art.model.DexoptParams;
import com.android.server.art.model.DexoptResult;
import com.android.server.pm.Installer.LegacyDexoptDisabledException;
@@ -230,6 +231,7 @@ final class InstallPackageHelper {
private final ViewCompiler mViewCompiler;
private final SharedLibrariesImpl mSharedLibraries;
private final PackageManagerServiceInjector mInjector;
+ private final UpdateOwnershipHelper mUpdateOwnershipHelper;
// TODO(b/198166813): remove PMS dependency
InstallPackageHelper(PackageManagerService pm, AppDataHelper appDataHelper) {
@@ -247,6 +249,7 @@ final class InstallPackageHelper {
mPackageAbiHelper = pm.mInjector.getAbiHelper();
mViewCompiler = pm.mInjector.getViewCompiler();
mSharedLibraries = pm.mInjector.getSharedLibrariesImpl();
+ mUpdateOwnershipHelper = pm.mInjector.getUpdateOwnershipHelper();
}
InstallPackageHelper(PackageManagerService pm) {
@@ -332,6 +335,8 @@ final class InstallPackageHelper {
final String updateOwnerFromSysconfig = isApex || !pkgSetting.isSystem() ? null
: mPm.mInjector.getSystemConfig().getSystemAppUpdateOwnerPackageName(
parsedPackage.getPackageName());
+ final boolean isUpdateOwnershipDenylisted =
+ mUpdateOwnershipHelper.isUpdateOwnershipDenylisted(parsedPackage.getPackageName());
final boolean isUpdateOwnershipEnabled = oldUpdateOwner != null;
// For standard install (install via session), the installSource isn't null.
@@ -367,6 +372,9 @@ final class InstallPackageHelper {
& PackageManager.INSTALL_REQUEST_UPDATE_OWNERSHIP) != 0;
final boolean isSameUpdateOwner =
TextUtils.equals(oldUpdateOwner, installSource.mInstallerPackageName);
+ final boolean isInstallerUpdateOwnerDenylistProvider =
+ mUpdateOwnershipHelper.isUpdateOwnershipDenyListProvider(
+ installSource.mUpdateOwnerPackageName);
// Here we handle the update owner for the package, and the rules are:
// -. Only enabling update ownership enforcement on initial installation if the
@@ -374,13 +382,16 @@ final class InstallPackageHelper {
// -. Once the installer changes and users agree to proceed, clear the update
// owner (package state in other users are taken into account as well).
if (!isUpdate) {
- if (!isRequestUpdateOwnership) {
+ if (!isRequestUpdateOwnership
+ || isUpdateOwnershipDenylisted
+ || isInstallerUpdateOwnerDenylistProvider) {
installSource = installSource.setUpdateOwnerPackageName(null);
} else if ((!isUpdateOwnershipEnabled && pkgAlreadyExists)
|| (isUpdateOwnershipEnabled && !isSameUpdateOwner)) {
installSource = installSource.setUpdateOwnerPackageName(null);
}
- } else if (!isSameUpdateOwner || !isUpdateOwnershipEnabled) {
+ } else if (!isSameUpdateOwner
+ || !isUpdateOwnershipEnabled) {
installSource = installSource.setUpdateOwnerPackageName(null);
}
}
@@ -473,6 +484,19 @@ final class InstallPackageHelper {
pkgSetting.setLoadingProgress(1f);
}
+ ArraySet<String> listItems = mUpdateOwnershipHelper.readUpdateOwnerDenyList(pkgSetting);
+ if (listItems != null && !listItems.isEmpty()) {
+ mUpdateOwnershipHelper.addToUpdateOwnerDenyList(pkgSetting.getPackageName(), listItems);
+ for (String unownedPackage : listItems) {
+ PackageSetting unownedSetting = mPm.mSettings.getPackageLPr(unownedPackage);
+ SystemConfig config = SystemConfig.getInstance();
+ if (unownedSetting != null
+ && config.getSystemAppUpdateOwnerPackageName(unownedPackage) == null) {
+ unownedSetting.setUpdateOwnerPackage(null);
+ }
+ }
+ }
+
return pkg;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 10fe65dfc7c1..770ed8b40d2e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1623,7 +1623,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
(i, pm) -> new SharedLibrariesImpl(pm, i),
(i, pm) -> new CrossProfileIntentFilterHelper(i.getSettings(),
i.getUserManagerService(), i.getLock(), i.getUserManagerInternal(),
- context));
+ context),
+ (i, pm) -> new UpdateOwnershipHelper());
if (Build.VERSION.SDK_INT <= 0) {
Slog.w(TAG, "**** ro.build.version.sdk not set!");
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
index 13549f536c9f..51840e70ed26 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
@@ -144,6 +144,7 @@ public class PackageManagerServiceInjector {
private final Singleton<IBackupManager> mIBackupManager;
private final Singleton<SharedLibrariesImpl> mSharedLibrariesProducer;
private final Singleton<CrossProfileIntentFilterHelper> mCrossProfileIntentFilterHelperProducer;
+ private final Singleton<UpdateOwnershipHelper> mUpdateOwnershipHelperProducer;
PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock,
Installer installer, Object installLock, PackageAbiHelper abiHelper,
@@ -183,7 +184,8 @@ public class PackageManagerServiceInjector {
Producer<BackgroundDexOptService> backgroundDexOptService,
Producer<IBackupManager> iBackupManager,
Producer<SharedLibrariesImpl> sharedLibrariesProducer,
- Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer) {
+ Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer,
+ Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer) {
mContext = context;
mLock = lock;
mInstaller = installer;
@@ -238,6 +240,7 @@ public class PackageManagerServiceInjector {
mSharedLibrariesProducer = new Singleton<>(sharedLibrariesProducer);
mCrossProfileIntentFilterHelperProducer = new Singleton<>(
crossProfileIntentFilterHelperProducer);
+ mUpdateOwnershipHelperProducer = new Singleton<>(updateOwnershipHelperProducer);
}
/**
@@ -423,6 +426,11 @@ public class PackageManagerServiceInjector {
return mSharedLibrariesProducer.get(this, mPackageManager);
}
+ public UpdateOwnershipHelper getUpdateOwnershipHelper() {
+ return mUpdateOwnershipHelperProducer.get(this, mPackageManager);
+ }
+
+
/** Provides an abstraction to static access to system state. */
public interface SystemWrapper {
void disablePackageCaches();
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 494709c17e06..cf4d1b0439d4 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -1118,6 +1118,9 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
}
private static void writeArchiveState(ProtoOutputStream proto, ArchiveState archiveState) {
+ if (archiveState == null) {
+ return;
+ }
long archiveStateToken = proto.start(PackageProto.UserInfoProto.ARCHIVE_STATE);
for (ArchiveState.ArchiveActivityInfo activityInfo : archiveState.getActivityInfos()) {
long activityInfoToken = proto.start(
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index 10673c6f2dd2..59314a26ab97 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -312,6 +312,7 @@ final class RemovePackageHelper {
synchronized (mPm.mLock) {
mPm.mDomainVerificationManager.clearPackage(deletedPs.getPackageName());
mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName);
+ mPm.mInjector.getUpdateOwnershipHelper().removeUpdateOwnerDenyList(packageName);
final Computer snapshot = mPm.snapshotComputer();
mPm.mAppsFilter.removePackage(snapshot,
snapshot.getPackageStateInternal(packageName));
diff --git a/services/core/java/com/android/server/pm/UpdateOwnershipHelper.java b/services/core/java/com/android/server/pm/UpdateOwnershipHelper.java
new file mode 100644
index 000000000000..43752f31a1a2
--- /dev/null
+++ b/services/core/java/com/android/server/pm/UpdateOwnershipHelper.java
@@ -0,0 +1,185 @@
+/*
+ * 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.pm;
+
+import static android.content.pm.PackageManager.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST;
+
+import static com.android.server.pm.PackageManagerService.TAG;
+
+import android.Manifest;
+import android.app.ResourcesManager;
+import android.content.pm.ApplicationInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
+import com.android.server.pm.pkg.AndroidPackage;
+import com.android.server.pm.pkg.component.ParsedUsesPermission;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import java.util.List;
+
+/** Helper class for managing update ownership and optouts for the feature. */
+public class UpdateOwnershipHelper {
+
+ // Called out in PackageManager.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST docs
+ private static final int MAX_DENYLIST_SIZE = 500;
+ private static final String TAG_OWNERSHIP_OPT_OUT = "deny-ownership";
+ private final ArrayMap<String, ArraySet<String>> mUpdateOwnerOptOutsToOwners =
+ new ArrayMap<>(200);
+
+ private final Object mLock = new Object();
+
+ private static boolean hasValidOwnershipDenyList(PackageSetting pkgSetting) {
+ AndroidPackage pkg = pkgSetting.getPkg();
+ // we're checking for uses-permission for these priv permissions instead of grant as we're
+ // only considering system apps to begin with, so presumed to be granted.
+ return pkg != null
+ && (pkgSetting.isSystem() || pkgSetting.isUpdatedSystemApp())
+ && pkg.getProperties().containsKey(PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST)
+ && usesAnyPermission(pkg,
+ Manifest.permission.INSTALL_PACKAGES,
+ Manifest.permission.INSTALL_PACKAGE_UPDATES);
+ }
+
+
+ /** Returns true if a package setting declares that it uses a permission */
+ private static boolean usesAnyPermission(AndroidPackage pkgSetting, String... permissions) {
+ List<ParsedUsesPermission> usesPermissions = pkgSetting.getUsesPermissions();
+ for (int i = 0; i < usesPermissions.size(); i++) {
+ for (int j = 0; j < permissions.length; j++) {
+ if (permissions[j].equals(usesPermissions.get(i).getName())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Reads the update owner deny list from a {@link PackageSetting} and returns the set of
+ * packages it contains or {@code null} if it cannot be read.
+ */
+ public ArraySet<String> readUpdateOwnerDenyList(PackageSetting pkgSetting) {
+ if (!hasValidOwnershipDenyList(pkgSetting)) {
+ return null;
+ }
+ AndroidPackage pkg = pkgSetting.getPkg();
+ if (pkg == null) {
+ return null;
+ }
+ ArraySet<String> ownershipDenyList = new ArraySet<>(MAX_DENYLIST_SIZE);
+ try {
+ int resId = pkg.getProperties().get(PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST)
+ .getResourceId();
+ ApplicationInfo appInfo = AndroidPackageUtils.generateAppInfoWithoutState(pkg);
+ Resources resources = ResourcesManager.getInstance().getResources(
+ null, appInfo.sourceDir, appInfo.splitSourceDirs, appInfo.resourceDirs,
+ appInfo.overlayPaths, appInfo.sharedLibraryFiles, null, Configuration.EMPTY,
+ null, null, null);
+ try (XmlResourceParser parser = resources.getXml(resId)) {
+ while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+ if (parser.next() == XmlResourceParser.START_TAG) {
+ if (TAG_OWNERSHIP_OPT_OUT.equals(parser.getName())) {
+ parser.next();
+ String packageName = parser.getText();
+ if (packageName != null && !packageName.isBlank()) {
+ ownershipDenyList.add(packageName);
+ if (ownershipDenyList.size() > MAX_DENYLIST_SIZE) {
+ Slog.w(TAG, "Deny list defined by " + pkg.getPackageName()
+ + " was trucated to maximum size of "
+ + MAX_DENYLIST_SIZE);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Failed to parse update owner list for " + pkgSetting.getPackageName(), e);
+ return null;
+ }
+ return ownershipDenyList;
+ }
+
+ /**
+ * Begins tracking the contents of a deny list and the owner of that deny list for use in calls
+ * to {@link #isUpdateOwnershipDenylisted(String)} and
+ * {@link #isUpdateOwnershipDenyListProvider(String)}.
+ *
+ * @param listOwner the packageName of the package that owns the deny list.
+ * @param listContents the list of packageNames that are on the deny list.
+ */
+ public void addToUpdateOwnerDenyList(String listOwner, ArraySet<String> listContents) {
+ synchronized (mLock) {
+ for (int i = 0; i < listContents.size(); i++) {
+ String packageName = listContents.valueAt(i);
+ ArraySet<String> priorDenyListOwners = mUpdateOwnerOptOutsToOwners.putIfAbsent(
+ packageName, new ArraySet<>(new String[]{listOwner}));
+ if (priorDenyListOwners != null) {
+ priorDenyListOwners.add(listOwner);
+ }
+ }
+ }
+ }
+
+ /**
+ * Stop tracking the contents of a deny list owned by the provided owner of the deny list.
+ * @param listOwner the packageName of the package that owns the deny list.
+ */
+ public void removeUpdateOwnerDenyList(String listOwner) {
+ synchronized (mLock) {
+ for (int i = mUpdateOwnerOptOutsToOwners.size() - 1; i >= 0; i--) {
+ ArraySet<String> packageDenyListContributors =
+ mUpdateOwnerOptOutsToOwners.get(mUpdateOwnerOptOutsToOwners.keyAt(i));
+ if (packageDenyListContributors.remove(listOwner)
+ && packageDenyListContributors.isEmpty()) {
+ mUpdateOwnerOptOutsToOwners.removeAt(i);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns {@code true} if the provided package name is on a valid update ownership deny list.
+ */
+ public boolean isUpdateOwnershipDenylisted(String packageName) {
+ return mUpdateOwnerOptOutsToOwners.containsKey(packageName);
+ }
+
+ /**
+ * Returns {@code true} if the provided package name defines a valid update ownership deny list.
+ */
+ public boolean isUpdateOwnershipDenyListProvider(String packageName) {
+ if (packageName == null) {
+ return false;
+ }
+ synchronized (mLock) {
+ for (int i = mUpdateOwnerOptOutsToOwners.size() - 1; i >= 0; i--) {
+ if (mUpdateOwnerOptOutsToOwners.valueAt(i).contains(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index de7b687bc49b..4353c5787d4b 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -2058,6 +2058,12 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
if (!isStorageOrMedia) {
continue;
}
+ boolean isSystemOrPolicyFixed = (getPermissionFlags(newPackage.getPackageName(),
+ permInfo.name, userId) & (FLAG_PERMISSION_SYSTEM_FIXED
+ | FLAG_PERMISSION_POLICY_FIXED)) != 0;
+ if (isSystemOrPolicyFixed) {
+ continue;
+ }
EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(),
"Revoking permission " + permInfo.name + " from package "
diff --git a/services/core/java/com/android/server/uri/UriPermissionOwner.java b/services/core/java/com/android/server/uri/UriPermissionOwner.java
index d22bb58f6ded..b5e7cb057717 100644
--- a/services/core/java/com/android/server/uri/UriPermissionOwner.java
+++ b/services/core/java/com/android/server/uri/UriPermissionOwner.java
@@ -155,18 +155,22 @@ public class UriPermissionOwner {
public void removeReadPermission(UriPermission perm) {
synchronized (this) {
- mReadPerms.remove(perm);
- if (mReadPerms.isEmpty()) {
- mReadPerms = null;
+ if (mReadPerms != null) {
+ mReadPerms.remove(perm);
+ if (mReadPerms.isEmpty()) {
+ mReadPerms = null;
+ }
}
}
}
public void removeWritePermission(UriPermission perm) {
synchronized (this) {
- mWritePerms.remove(perm);
- if (mWritePerms.isEmpty()) {
- mWritePerms = null;
+ if (mWritePerms != null) {
+ mWritePerms.remove(perm);
+ if (mWritePerms.isEmpty()) {
+ mWritePerms = null;
+ }
}
}
}
diff --git a/services/core/java/com/android/server/vibrator/TEST_MAPPING b/services/core/java/com/android/server/vibrator/TEST_MAPPING
index f0a7e470f8fd..92b327d9abff 100644
--- a/services/core/java/com/android/server/vibrator/TEST_MAPPING
+++ b/services/core/java/com/android/server/vibrator/TEST_MAPPING
@@ -1,21 +1,10 @@
{
- "presubmit": [
+ "imports": [
{
- "name": "FrameworksVibratorServicesTests",
- "options": [
- {"exclude-annotation": "android.platform.test.annotations.LargeTest"},
- {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
- {"exclude-annotation": "androidx.test.filters.FlakyTest"},
- {"exclude-annotation": "org.junit.Ignore"}
- ]
- }
- ],
- "postsubmit": [
+ "path": "frameworks/base/services/tests/vibrator"
+ },
{
- "name": "FrameworksVibratorServicesTests",
- "options": [
- {"exclude-annotation": "org.junit.Ignore"}
- ]
+ "path": "cts/tests/vibrator"
}
]
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index cc130c407690..f9dac3ad930d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -621,6 +621,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
mFinishingActivities.remove(r);
stopWaitingForActivityVisible(r);
+
+ final Task task = r.getTask();
+ if (task != null && task.mKillProcessesOnDestroyed && task.getTopMostActivity() == r) {
+ // The activity is destroyed or its process is died, so cancel the pending kill.
+ task.mKillProcessesOnDestroyed = false;
+ removeTimeoutOfKillProcessesOnDestroyed(task);
+ }
}
/** There is no valid launch time, just stop waiting. */
@@ -1903,9 +1910,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
killTaskProcessesIfPossible(task);
}
+ private void removeTimeoutOfKillProcessesOnDestroyed(Task task) {
+ mHandler.removeMessages(KILL_TASK_PROCESSES_TIMEOUT_MSG, task);
+ }
+
void killTaskProcessesOnDestroyedIfNeeded(Task task) {
if (task == null || !task.mKillProcessesOnDestroyed) return;
- mHandler.removeMessages(KILL_TASK_PROCESSES_TIMEOUT_MSG, task);
+ removeTimeoutOfKillProcessesOnDestroyed(task);
killTaskProcessesIfPossible(task);
}
@@ -2778,7 +2789,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
} break;
case KILL_TASK_PROCESSES_TIMEOUT_MSG: {
final Task task = (Task) msg.obj;
- if (task.mKillProcessesOnDestroyed) {
+ if (task.mKillProcessesOnDestroyed && task.hasActivity()) {
Slog.i(TAG, "Destroy timeout of remove-task, attempt to kill " + task);
killTaskProcessesIfPossible(task);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 7cca9885deca..210378f79af1 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -9591,14 +9591,18 @@ public class WindowManagerService extends IWindowManager.Stub
throw new SecurityException("Requires ACCESS_SURFACE_FLINGER permission");
}
- DisplayContent dc;
- synchronized (mGlobalLock) {
- dc = mRoot.getDisplayContentOrCreate(displayId);
- if (dc == null) {
- return false;
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ DisplayContent dc = mRoot.getDisplayContentOrCreate(displayId);
+ if (dc == null) {
+ return false;
+ }
+ dc.replaceContent(sc);
+ return true;
}
- dc.replaceContent(sc);
- return true;
+ } finally {
+ Binder.restoreCallingIdentity(origId);
}
}
}
diff --git a/services/core/jni/TEST_MAPPING b/services/core/jni/TEST_MAPPING
new file mode 100644
index 000000000000..ea44d06b9fc3
--- /dev/null
+++ b/services/core/jni/TEST_MAPPING
@@ -0,0 +1,16 @@
+{
+ "presubmit": [
+ {
+ "file_patterns": [
+ "[^/]*(vibrator)[^/]*\\.[^/]*"
+ ],
+ "name": "CtsVibratorTestCases",
+ "options": [
+ {"exclude-annotation": "android.platform.test.annotations.LargeTest"},
+ {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
+ }
+ ]
+}
diff --git a/services/tests/dreamservicetests/AndroidManifest.xml b/services/tests/dreamservicetests/AndroidManifest.xml
index fc3ad34aaecb..f4b88d9c18e9 100644
--- a/services/tests/dreamservicetests/AndroidManifest.xml
+++ b/services/tests/dreamservicetests/AndroidManifest.xml
@@ -26,6 +26,32 @@
android:testOnly="true">
<uses-library android:name="android.test.mock" android:required="true" />
<uses-library android:name="android.test.runner" />
+
+ <service
+ android:name="com.android.server.dreams.TestDreamService"
+ android:exported="false"
+ android:label="Test Dream" >
+ <intent-filter>
+ <action android:name="android.service.dreams.DreamService" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data
+ android:name="android.service.dream"
+ android:resource="@xml/test_dream_metadata" />
+ </service>
+
+ <service
+ android:name="com.android.server.dreams.TestDreamServiceWithInvalidSettings"
+ android:exported="false"
+ android:label="Test Dream" >
+ <intent-filter>
+ <action android:name="android.service.dreams.DreamService" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data
+ android:name="android.service.dream"
+ android:resource="@xml/test_dream_metadata_invalid" />
+ </service>
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/services/tests/dreamservicetests/TEST_MAPPING b/services/tests/dreamservicetests/TEST_MAPPING
new file mode 100644
index 000000000000..d73d83dedaae
--- /dev/null
+++ b/services/tests/dreamservicetests/TEST_MAPPING
@@ -0,0 +1,22 @@
+{
+ "presubmit": [
+ {
+ "name": "DreamServiceTests",
+ "options": [
+ {"include-filter": "com.android.server.dreams"},
+ {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "DreamServiceTests",
+ "options": [
+ {"include-filter": "com.android.server.dreams"},
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
+ }
+ ]
+}
diff --git a/services/tests/servicestests/res/xml/test_dream_metadata.xml b/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml
index 9905c69474ad..9211ec1a2f14 100644
--- a/services/tests/servicestests/res/xml/test_dream_metadata.xml
+++ b/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml
@@ -15,5 +15,6 @@
-->
<dream xmlns:android="http://schemas.android.com/apk/res/android"
- android:settingsActivity="com.android.frameworks.servicestests/.TestDreamSettingsActivity"
+ android:settingsActivity=
+ "com.android.frameworks.dreamservicetests/.TestDreamSettingsActivity"
android:showClockAndComplications="false" />
diff --git a/services/tests/servicestests/res/xml/test_dream_metadata_invalid.xml b/services/tests/dreamservicetests/res/xml/test_dream_metadata_invalid.xml
index 47864d9cf62d..47864d9cf62d 100644
--- a/services/tests/servicestests/res/xml/test_dream_metadata_invalid.xml
+++ b/services/tests/dreamservicetests/res/xml/test_dream_metadata_invalid.xml
diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
index a1d42ffc1b74..db704342ab61 100644
--- a/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamControllerTest.java
@@ -44,6 +44,7 @@ import android.os.RemoteException;
import android.os.test.TestLooper;
import android.service.dreams.IDreamService;
+import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -231,6 +232,7 @@ public class DreamControllerTest {
}
@Test
+ @FlakyTest(bugId = 293109503)
public void serviceDisconnect_resetsScreenTimeout() throws RemoteException {
// Start dream.
mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
@@ -250,6 +252,7 @@ public class DreamControllerTest {
}
@Test
+ @FlakyTest(bugId = 293109503)
public void binderDied_resetsScreenTimeout() throws RemoteException {
// Start dream.
mDreamController.startDream(mToken, mDreamName, false /*isPreview*/, false /*doze*/,
diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamOverlayServiceTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java
index f05fa65a43ea..54f46078d30b 100644
--- a/services/tests/servicestests/src/com/android/server/dreams/DreamOverlayServiceTest.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamOverlayServiceTest.java
@@ -35,6 +35,7 @@ import android.service.dreams.IDreamOverlayClientCallback;
import android.view.WindowManager;
import androidx.annotation.NonNull;
+import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -123,6 +124,7 @@ public class DreamOverlayServiceTest {
* Verifies that callbacks for subclasses are run on the provided executor.
*/
@Test
+ @FlakyTest(bugId = 293108088)
public void testCallbacksRunOnExecutor() throws RemoteException {
final TestDreamOverlayService.Monitor monitor = Mockito.mock(
TestDreamOverlayService.Monitor.class);
diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java
index 0efd296fd8b6..d231e40f5d0d 100644
--- a/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java
@@ -36,13 +36,13 @@ import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DreamServiceTest {
- private static final String TEST_PACKAGE_NAME = "com.android.frameworks.servicestests";
+ private static final String TEST_PACKAGE_NAME = "com.android.frameworks.dreamservicetests";
@Test
public void testMetadataParsing() throws PackageManager.NameNotFoundException {
final String testDreamClassName = "com.android.server.dreams.TestDreamService";
final String testSettingsActivity =
- "com.android.frameworks.servicestests/.TestDreamSettingsActivity";
+ "com.android.frameworks.dreamservicetests/.TestDreamSettingsActivity";
final DreamService.DreamMetadata metadata = getDreamMetadata(testDreamClassName);
assertThat(metadata.settingsActivity).isEqualTo(
diff --git a/services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamService.java
index 3c99a9829275..3c99a9829275 100644
--- a/services/tests/servicestests/src/com/android/server/dreams/TestDreamService.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamService.java
diff --git a/services/tests/servicestests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java
index 5c7d02fb755c..5c7d02fb755c 100644
--- a/services/tests/servicestests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java
+++ b/services/tests/dreamservicetests/src/com/android/server/dreams/TestDreamServiceWithInvalidSettings.java
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
index 931a2bf53b84..3c753326fb7d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
@@ -216,6 +216,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
val handler = TestHandler(null)
val defaultAppProvider: DefaultAppProvider = mock()
val backgroundHandler = TestHandler(null)
+ val updateOwnershipHelper: UpdateOwnershipHelper = mock()
}
companion object {
@@ -303,6 +304,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
whenever(mocks.injector.handler) { mocks.handler }
whenever(mocks.injector.defaultAppProvider) { mocks.defaultAppProvider }
whenever(mocks.injector.backgroundHandler) { mocks.backgroundHandler }
+ whenever(mocks.injector.updateOwnershipHelper) { mocks.updateOwnershipHelper }
wheneverStatic { SystemConfig.getInstance() }.thenReturn(mocks.systemConfig)
whenever(mocks.systemConfig.availableFeatures).thenReturn(DEFAULT_AVAILABLE_FEATURES_MAP)
whenever(mocks.systemConfig.sharedLibraries).thenReturn(DEFAULT_SHARED_LIBRARIES_LIST)
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index fa0a9713fec0..0089d4cafaad 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -144,32 +144,6 @@
android:resource="@xml/test_account_type2_authenticator"/>
</service>
- <service
- android:name="com.android.server.dreams.TestDreamService"
- android:exported="false"
- android:label="Test Dream" >
- <intent-filter>
- <action android:name="android.service.dreams.DreamService" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data
- android:name="android.service.dream"
- android:resource="@xml/test_dream_metadata" />
- </service>
-
- <service
- android:name="com.android.server.dreams.TestDreamServiceWithInvalidSettings"
- android:exported="false"
- android:label="Test Dream" >
- <intent-filter>
- <action android:name="android.service.dreams.DreamService" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data
- android:name="android.service.dream"
- android:resource="@xml/test_dream_metadata_invalid" />
- </service>
-
<receiver android:name="com.android.server.devicepolicy.ApplicationRestrictionsTest$AdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true">
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 4d3bd92551d7..19fb2c9b05dc 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
@@ -589,51 +589,91 @@ public class FullScreenMagnificationGestureHandlerTest {
}
@Test
- public void testScroll_zoomedStateAndAtEdge_delegatingState() {
- goFromStateIdleTo(STATE_ACTIVATED);
+ @FlakyTest
+ public void testScroll_singleHorizontalPanningAndAtEdge_leftEdgeOverscroll() {
+ goFromStateIdleTo(STATE_SINGLE_PANNING);
+ float centerY =
+ (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.bottom) / 2.0f;
mFullScreenMagnificationController.setCenter(
- DISPLAY_0,
- INITIAL_MAGNIFICATION_BOUNDS.left,
- INITIAL_MAGNIFICATION_BOUNDS.top / 2,
- false,
- 1);
+ DISPLAY_0, INITIAL_MAGNIFICATION_BOUNDS.left, centerY, false, 1);
final float swipeMinDistance = ViewConfiguration.get(mContext).getScaledTouchSlop() + 1;
PointF initCoords =
new PointF(
mFullScreenMagnificationController.getCenterX(DISPLAY_0),
mFullScreenMagnificationController.getCenterY(DISPLAY_0));
- PointF endCoords = new PointF(initCoords.x, initCoords.y);
- endCoords.offset(swipeMinDistance, 0);
- allowEventDelegation();
+ PointF edgeCoords = new PointF(initCoords.x, initCoords.y);
+ edgeCoords.offset(swipeMinDistance, 0);
- swipeAndHold(initCoords, endCoords);
+ swipeAndHold(initCoords, edgeCoords);
- assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ assertTrue(mMgh.mCurrentState == mMgh.mSinglePanningState);
+ assertTrue(mMgh.mSinglePanningState.mOverscrollState == mMgh.OVERSCROLL_LEFT_EDGE);
assertTrue(isZoomed());
}
@Test
@FlakyTest
- public void testScroll_singlePanningAndAtEdge_delegatingState() {
+ public void testScroll_singleHorizontalPanningAndAtEdge_rightEdgeOverscroll() {
goFromStateIdleTo(STATE_SINGLE_PANNING);
+ float centerY =
+ (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.bottom) / 2.0f;
mFullScreenMagnificationController.setCenter(
- DISPLAY_0,
- INITIAL_MAGNIFICATION_BOUNDS.left,
- INITIAL_MAGNIFICATION_BOUNDS.top / 2,
- false,
- 1);
+ DISPLAY_0, INITIAL_MAGNIFICATION_BOUNDS.right, centerY, false, 1);
final float swipeMinDistance = ViewConfiguration.get(mContext).getScaledTouchSlop() + 1;
PointF initCoords =
new PointF(
mFullScreenMagnificationController.getCenterX(DISPLAY_0),
mFullScreenMagnificationController.getCenterY(DISPLAY_0));
- PointF endCoords = new PointF(initCoords.x, initCoords.y);
- endCoords.offset(swipeMinDistance, 0);
- allowEventDelegation();
+ PointF edgeCoords = new PointF(initCoords.x, initCoords.y);
+ edgeCoords.offset(-swipeMinDistance, 0);
- swipeAndHold(initCoords, endCoords);
+ swipeAndHold(initCoords, edgeCoords);
- assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ assertTrue(mMgh.mCurrentState == mMgh.mSinglePanningState);
+ assertTrue(mMgh.mSinglePanningState.mOverscrollState == mMgh.OVERSCROLL_RIGHT_EDGE);
+ assertTrue(isZoomed());
+ }
+
+ @Test
+ @FlakyTest
+ public void testScroll_singleVerticalPanningAndAtEdge_verticalOverscroll() {
+ goFromStateIdleTo(STATE_SINGLE_PANNING);
+ float centerX =
+ (INITIAL_MAGNIFICATION_BOUNDS.right + INITIAL_MAGNIFICATION_BOUNDS.left) / 2.0f;
+ mFullScreenMagnificationController.setCenter(
+ DISPLAY_0, centerX, INITIAL_MAGNIFICATION_BOUNDS.top, false, 1);
+ final float swipeMinDistance = ViewConfiguration.get(mContext).getScaledTouchSlop() + 1;
+ PointF initCoords =
+ new PointF(
+ mFullScreenMagnificationController.getCenterX(DISPLAY_0),
+ mFullScreenMagnificationController.getCenterY(DISPLAY_0));
+ PointF edgeCoords = new PointF(initCoords.x, initCoords.y);
+ edgeCoords.offset(0, swipeMinDistance);
+
+ swipeAndHold(initCoords, edgeCoords);
+
+ assertTrue(mMgh.mSinglePanningState.mOverscrollState == mMgh.OVERSCROLL_VERTICAL_EDGE);
+ assertTrue(isZoomed());
+ }
+
+ @Test
+ public void testScroll_singlePanningAndAtEdge_noOverscroll() {
+ goFromStateIdleTo(STATE_SINGLE_PANNING);
+ float centerY =
+ (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.bottom) / 2.0f;
+ mFullScreenMagnificationController.setCenter(
+ DISPLAY_0, INITIAL_MAGNIFICATION_BOUNDS.left, centerY, false, 1);
+ final float swipeMinDistance = ViewConfiguration.get(mContext).getScaledTouchSlop() + 1;
+ PointF initCoords =
+ new PointF(
+ mFullScreenMagnificationController.getCenterX(DISPLAY_0),
+ mFullScreenMagnificationController.getCenterY(DISPLAY_0));
+ PointF edgeCoords = new PointF(initCoords.x, initCoords.y);
+ edgeCoords.offset(-swipeMinDistance, 0);
+
+ swipeAndHold(initCoords, edgeCoords);
+
+ assertTrue(mMgh.mSinglePanningState.mOverscrollState == mMgh.OVERSCROLL_NONE);
assertTrue(isZoomed());
}
@@ -1105,6 +1145,11 @@ public class FullScreenMagnificationGestureHandlerTest {
send(upEvent());
}
+ private void swipe(PointF start, PointF end) {
+ swipeAndHold(start, end);
+ send(upEvent(end.x, end.y));
+ }
+
private void swipeAndHold() {
send(downEvent());
send(moveEvent(DEFAULT_X * 2, DEFAULT_Y * 2));
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioAutoInitiationActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioAutoInitiationActionTest.java
index c3beff74ca1c..02bed229d181 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioAutoInitiationActionTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioAutoInitiationActionTest.java
@@ -81,6 +81,20 @@ public class SystemAudioAutoInitiationActionTest {
protected void writeStringSystemProperty(String key, String value) {
// do nothing
}
+
+ /**
+ * Override displayOsd to prevent it from broadcasting an intent, which
+ * can trigger a SecurityException.
+ */
+ @Override
+ void displayOsd(int messageId) {
+ // do nothing
+ }
+
+ @Override
+ void displayOsd(int messageId, int extra) {
+ // do nothing
+ }
};
mHdmiControlService.setIoLooper(myLooper);
diff --git a/services/tests/vibrator/TEST_MAPPING b/services/tests/vibrator/TEST_MAPPING
index 22b72fa4ff9e..f0a7e470f8fd 100644
--- a/services/tests/vibrator/TEST_MAPPING
+++ b/services/tests/vibrator/TEST_MAPPING
@@ -1,7 +1,21 @@
{
- "imports": [
+ "presubmit": [
{
- "path": "frameworks/base/services/core/java/com/android/server/vibrator"
+ "name": "FrameworksVibratorServicesTests",
+ "options": [
+ {"exclude-annotation": "android.platform.test.annotations.LargeTest"},
+ {"exclude-annotation": "android.platform.test.annotations.FlakyTest"},
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "FrameworksVibratorServicesTests",
+ "options": [
+ {"exclude-annotation": "org.junit.Ignore"}
+ ]
}
]
}
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
index 709e9c3a2cb1..e739033076a6 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -60,6 +60,7 @@ import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibrationEffectSegment;
+import android.platform.test.annotations.FlakyTest;
import android.platform.test.annotations.LargeTest;
import android.util.SparseArray;
@@ -1490,6 +1491,7 @@ public class VibrationThreadTest {
assertTrue(fakeVibrator.getAmplitudes().isEmpty());
}
+ @FlakyTest
@Test
public void vibrate_multipleVibrations_withCancel() throws Exception {
mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(
diff --git a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
index bbec091b9924..41c0caaea06e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ContentRecorderTests.java
@@ -453,6 +453,78 @@ public class ContentRecorderTests extends WindowTestsBase {
displayAreaBounds.width(), displayAreaBounds.height());
}
+ @Test
+ public void testDisplayContentUpdatesRecording_withoutSurface() {
+ // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
+ // mirror.
+ setUpDefaultTaskDisplayAreaWindowToken();
+
+ // WHEN getting the DisplayContent for the new virtual display without providing a valid
+ // size from getDisplaySurfaceDefaultSize, i.e. the case of null surface.
+ final DisplayContent virtualDisplay =
+ mRootWindowContainer.getDisplayContent(mDisplaySession.getVirtualDisplayId());
+ doReturn(null).when(mWm.mDisplayManagerInternal).getDisplaySurfaceDefaultSize(anyInt());
+ mWm.mContentRecordingController.setContentRecordingSessionLocked(mDisplaySession, mWm);
+ virtualDisplay.updateRecording();
+
+ // THEN mirroring is not started, since a null surface indicates the VirtualDisplay is off.
+ assertThat(virtualDisplay.isCurrentlyRecording()).isFalse();
+ }
+
+ @Test
+ public void testDisplayContentUpdatesRecording_withSurface() {
+ // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
+ // mirror.
+ setUpDefaultTaskDisplayAreaWindowToken();
+
+ // WHEN getting the DisplayContent for the virtual display with a valid size from
+ // getDisplaySurfaceDefaultSize (done by surfaceControlMirrors in setUp).
+ final DisplayContent virtualDisplay =
+ mRootWindowContainer.getDisplayContent(mDisplaySession.getVirtualDisplayId());
+ mWm.mContentRecordingController.setContentRecordingSessionLocked(mDisplaySession, mWm);
+ virtualDisplay.updateRecording();
+
+ // THEN mirroring is initiated for the default display's DisplayArea.
+ assertThat(virtualDisplay.isCurrentlyRecording()).isTrue();
+ }
+
+ @Test
+ public void testDisplayContentUpdatesRecording_displayMirroring() {
+ // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
+ // mirror.
+ setUpDefaultTaskDisplayAreaWindowToken();
+
+ // GIVEN SurfaceControl can successfully mirror the provided surface.
+ surfaceControlMirrors(sSurfaceSize);
+ // Initially disable getDisplayIdToMirror since the DMS may create the DC outside the direct
+ // call in the test. We need to spy on the DC before updateRecording is called or we can't
+ // verify setDisplayMirroring is called
+ doReturn(INVALID_DISPLAY).when(mWm.mDisplayManagerInternal).getDisplayIdToMirror(anyInt());
+
+ // WHEN getting the DisplayContent for the new virtual display.
+ final DisplayContent virtualDisplay =
+ mRootWindowContainer.getDisplayContent(mDisplaySession.getVirtualDisplayId());
+ // Return the default display as the value to mirror to ensure the VD with flag mirroring
+ // creates a ContentRecordingSession automatically.
+ doReturn(DEFAULT_DISPLAY).when(mWm.mDisplayManagerInternal).getDisplayIdToMirror(anyInt());
+ virtualDisplay.updateRecording();
+
+ // THEN mirroring is initiated for the default display's DisplayArea.
+ verify(virtualDisplay).setDisplayMirroring();
+ assertThat(virtualDisplay.isCurrentlyRecording()).isTrue();
+ }
+
+ /**
+ * Creates a WindowToken associated with the default task DisplayArea, in order for that
+ * DisplayArea to be mirrored.
+ */
+ private void setUpDefaultTaskDisplayAreaWindowToken() {
+ // GIVEN the default task display area is represented by the WindowToken.
+ spyOn(mWm.mWindowContextListenerController);
+ doReturn(mDefaultDisplay.getDefaultTaskDisplayArea()).when(
+ mWm.mWindowContextListenerController).getContainer(any());
+ }
+
/**
* Creates a {@link android.window.WindowContainerToken} associated with a task, in order for
* that task to be recorded.
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index bdd178b0b317..d015ca302e27 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -27,12 +27,10 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
import static android.os.Build.VERSION_CODES.P;
import static android.os.Build.VERSION_CODES.Q;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_PRIVATE;
-import static android.view.Display.INVALID_DISPLAY;
import static android.view.DisplayCutout.BOUNDS_POSITION_TOP;
import static android.view.DisplayCutout.fromBoundingRect;
import static android.view.Surface.ROTATION_0;
@@ -112,11 +110,9 @@ import android.app.ActivityTaskManager;
import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.graphics.Insets;
-import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.HardwareBuffer;
-import android.hardware.display.VirtualDisplay;
import android.metrics.LogMaker;
import android.os.Binder;
import android.os.RemoteException;
@@ -124,7 +120,6 @@ import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.util.ArraySet;
import android.util.DisplayMetrics;
-import android.view.ContentRecordingSession;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
@@ -2655,138 +2650,6 @@ public class DisplayContentTests extends WindowTestsBase {
}
@Test
- public void testVirtualDisplayContent_withoutSurface() {
- // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
- // mirror.
- setUpDefaultTaskDisplayAreaWindowToken();
-
- // GIVEN SurfaceControl does not mirror a null surface.
- Point surfaceSize = new Point(
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().width(),
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().height());
-
- // GIVEN a new VirtualDisplay with an associated surface.
- final VirtualDisplay display = createVirtualDisplay(surfaceSize, null /* surface */);
- final int displayId = display.getDisplay().getDisplayId();
- mWm.mRoot.onDisplayAdded(displayId);
-
- // WHEN getting the DisplayContent for the new virtual display.
- DisplayContent actualDC = mWm.mRoot.getDisplayContent(displayId);
- ContentRecordingSession session = ContentRecordingSession.createDisplaySession(
- DEFAULT_DISPLAY);
- session.setVirtualDisplayId(displayId);
- mWm.mContentRecordingController.setContentRecordingSessionLocked(session, mWm);
- actualDC.updateRecording();
-
- // THEN mirroring is not started, since a null surface indicates the VirtualDisplay is off.
- assertThat(actualDC.isCurrentlyRecording()).isFalse();
-
- display.release();
- }
-
- @Test
- public void testVirtualDisplayContent_withSurface() {
- // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
- // mirror.
- setUpDefaultTaskDisplayAreaWindowToken();
-
- // GIVEN SurfaceControl can successfully mirror the provided surface.
- Point surfaceSize = new Point(
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().width(),
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().height());
- surfaceControlMirrors(surfaceSize);
-
- // GIVEN a new VirtualDisplay with an associated surface.
- final VirtualDisplay display = createVirtualDisplay(surfaceSize, new Surface());
- final int displayId = display.getDisplay().getDisplayId();
-
- // GIVEN a session for this display.
- ContentRecordingSession session = ContentRecordingSession.createDisplaySession(
- DEFAULT_DISPLAY);
- session.setVirtualDisplayId(displayId);
- mWm.mContentRecordingController.setContentRecordingSessionLocked(session, mWm);
- mWm.mRoot.onDisplayAdded(displayId);
-
- // WHEN getting the DisplayContent for the new virtual display.
- DisplayContent actualDC = mWm.mRoot.getDisplayContent(displayId);
- actualDC.updateRecording();
-
- // THEN mirroring is initiated for the default display's DisplayArea.
- assertThat(actualDC.isCurrentlyRecording()).isTrue();
-
- display.release();
- }
-
- @Test
- public void testVirtualDisplayContent_displayMirroring() {
- // GIVEN MediaProjection has already initialized the WindowToken of the DisplayArea to
- // mirror.
- setUpDefaultTaskDisplayAreaWindowToken();
-
- // GIVEN SurfaceControl can successfully mirror the provided surface.
- Point surfaceSize = new Point(
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().width(),
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().height());
- surfaceControlMirrors(surfaceSize);
- // Initially disable getDisplayIdToMirror since the DMS may create the DC outside the direct
- // call in the test. We need to spy on the DC before updateRecording is called or we can't
- // verify setDisplayMirroring is called
- doReturn(INVALID_DISPLAY).when(mWm.mDisplayManagerInternal).getDisplayIdToMirror(anyInt());
-
- // GIVEN a new VirtualDisplay with an associated surface.
- final VirtualDisplay display = createVirtualDisplay(surfaceSize, new Surface());
- final int displayId = display.getDisplay().getDisplayId();
-
- // GIVEN a session for this display.
- mWm.mRoot.onDisplayAdded(displayId);
-
- // WHEN getting the DisplayContent for the new virtual display.
- DisplayContent actualDC = mWm.mRoot.getDisplayContent(displayId);
- spyOn(actualDC);
- // Return the default display as the value to mirror to ensure the VD with flag mirroring
- // creates a ContentRecordingSession automatically.
- doReturn(DEFAULT_DISPLAY).when(mWm.mDisplayManagerInternal).getDisplayIdToMirror(anyInt());
- actualDC.updateRecording();
-
- // THEN mirroring is initiated for the default display's DisplayArea.
- verify(actualDC).setDisplayMirroring();
- assertThat(actualDC.isCurrentlyRecording()).isTrue();
- display.release();
- }
-
- /**
- * Creates a WindowToken associated with the default task DisplayArea, in order for that
- * DisplayArea to be mirrored.
- */
- private void setUpDefaultTaskDisplayAreaWindowToken() {
- // GIVEN the default task display area is represented by the WindowToken.
- spyOn(mWm.mWindowContextListenerController);
- doReturn(mDefaultDisplay.getDefaultTaskDisplayArea()).when(
- mWm.mWindowContextListenerController).getContainer(any());
- }
-
- /**
- * SurfaceControl successfully creates a mirrored surface of the given size.
- */
- private SurfaceControl surfaceControlMirrors(Point surfaceSize) {
- // Do not set the parent, since the mirrored surface is the root of a new surface hierarchy.
- SurfaceControl mirroredSurface = new SurfaceControl.Builder()
- .setName("mirroredSurface")
- .setBufferSize(surfaceSize.x, surfaceSize.y)
- .setCallsite("mirrorSurface")
- .build();
- doReturn(mirroredSurface).when(() -> SurfaceControl.mirrorSurface(any()));
- doReturn(surfaceSize).when(mWm.mDisplayManagerInternal).getDisplaySurfaceDefaultSize(
- anyInt());
- return mirroredSurface;
- }
-
- private VirtualDisplay createVirtualDisplay(Point size, Surface surface) {
- return mWm.mDisplayManager.createVirtualDisplay("VirtualDisplay", size.x, size.y,
- DisplayMetrics.DENSITY_140, surface, VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR);
- }
-
- @Test
public void testKeepClearAreasMultipleWindows() {
final WindowState w1 = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, "w1");
final Rect rect1 = new Rect(0, 0, 10, 10);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
index 7cb58022c0e7..77d5908c63a5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java
@@ -1038,6 +1038,13 @@ public class RecentTasksTest extends WindowTestsBase {
top.setState(ActivityRecord.State.DESTROYING, "test");
top.destroyed("test");
assertFalse(task.mKillProcessesOnDestroyed);
+
+ // If the process is died, the state should be cleared.
+ final Task lastTask = tasks.get(0);
+ lastTask.addChild(top);
+ lastTask.mKillProcessesOnDestroyed = true;
+ top.handleAppDied();
+ assertFalse(lastTask.mKillProcessesOnDestroyed);
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index d502cd1c93cb..325176fbe7a8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -21,9 +21,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_FOCUS;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_OWN_FOCUS;
import static android.view.Display.INVALID_DISPLAY;
@@ -63,6 +60,8 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.description;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -71,9 +70,7 @@ import static org.mockito.Mockito.when;
import android.app.ActivityThread;
import android.app.IApplicationThread;
import android.content.pm.ActivityInfo;
-import android.graphics.Point;
import android.graphics.Rect;
-import android.hardware.display.VirtualDisplay;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@@ -82,7 +79,6 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-import android.util.DisplayMetrics;
import android.util.MergedConfiguration;
import android.view.ContentRecordingSession;
import android.view.IWindow;
@@ -90,7 +86,6 @@ import android.view.IWindowSessionCallback;
import android.view.InputChannel;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
-import android.view.Surface;
import android.view.SurfaceControl;
import android.view.View;
import android.view.WindowInsets;
@@ -575,13 +570,14 @@ public class WindowManagerServiceTests extends WindowTestsBase {
mWm.mPerDisplayFocusEnabled = false;
// Create one extra display
- final VirtualDisplay virtualDisplay = createVirtualDisplay(/* ownFocus= */ false);
- final VirtualDisplay virtualDisplayOwnTouchMode =
- createVirtualDisplay(/* ownFocus= */ true);
+ final DisplayContent display = createMockSimulatedDisplay();
+ display.getDisplayInfo().flags &= ~FLAG_OWN_FOCUS;
+ final DisplayContent displayOwnTouchMode = createMockSimulatedDisplay();
+ displayOwnTouchMode.getDisplayInfo().flags |= FLAG_OWN_FOCUS;
final int numberOfDisplays = mWm.mRoot.mChildren.size();
assertThat(numberOfDisplays).isAtLeast(3);
final int numberOfGlobalTouchModeDisplays = (int) mWm.mRoot.mChildren.stream()
- .filter(d -> (d.getDisplay().getFlags() & FLAG_OWN_FOCUS) == 0)
+ .filter(d -> (d.getDisplayInfo().flags & FLAG_OWN_FOCUS) == 0)
.count();
assertThat(numberOfGlobalTouchModeDisplays).isAtLeast(2);
@@ -601,12 +597,13 @@ public class WindowManagerServiceTests extends WindowTestsBase {
}
@Test
- public void testSetInTouchMode_multiDisplay_perDisplayFocus_singleDisplayTouchModeUpdate() {
+ public void testSetInTouchMode_multiDisplay_singleDisplayTouchModeUpdate() {
// Enable global touch mode
mWm.mPerDisplayFocusEnabled = true;
// Create one extra display
- final VirtualDisplay virtualDisplay = createVirtualDisplay(/* ownFocus= */ false);
+ final DisplayContent virtualDisplay = createMockSimulatedDisplay();
+ virtualDisplay.getDisplayInfo().flags &= ~FLAG_OWN_FOCUS;
final int numberOfDisplays = mWm.mRoot.mChildren.size();
assertThat(numberOfDisplays).isAtLeast(2);
@@ -618,99 +615,64 @@ public class WindowManagerServiceTests extends WindowTestsBase {
when(mWm.mAtmService.instrumentationSourceHasPermission(callingPid,
android.Manifest.permission.MODIFY_TOUCH_MODE_STATE)).thenReturn(true);
- mWm.setInTouchMode(!currentTouchMode, virtualDisplay.getDisplay().getDisplayId());
+ mWm.setInTouchMode(!currentTouchMode, virtualDisplay.mDisplayId);
// Ensure that new display touch mode state has changed.
verify(mWm.mInputManager).setInTouchMode(
!currentTouchMode, callingPid, callingUid, /* hasPermission= */ true,
- virtualDisplay.getDisplay().getDisplayId());
- }
+ virtualDisplay.mDisplayId);
- @Test
- public void testSetInTouchMode_multiDisplay_ownTouchMode_singleDisplayTouchModeUpdate() {
- // Disable global touch mode
+ // Disable global touch mode and make the virtual display own focus.
mWm.mPerDisplayFocusEnabled = false;
-
- // Create one extra display
- final VirtualDisplay virtualDisplay = createVirtualDisplay(/* ownFocus= */ true);
- final int numberOfDisplays = mWm.mRoot.mChildren.size();
- assertThat(numberOfDisplays).isAtLeast(2);
-
- // Get current touch mode state and setup WMS to run setInTouchMode
- boolean currentTouchMode = mWm.isInTouchMode(DEFAULT_DISPLAY);
- int callingPid = Binder.getCallingPid();
- int callingUid = Binder.getCallingUid();
- doReturn(false).when(mWm).checkCallingPermission(anyString(), anyString(), anyBoolean());
- when(mWm.mAtmService.instrumentationSourceHasPermission(callingPid,
- android.Manifest.permission.MODIFY_TOUCH_MODE_STATE)).thenReturn(true);
-
- mWm.setInTouchMode(!currentTouchMode, virtualDisplay.getDisplay().getDisplayId());
+ virtualDisplay.getDisplayInfo().flags |= FLAG_OWN_FOCUS;
+ clearInvocations(mWm.mInputManager);
+ mWm.setInTouchMode(!currentTouchMode, virtualDisplay.mDisplayId);
// Ensure that new display touch mode state has changed.
verify(mWm.mInputManager).setInTouchMode(
!currentTouchMode, callingPid, callingUid, /* hasPermission= */ true,
- virtualDisplay.getDisplay().getDisplayId());
+ virtualDisplay.mDisplayId);
}
@Test
- public void testSetInTouchModeOnAllDisplays_perDisplayFocusDisabled() {
- testSetInTouchModeOnAllDisplays(/* perDisplayFocusEnabled= */ false);
- }
-
- @Test
- public void testSetInTouchModeOnAllDisplays_perDisplayFocusEnabled() {
- testSetInTouchModeOnAllDisplays(/* perDisplayFocusEnabled= */ true);
- }
-
- private void testSetInTouchModeOnAllDisplays(boolean perDisplayFocusEnabled) {
- // Set global touch mode with the value passed as argument.
- mWm.mPerDisplayFocusEnabled = perDisplayFocusEnabled;
-
+ public void testSetInTouchModeOnAllDisplays() {
// Create a couple of extra displays.
// setInTouchModeOnAllDisplays should ignore the ownFocus setting.
- final VirtualDisplay virtualDisplay = createVirtualDisplay(/* ownFocus= */ false);
- final VirtualDisplay virtualDisplayOwnFocus = createVirtualDisplay(/* ownFocus= */ true);
+ final DisplayContent display = createMockSimulatedDisplay();
+ display.getDisplayInfo().flags &= ~FLAG_OWN_FOCUS;
+ final DisplayContent displayOwnTouchMode = createMockSimulatedDisplay();
+ displayOwnTouchMode.getDisplayInfo().flags |= FLAG_OWN_FOCUS;
int callingPid = Binder.getCallingPid();
int callingUid = Binder.getCallingUid();
+ doReturn(true).when(mWm.mInputManager).setInTouchMode(anyBoolean(), anyInt(),
+ anyInt(), anyBoolean(), anyInt());
doReturn(false).when(mWm).checkCallingPermission(anyString(), anyString(), anyBoolean());
when(mWm.mAtmService.instrumentationSourceHasPermission(callingPid,
android.Manifest.permission.MODIFY_TOUCH_MODE_STATE)).thenReturn(true);
- for (boolean inTouchMode : new boolean[]{true, false}) {
- mWm.setInTouchModeOnAllDisplays(inTouchMode);
- for (int i = 0; i < mWm.mRoot.mChildren.size(); ++i) {
- DisplayContent dc = mWm.mRoot.mChildren.get(i);
- // All displays that are not already in the desired touch mode are requested to
- // change their touch mode.
- if (dc.isInTouchMode() != inTouchMode) {
- verify(mWm.mInputManager).setInTouchMode(
- true, callingPid, callingUid, /* hasPermission= */ true,
- dc.getDisplay().getDisplayId());
+ final Runnable verification = () -> {
+ for (boolean inTouchMode : new boolean[] { true, false }) {
+ mWm.setInTouchModeOnAllDisplays(inTouchMode);
+ for (int i = 0; i < mRootWindowContainer.getChildCount(); ++i) {
+ final DisplayContent dc = mRootWindowContainer.getChildAt(i);
+ // All displays that are not already in the desired touch mode are requested to
+ // change their touch mode.
+ if (dc.isInTouchMode() != inTouchMode) {
+ verify(mWm.mInputManager, description("perDisplayFocusEnabled="
+ + mWm.mPerDisplayFocusEnabled)).setInTouchMode(true,
+ callingPid, callingUid, /* hasPermission= */ true, dc.mDisplayId);
+ }
}
}
- }
- }
+ };
- private VirtualDisplay createVirtualDisplay(boolean ownFocus) {
- // Create virtual display
- Point surfaceSize = new Point(
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().width(),
- mDefaultDisplay.getDefaultTaskDisplayArea().getBounds().height());
- int flags = VIRTUAL_DISPLAY_FLAG_PUBLIC;
- if (ownFocus) {
- flags |= VIRTUAL_DISPLAY_FLAG_OWN_FOCUS | VIRTUAL_DISPLAY_FLAG_TRUSTED;
- }
- VirtualDisplay virtualDisplay = mWm.mDisplayManager.createVirtualDisplay("VirtualDisplay",
- surfaceSize.x, surfaceSize.y, DisplayMetrics.DENSITY_140, new Surface(), flags);
- final int displayId = virtualDisplay.getDisplay().getDisplayId();
- mWm.mRoot.onDisplayAdded(displayId);
-
- // Ensure that virtual display was properly created and stored in WRC
- assertThat(mWm.mRoot.getDisplayContent(
- virtualDisplay.getDisplay().getDisplayId())).isNotNull();
+ mWm.mPerDisplayFocusEnabled = false;
+ verification.run();
- return virtualDisplay;
+ clearInvocations(mWm.mInputManager);
+ mWm.mPerDisplayFocusEnabled = true;
+ verification.run();
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 873c7f4e0e30..62de67a165c5 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -901,6 +901,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
DisplayInfo displayInfo = new DisplayInfo();
displayInfo.copyFrom(mDisplayInfo);
displayInfo.type = Display.TYPE_VIRTUAL;
+ displayInfo.state = Display.STATE_ON;
displayInfo.ownerUid = SYSTEM_UID;
return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_FALLBACK_DISPLAY, overrideSettings);
}
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index fdcb9749c38e..53154e6063b2 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -358,6 +358,8 @@ interface ITelecomService {
int cleanupOrphanPhoneAccounts();
+ boolean isNonUiInCallServiceBound(in String packageName);
+
void resetCarMode();
void setTestDefaultCallRedirectionApp(String packageName);
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt
index 480fbbc0eae1..68b7e17a1138 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt
@@ -133,7 +133,8 @@ class OpenTrampolineActivityTest(flicker: LegacyFlickerTest) : ActivityEmbedding
}
// Begin of transition.
.then()
- .isAppWindowInvisible(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT)
+ .isAppWindowInvisible(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT,
+ isOptional = true)
.then()
.invoke("mainAndSecondaryInSplit") {
val mainActivityRegion =
@@ -165,7 +166,6 @@ class OpenTrampolineActivityTest(flicker: LegacyFlickerTest) : ActivityEmbedding
@FlakyTest(bugId = 290736037)
/** Main activity should go from fullscreen to being a split with secondary activity. */
- @Presubmit
@Test
fun mainActivityLayerGoesFromFullscreenToSplit() {
flicker.assertLayers {
@@ -197,6 +197,12 @@ class OpenTrampolineActivityTest(flicker: LegacyFlickerTest) : ActivityEmbedding
}
}
+ @FlakyTest(bugId = 288591571)
+ @Test
+ override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
+ super.visibleLayersShownMoreThanOneConsecutiveEntry()
+ }
+
companion object {
/** {@inheritDoc} */
private var startDisplayBounds = Rect.EMPTY
diff --git a/tests/utils/testutils/TEST_MAPPING b/tests/utils/testutils/TEST_MAPPING
new file mode 100644
index 000000000000..d9eb44fc4222
--- /dev/null
+++ b/tests/utils/testutils/TEST_MAPPING
@@ -0,0 +1,32 @@
+{
+ "presubmit": [
+ {
+ "name": "frameworks-base-testutils-tests",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.LargeTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "frameworks-base-testutils-tests",
+ "options": [
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ]
+}
+
diff --git a/tests/utils/testutils/tests/Android.bp b/tests/utils/testutils/tests/Android.bp
new file mode 100644
index 000000000000..b901b1802383
--- /dev/null
+++ b/tests/utils/testutils/tests/Android.bp
@@ -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 {
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_test {
+ name: "frameworks-base-testutils-tests",
+
+ srcs: [
+ "src/**/*.java",
+ ],
+
+ static_libs: [
+ "junit",
+ "hamcrest-library",
+ "androidx.test.runner",
+ "mockito-target-minus-junit4",
+ "frameworks-base-testutils",
+ ],
+
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ "android.test.mock",
+ ],
+
+ certificate: "platform",
+ test_suites: [
+ "device-tests",
+ "automotive-tests",
+ ],
+}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerResult.java b/tests/utils/testutils/tests/AndroidManifest.xml
index a2d06aff3773..9e7e2752f1d5 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/quantize/QuantizerResult.java
+++ b/tests/utils/testutils/tests/AndroidManifest.xml
@@ -1,4 +1,5 @@
-/*
+<?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");
@@ -12,17 +13,17 @@
* 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.monet.quantize;
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.frameworks.tests.utils.testutils.tests">
-import java.util.Map;
+ <application>
+ <uses-library android:name="android.test.runner"/>
+ </application>
-/** Represents result of a quantizer run */
-public final class QuantizerResult {
- public final Map<Integer, Integer> colorToCount;
-
- QuantizerResult(Map<Integer, Integer> colorToCount) {
- this.colorToCount = colorToCount;
- }
-}
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.frameworks.tests.utils.testutils.tests"
+ android:label="Test Utils Tests"/>
+</manifest>
diff --git a/tests/utils/testutils/java/android/os/test/TestLooperTest.java b/tests/utils/testutils/tests/src/android/os/test/TestLooperTest.java
index c72e20ccc5ba..c72e20ccc5ba 100644
--- a/tests/utils/testutils/java/android/os/test/TestLooperTest.java
+++ b/tests/utils/testutils/tests/src/android/os/test/TestLooperTest.java
diff --git a/tests/utils/testutils/java/com/android/test/filters/SelectTestTests.java b/tests/utils/testutils/tests/src/com/android/test/filters/SelectTestTests.java
index df18985f77bf..df18985f77bf 100644
--- a/tests/utils/testutils/java/com/android/test/filters/SelectTestTests.java
+++ b/tests/utils/testutils/tests/src/com/android/test/filters/SelectTestTests.java
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index a43bf1b60f42..6bf265d2e363 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -837,9 +837,9 @@ class UsesSdkBadging : public ManifestExtractor::Element {
void Print(text::Printer* printer) override {
if (min_sdk) {
- printer->Print(StringPrintf("sdkVersion:'%d'\n", *min_sdk));
+ printer->Print(StringPrintf("minSdkVersion:'%d'\n", *min_sdk));
} else if (min_sdk_name) {
- printer->Print(StringPrintf("sdkVersion:'%s'\n", min_sdk_name->data()));
+ printer->Print(StringPrintf("minSdkVersion:'%s'\n", min_sdk_name->data()));
}
if (max_sdk) {
printer->Print(StringPrintf("maxSdkVersion:'%d'\n", *max_sdk));
diff --git a/tools/aapt2/integration-tests/DumpTest/built_with_aapt_expected.txt b/tools/aapt2/integration-tests/DumpTest/built_with_aapt_expected.txt
index cc0b3bf5d2fb..d14e5fb5c477 100644
--- a/tools/aapt2/integration-tests/DumpTest/built_with_aapt_expected.txt
+++ b/tools/aapt2/integration-tests/DumpTest/built_with_aapt_expected.txt
@@ -1,5 +1,5 @@
package: name='com.aapt.app' versionCode='222' versionName='222' platformBuildVersionName='12' platformBuildVersionCode='32' compileSdkVersion='32' compileSdkVersionCodename='12'
-sdkVersion:'22'
+minSdkVersion:'22'
targetSdkVersion:'32'
application: label='App' icon=''
feature-group: label=''
diff --git a/tools/aapt2/integration-tests/DumpTest/components_expected.txt b/tools/aapt2/integration-tests/DumpTest/components_expected.txt
index 9c81fb83ca15..93cce0a29024 100644
--- a/tools/aapt2/integration-tests/DumpTest/components_expected.txt
+++ b/tools/aapt2/integration-tests/DumpTest/components_expected.txt
@@ -1,5 +1,5 @@
package: name='com.example.bundletool.minimal' versionCode='1' versionName='1.0' platformBuildVersionName='12' platformBuildVersionCode='31' compileSdkVersion='31' compileSdkVersionCodename='12'
-sdkVersion:'21'
+minSdkVersion:'21'
targetSdkVersion:'31'
uses-configuration: reqTouchScreen='3' reqKeyboardType='2' reqHardKeyboard='-1' reqNavigation='3' reqFiveWayNav='-1'
supports-gl-texture:'GL_OES_compressed_paletted_texture'
diff --git a/tools/aapt2/integration-tests/DumpTest/minimal_expected.txt b/tools/aapt2/integration-tests/DumpTest/minimal_expected.txt
index 85ab5d80cd39..aafca68443a9 100644
--- a/tools/aapt2/integration-tests/DumpTest/minimal_expected.txt
+++ b/tools/aapt2/integration-tests/DumpTest/minimal_expected.txt
@@ -1,5 +1,5 @@
package: name='com.lato.bubblegirl' versionCode='33' versionName='1.0.0' platformBuildVersionName='8.1.0' platformBuildVersionCode='27'
-sdkVersion:'19'
+minSdkVersion:'19'
targetSdkVersion:'26'
application-label:'Bubble Girl'
application-label-ar:'Bubble Girl'
diff --git a/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt
index 85e8d0a3cbba..f48f381e3012 100644
--- a/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt
+++ b/tools/aapt2/integration-tests/DumpTest/multiple_uses_sdk_expected.txt
@@ -1,5 +1,5 @@
package: name='com.test.e17wmultiapknexus' versionCode='107' versionName='14' platformBuildVersionName='2.3.3' platformBuildVersionCode='10'
-sdkVersion:'1'
+minSdkVersion:'1'
application-label:'w45wmultiapknexus_10'
application-icon-120:'res/drawable-ldpi-v4/icon.png'
application-icon-160:'res/drawable-mdpi-v4/icon.png'