summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp26
-rw-r--r--PREUPLOAD.cfg15
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java27
-rw-r--r--apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java212
-rwxr-xr-xapi/current.txt141
-rw-r--r--api/system-current.txt69
-rw-r--r--api/test-current.txt56
-rw-r--r--cmds/incident/Android.bp46
-rw-r--r--cmds/incident/Android.mk48
-rw-r--r--cmds/incidentd/Android.bp117
-rw-r--r--cmds/incidentd/Android.mk156
-rw-r--r--cmds/statsd/Android.bp275
-rw-r--r--cmds/statsd/Android.mk319
-rw-r--r--cmds/statsd/android.frameworks.stats@1.0-service.xml11
-rw-r--r--cmds/statsd/src/atoms.proto13
-rw-r--r--cmds/statsd/src/external/StatsPuller.cpp4
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp6
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.cpp41
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.h37
-rw-r--r--cmds/statsd/src/stats_log.proto4
-rw-r--r--cmds/statsd/src/stats_log_util.cpp12
-rw-r--r--cmds/statsd/tests/guardrail/StatsdStats_test.cpp33
-rw-r--r--cmds/statsd/tools/Android.mk20
-rw-r--r--cmds/statsd/tools/dogfood/Android.bp37
-rw-r--r--cmds/statsd/tools/dogfood/Android.mk33
-rw-r--r--cmds/statsd/tools/loadtest/Android.bp37
-rw-r--r--cmds/statsd/tools/loadtest/Android.mk33
-rw-r--r--config/boot-image-profile.txt67
-rw-r--r--config/hiddenapi-light-greylist.txt343
-rw-r--r--config/hiddenapi-vendor-list.txt4
-rw-r--r--config/preloaded-classes6
-rw-r--r--core/java/android/accounts/AccountManager.java21
-rw-r--r--core/java/android/app/Activity.java27
-rw-r--r--core/java/android/app/ActivityThread.java13
-rw-r--r--core/java/android/app/AppOpsManager.aidl3
-rw-r--r--core/java/android/app/AppOpsManager.java475
-rw-r--r--core/java/android/app/AutomaticZenRule.java2
-rw-r--r--core/java/android/app/INotificationManager.aidl1
-rw-r--r--core/java/android/app/NotificationManager.java80
-rw-r--r--core/java/android/app/SystemServiceRegistry.java11
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java5
-rw-r--r--core/java/android/app/role/IRoleManager.aidl4
-rw-r--r--core/java/android/app/role/RoleManager.java132
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl4
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java80
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java42
-rw-r--r--core/java/android/content/Context.java12
-rw-r--r--core/java/android/content/Intent.java24
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java16
-rw-r--r--core/java/android/content/pm/PackageParser.java21
-rw-r--r--core/java/android/debug/AdbManager.java (renamed from services/tests/wmtests/src/com/android/server/policy/DummyPolicyTests.java)46
-rw-r--r--core/java/android/debug/AdbManagerInternal.java44
-rw-r--r--core/java/android/debug/IAdbManager.aidl44
-rw-r--r--core/java/android/debug/IAdbTransport.aidl22
-rw-r--r--core/java/android/hardware/location/ContextHubIntentEvent.java224
-rw-r--r--core/java/android/hardware/location/IContextHubClient.aidl4
-rw-r--r--core/java/android/hardware/location/NanoApp.java6
-rw-r--r--core/java/android/hardware/usb/IUsbManager.aidl11
-rw-r--r--core/java/android/net/InterfaceConfiguration.java42
-rw-r--r--core/java/android/net/NetworkStats.java24
-rw-r--r--core/java/android/os/Binder.java5
-rw-r--r--core/java/android/os/RemoteCallbackList.java8
-rw-r--r--core/java/android/os/storage/StorageManagerInternal.java21
-rw-r--r--core/java/android/permission/PermissionManager.java42
-rw-r--r--core/java/android/provider/DocumentsProvider.java40
-rw-r--r--core/java/android/provider/MediaStore.java234
-rw-r--r--core/java/android/provider/Settings.java115
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java43
-rw-r--r--core/java/android/service/notification/ZenPolicy.java4
-rw-r--r--core/java/android/service/textclassifier/TextClassifierService.java65
-rw-r--r--core/java/android/transition/Scene.java14
-rw-r--r--core/java/android/transition/TransitionSet.java16
-rw-r--r--core/java/android/util/ArraySet.java109
-rw-r--r--core/java/android/util/FeatureFlagUtils.java2
-rw-r--r--core/java/android/view/IWindowManager.aidl23
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java33
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl5
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java60
-rw-r--r--core/java/android/view/textclassifier/ConversationActions.java779
-rw-r--r--core/java/android/view/textclassifier/ModelFileManager.java291
-rw-r--r--core/java/android/view/textclassifier/TextClassification.java130
-rw-r--r--core/java/android/view/textclassifier/TextClassifier.java11
-rw-r--r--core/java/android/view/textclassifier/TextClassifierImpl.java300
-rw-r--r--core/java/android/view/textclassifier/TextLinks.java124
-rw-r--r--core/java/android/view/textclassifier/TextSelection.java52
-rw-r--r--core/java/android/widget/RemoteViews.java479
-rw-r--r--core/java/com/android/internal/app/AlertController.java3
-rw-r--r--core/java/com/android/internal/app/IAppOpsService.aidl5
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodDebug.java60
-rw-r--r--core/java/com/android/internal/inputmethod/StartInputFlags.java56
-rw-r--r--core/java/com/android/internal/net/NetworkStatsFactory.java9
-rw-r--r--core/java/com/android/internal/os/ProcStatsUtil.java11
-rw-r--r--core/java/com/android/internal/os/Zygote.java5
-rw-r--r--core/java/com/android/internal/util/ScreenRecordHelper.java52
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl3
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java6
-rw-r--r--core/java/com/android/server/SystemConfig.java51
-rw-r--r--core/jni/android/opengl/util.cpp1
-rw-r--r--core/jni/android_media_AudioFormat.h4
-rw-r--r--core/jni/android_media_AudioSystem.cpp10
-rw-r--r--core/jni/android_util_Binder.cpp15
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp16
-rw-r--r--core/jni/fd_utils.cpp1
-rw-r--r--core/proto/OWNERS4
-rw-r--r--core/proto/android/app/settings_enums.proto43
-rw-r--r--core/proto/android/server/windowmanagerservice.proto2
-rw-r--r--core/proto/android/service/adb.proto38
-rw-r--r--core/proto/android/stats/launcher/Android.bp27
-rw-r--r--core/res/AndroidManifest.xml12
-rw-r--r--core/res/res/values-bs/strings.xml2
-rw-r--r--core/res/res/values-es/strings.xml10
-rw-r--r--core/res/res/values-mcc208-mnc01/config.xml33
-rw-r--r--core/res/res/values-mcc208-mnc10/config.xml34
-rw-r--r--core/res/res/values-mcc214-mnc01/config.xml9
-rw-r--r--core/res/res/values-mcc214-mnc07/config.xml33
-rw-r--r--core/res/res/values-mcc222-mnc10/config.xml9
-rw-r--r--core/res/res/values-mcc234-mnc20/config.xml9
-rw-r--r--core/res/res/values-mcc235-mnc94/config.xml8
-rw-r--r--core/res/res/values-mcc268-mnc03/config.xml9
-rw-r--r--core/res/res/values-mcc302-mnc220/config.xml11
-rw-r--r--core/res/res/values-mcc302-mnc221/config.xml12
-rw-r--r--core/res/res/values-mcc302-mnc370/config.xml11
-rw-r--r--core/res/res/values-mcc302-mnc660/config.xml10
-rw-r--r--core/res/res/values-mcc302-mnc720/config.xml13
-rw-r--r--core/res/res/values-mcc311-mnc190/config.xml9
-rw-r--r--core/res/res/values-mcc334-mnc050/config.xml9
-rw-r--r--core/res/res/values-mcc340-mnc01/config.xml9
-rw-r--r--core/res/res/values-mcc425-mnc07/config.xml9
-rw-r--r--core/res/res/values-mcc454-mnc10/config.xml33
-rw-r--r--core/res/res/values/attrs_manifest.xml6
-rw-r--r--core/res/res/values/config.xml11
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java301
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java14
-rw-r--r--core/tests/coretests/src/android/widget/RemoteViewsTest.java39
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java67
-rw-r--r--core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java192
-rw-r--r--core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java107
-rw-r--r--data/etc/platform.xml22
-rw-r--r--data/etc/privapp-permissions-platform.xml3
-rw-r--r--graphics/java/android/graphics/text/MeasuredText.java6
-rw-r--r--libs/hwui/SkiaCanvas.cpp8
-rw-r--r--libs/hwui/hwui/Paint.h9
-rw-r--r--libs/hwui/hwui/PaintImpl.cpp6
-rw-r--r--libs/hwui/tests/common/scenes/ListViewAnimation.cpp1
-rw-r--r--libs/hwui/tests/macrobench/TestSceneRunner.cpp10
-rw-r--r--libs/incident/Android.bp50
-rw-r--r--libs/incident/Android.mk43
-rw-r--r--media/java/android/media/AudioFormat.java52
-rw-r--r--media/java/android/media/AudioPresentation.java254
-rw-r--r--media/java/android/media/MediaPlayer2.java125
-rw-r--r--media/java/android/media/MediaPlayer2Impl.java316
-rw-r--r--media/jni/Android.bp7
-rw-r--r--media/jni/android_media_AudioPresentation.h45
-rw-r--r--media/jni/android_media_MediaScanner.cpp2
-rw-r--r--media/jni/android_mtp_MtpDatabase.cpp1
-rw-r--r--native/android/Android.bp2
-rw-r--r--native/android/libandroid.map.txt1
-rw-r--r--native/android/system_fonts.cpp40
-rw-r--r--packages/BackupRestoreConfirmation/res/values-mr/strings.xml4
-rw-r--r--packages/CarrierDefaultApp/res/values-mr/strings.xml2
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/Assistant.java44
-rw-r--r--packages/OsuLogin/Android.mk1
-rw-r--r--packages/OsuLogin/AndroidManifest.xml13
-rw-r--r--packages/OsuLogin/res/layout/osu_web_view.xml41
-rw-r--r--packages/OsuLogin/res/values/strings.xml2
-rw-r--r--packages/OsuLogin/src/com/android/hotspot2/osu/OsuLoginActivity.java52
-rw-r--r--packages/PackageInstaller/res/values-af/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-am/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ar/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-as/strings.xml166
-rw-r--r--packages/PackageInstaller/res/values-az/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-be/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-bg/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-bn/strings.xml11
-rw-r--r--packages/PackageInstaller/res/values-bs/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ca/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-cs/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-da/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-de/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-el/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rAU/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rCA/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rGB/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rIN/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rXC/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-es-rUS/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-es/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-et/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-eu/strings.xml7
-rw-r--r--packages/PackageInstaller/res/values-fa/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-gl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-gu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hy/strings.xml5
-rw-r--r--packages/PackageInstaller/res/values-in/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-is/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-it/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-iw/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ja/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ka/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-kk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-km/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-kn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ko/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ky/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lo/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lt/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lv/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ml/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ms/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-my/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-nb/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ne/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-nl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-or/strings.xml94
-rw-r--r--packages/PackageInstaller/res/values-pa/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ro/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ru/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-si/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sq/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sv/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sw/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ta/strings.xml29
-rw-r--r--packages/PackageInstaller/res/values-te/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-th/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-tl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-tr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-uk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ur/strings.xml94
-rw-r--r--packages/PackageInstaller/res/values-uz/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-vi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rHK/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zu/strings.xml3
-rw-r--r--packages/PrintSpooler/res/values-mr/strings.xml2
-rw-r--r--packages/SettingsLib/HelpUtils/res/values-hi/strings.xml21
-rw-r--r--packages/SettingsLib/SearchWidget/res/values-or/strings.xml21
-rw-r--r--packages/SettingsLib/SearchWidget/res/values-ur/strings.xml21
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java13
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java39
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java26
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java8
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java21
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java30
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java17
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java12
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java10
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java7
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java11
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/DrawableTestHelper.java (renamed from services/tests/wmtests/src/com/android/server/wm/DummyWmTests.java)36
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java36
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java3
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java2
-rw-r--r--packages/Shell/res/values-mr/strings.xml12
-rw-r--r--packages/SystemUI/AndroidManifest.xml15
-rw-r--r--packages/SystemUI/OWNERS16
-rw-r--r--packages/SystemUI/legacy/recents/res/values-af/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-am/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ar/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-az/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-b+sr+Latn/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-be/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-bg/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-bs/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ca/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-cs/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-da/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-de/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-el/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-en-rAU/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-en-rCA/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-en-rGB/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-en-rIN/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-en-rXC/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-es-rUS/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-es/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-et/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-eu/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-fa/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-fi/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-fr-rCA/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-fr/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-gl/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-gu/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-hi/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-hr/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-hu/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-hy/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-in/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-is/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-it/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-iw/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ja/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ka/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-kk/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-km/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-kn/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ko/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ky/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-lo/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-lt/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-lv/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-mk/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-mn/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-mr/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ms/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-my/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-nb/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-nl/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-pa/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-pl/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-pt-rBR/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-pt-rPT/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-pt/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ro/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ru/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sk/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sl/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sq/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sr/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sv/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-sw/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-th/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-tl/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-tr/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-uk/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-ur/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-uz/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-vi/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-zh-rCN/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-zh-rHK/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-zh-rTW/strings.xml43
-rw-r--r--packages/SystemUI/legacy/recents/res/values-zu/strings.xml43
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java5
-rwxr-xr-xpackages/SystemUI/plugin/update_plugin_lib.sh2
-rw-r--r--packages/SystemUI/res/drawable/biometric_dialog_bg.xml4
-rw-r--r--packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml18
-rw-r--r--packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml28
-rw-r--r--packages/SystemUI/res/drawable/privacy_chip_bg.xml22
-rw-r--r--packages/SystemUI/res/layout/biometric_dialog.xml10
-rw-r--r--packages/SystemUI/res/layout/notification_info.xml46
-rw-r--r--packages/SystemUI/res/layout/ongoing_privacy_chip.xml44
-rw-r--r--packages/SystemUI/res/layout/ongoing_privacy_dialog_content.xml50
-rw-r--r--packages/SystemUI/res/layout/ongoing_privacy_text_item.xml24
-rw-r--r--packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml2
-rw-r--r--packages/SystemUI/res/layout/screen_record_dialog.xml41
-rw-r--r--packages/SystemUI/res/values-af/strings.xml39
-rw-r--r--packages/SystemUI/res/values-am/strings.xml39
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml37
-rw-r--r--packages/SystemUI/res/values-as/strings.xml33
-rw-r--r--packages/SystemUI/res/values-az/strings.xml31
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml34
-rw-r--r--packages/SystemUI/res/values-be/strings.xml35
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml33
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml33
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml36
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml31
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml35
-rw-r--r--packages/SystemUI/res/values-da/strings.xml33
-rw-r--r--packages/SystemUI/res/values-de/strings.xml51
-rw-r--r--packages/SystemUI/res/values-el/strings.xml33
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml31
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml31
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml31
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml31
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml31
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml33
-rw-r--r--packages/SystemUI/res/values-es/strings.xml31
-rw-r--r--packages/SystemUI/res/values-et/strings.xml33
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml31
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml33
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml31
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml33
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml33
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml33
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml33
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml33
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml32
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml33
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml33
-rw-r--r--packages/SystemUI/res/values-in/strings.xml31
-rw-r--r--packages/SystemUI/res/values-is/strings.xml31
-rw-r--r--packages/SystemUI/res/values-it/strings.xml31
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml57
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml33
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml33
-rw-r--r--packages/SystemUI/res/values-km/strings.xml33
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml33
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml33
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml33
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml34
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml33
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml31
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml33
-rw-r--r--packages/SystemUI/res/values-my/strings.xml33
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml33
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml33
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml33
-rw-r--r--packages/SystemUI/res/values-or/strings.xml33
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml33
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml35
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml31
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml31
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml31
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml34
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml35
-rw-r--r--packages/SystemUI/res/values-si/strings.xml33
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml35
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml35
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml33
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml34
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml33
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml31
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml33
-rw-r--r--packages/SystemUI/res/values-te/strings.xml33
-rw-r--r--packages/SystemUI/res/values-th/strings.xml33
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml33
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml33
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml35
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml33
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml33
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml33
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml33
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml35
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml33
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml33
-rw-r--r--packages/SystemUI/res/values/colors.xml5
-rw-r--r--packages/SystemUI/res/values/dimens.xml17
-rw-r--r--packages/SystemUI/res/values/strings.xml71
-rw-r--r--packages/SystemUI/res/values/styles.xml9
-rw-r--r--packages/SystemUI/res/xml/fileprovider.xml1
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/StatsLogCompat.java (renamed from services/tests/wmtests/src/com/android/server/am/DummyAmTests.java)39
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/InitController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt152
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt109
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt74
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt55
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java451
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java135
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/SwitchToGuestTimer.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java81
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java62
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java61
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java83
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java71
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt81
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeZenModeController.java6
-rw-r--r--packages/VpnDialogs/res/values-de/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-hi/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-mr/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-vi/strings.xml2
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-af/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-am/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ar/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-az/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-b+sr+Latn/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-be/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bg/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bs/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ca/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-cs/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-da/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-de/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-el/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rAU/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rCA/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rGB/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rIN/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rXC/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es-rUS/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-et/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-eu/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fa/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr-rCA/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-gl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hu/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hy/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-in/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-is/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-it/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-iw/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ja/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ka/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-kk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-km/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ko/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ky/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lo/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lt/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lv/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mn/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ms/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-my/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nb/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rBR/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rPT/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ro/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ru/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sq/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sv/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sw/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-th/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ur/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uz/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-vi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rCN/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rHK/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rTW/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zu/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-af/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-am/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ar/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-az/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-b+sr+Latn/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-be/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bg/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bs/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ca/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-cs/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-da/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-de/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-el/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rAU/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rCA/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rGB/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rIN/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rXC/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es-rUS/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-et/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-eu/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fa/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr-rCA/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-gl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hu/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hy/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-in/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-is/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-it/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-iw/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ja/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ka/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-kk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-km/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ko/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ky/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lo/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lt/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lv/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mn/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ms/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-my/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nb/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rBR/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rPT/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ro/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ru/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sq/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sv/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sw/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-th/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tl/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tr/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uk/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ur/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uz/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-vi/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rCN/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rHK/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rTW/strings.xml23
-rw-r--r--packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zu/strings.xml23
-rw-r--r--proto/src/metrics_constants/metrics_constants.proto5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java15
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java96
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java2
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java22
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/SaveUi.java63
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java10
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java176
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java4
-rw-r--r--services/core/java/com/android/server/AppOpsService.java118
-rw-r--r--services/core/java/com/android/server/MmsServiceBroker.java3
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java96
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java20
-rw-r--r--services/core/java/com/android/server/adb/AdbDebuggingManager.java (renamed from services/usb/java/com/android/server/usb/UsbDebuggingManager.java)95
-rw-r--r--services/core/java/com/android/server/adb/AdbService.java311
-rw-r--r--services/core/java/com/android/server/am/ActivityDisplay.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java41
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java103
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java128
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java128
-rw-r--r--services/core/java/com/android/server/am/ActivityStartController.java7
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityTaskManagerService.java138
-rw-r--r--services/core/java/com/android/server/am/KeyguardController.java28
-rw-r--r--services/core/java/com/android/server/am/LockTaskController.java5
-rw-r--r--services/core/java/com/android/server/am/PersisterQueue.java5
-rw-r--r--services/core/java/com/android/server/am/RecentsAnimation.java7
-rw-r--r--services/core/java/com/android/server/am/TaskLaunchParamsModifier.java13
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java7
-rw-r--r--services/core/java/com/android/server/connectivity/PermissionMonitor.java27
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java44
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodUtils.java10
-rw-r--r--services/core/java/com/android/server/location/ContextHubClientBroker.java216
-rw-r--r--services/core/java/com/android/server/location/ContextHubService.java14
-rw-r--r--services/core/java/com/android/server/location/NanoAppStateManager.java12
-rw-r--r--services/core/java/com/android/server/net/NetworkStatsService.java6
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java40
-rw-r--r--services/core/java/com/android/server/notification/ZenLog.java9
-rw-r--r--services/core/java/com/android/server/notification/ZenModeExtractor.java5
-rw-r--r--services/core/java/com/android/server/notification/ZenModeFiltering.java44
-rw-r--r--services/core/java/com/android/server/notification/ZenModeHelper.java77
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java8
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java34
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java3
-rw-r--r--services/core/java/com/android/server/role/RemoteRoleControllerService.java12
-rw-r--r--services/core/java/com/android/server/role/RoleManagerService.java33
-rw-r--r--services/core/java/com/android/server/role/RoleUserState.java19
-rw-r--r--services/core/java/com/android/server/security/VerityUtils.java11
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java8
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java23
-rw-r--r--services/core/java/com/android/server/wm/AppTransitionController.java631
-rw-r--r--services/core/java/com/android/server/wm/AppWindowContainerController.java143
-rw-r--r--services/core/java/com/android/server/wm/AppWindowThumbnail.java2
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java80
-rw-r--r--services/core/java/com/android/server/wm/BlackFrame.java8
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java114
-rw-r--r--services/core/java/com/android/server/wm/DisplayWindowController.java135
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java15
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackController.java4
-rw-r--r--services/core/java/com/android/server/wm/PinnedStackWindowController.java5
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java3
-rw-r--r--services/core/java/com/android/server/wm/RemoteAnimationController.java2
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java83
-rw-r--r--services/core/java/com/android/server/wm/StackWindowController.java17
-rw-r--r--services/core/java/com/android/server/wm/Task.java20
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java7
-rw-r--r--services/core/java/com/android/server/wm/UnknownAppVisibilityController.java8
-rw-r--r--services/core/java/com/android/server/wm/WallpaperController.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java264
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java588
-rw-r--r--services/core/jni/com_android_server_connectivity_Vpn.cpp2
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp66
-rw-r--r--services/core/jni/com_android_server_security_VerityUtils.cpp25
-rw-r--r--services/java/com/android/server/SystemServer.java11
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java88
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java94
-rw-r--r--services/tests/servicestests/src/com/android/server/inputmethod/InputMethodUtilsTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java576
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppTransitionControllerTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java)18
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java146
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java36
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java33
-rw-r--r--services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java2
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java12
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java6
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java37
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java65
-rw-r--r--services/tests/wmtests/Android.mk8
-rw-r--r--services/tests/wmtests/AndroidManifest.xml22
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityDisplayTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityDisplayTests.java)35
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityManagerInternalTest.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java)28
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityManagerServiceTest.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java)30
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityManagerTest.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java)16
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityOptionsTest.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java)17
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityRecordTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java)41
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityStackSupervisorTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java)98
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityStackTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java)215
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityStartControllerTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java)14
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityStartInterceptorTest.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java)16
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityStarterTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java)38
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ActivityTestsBase.java (renamed from services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java)207
-rw-r--r--services/tests/wmtests/src/com/android/server/am/AppErrorDialogTest.java (renamed from services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java)13
-rw-r--r--services/tests/wmtests/src/com/android/server/am/AssistDataRequesterTest.java (renamed from services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java)93
-rw-r--r--services/tests/wmtests/src/com/android/server/am/BroadcastRecordTest.java (renamed from services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java)5
-rw-r--r--services/tests/wmtests/src/com/android/server/am/ClientLifecycleManagerTests.java (renamed from services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java)23
-rw-r--r--services/tests/wmtests/src/com/android/server/am/CoreSettingsObserverTest.java (renamed from services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java)43
-rw-r--r--services/tests/wmtests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java (renamed from services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java)26
-rw-r--r--services/tests/wmtests/src/com/android/server/am/LaunchParamsControllerTests.java (renamed from services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java)24
-rw-r--r--services/tests/wmtests/src/com/android/server/am/LockTaskControllerTest.java (renamed from services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java)44
-rw-r--r--services/tests/wmtests/src/com/android/server/am/MemoryStatUtilTest.java (renamed from services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java)97
-rw-r--r--services/tests/wmtests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java (renamed from services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java)12
-rw-r--r--services/tests/wmtests/src/com/android/server/am/PersisterQueueTests.java (renamed from services/tests/servicestests/src/com/android/server/am/PersisterQueueTests.java)34
-rw-r--r--services/tests/wmtests/src/com/android/server/am/RecentTasksTest.java (renamed from services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java)453
-rw-r--r--services/tests/wmtests/src/com/android/server/am/RecentsAnimationTest.java (renamed from services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java)39
-rw-r--r--services/tests/wmtests/src/com/android/server/am/RunningTasksTest.java (renamed from services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java)36
-rw-r--r--services/tests/wmtests/src/com/android/server/am/SafeActivityOptionsTest.java (renamed from services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java)11
-rw-r--r--services/tests/wmtests/src/com/android/server/am/TaskLaunchParamsModifierTests.java (renamed from services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java)30
-rw-r--r--services/tests/wmtests/src/com/android/server/am/TaskPersisterTest.java (renamed from services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java)32
-rw-r--r--services/tests/wmtests/src/com/android/server/am/TaskRecordTests.java (renamed from services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java)11
-rw-r--r--services/tests/wmtests/src/com/android/server/am/TaskStackChangedListenerTest.java (renamed from services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java)58
-rw-r--r--services/tests/wmtests/src/com/android/server/am/UserControllerTest.java (renamed from services/tests/servicestests/src/com/android/server/am/UserControllerTest.java)101
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/FakeWindowState.java (renamed from services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java)10
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java (renamed from services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java)25
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java (renamed from services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java)15
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTest.java (renamed from services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java)23
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTestBase.java (renamed from services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java)8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java (renamed from services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java)23
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java (renamed from services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java)51
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java)8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java115
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/CoordinateTransformsTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java)8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java)43
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/InsetUtilsTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java)11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/RotationCacheTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java)17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java (renamed from services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java)16
-rw-r--r--services/usage/java/com/android/server/usage/AppTimeLimitController.java849
-rw-r--r--services/usage/java/com/android/server/usage/StorageStatsService.java4
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java112
-rw-r--r--services/usb/java/com/android/server/usb/UsbDeviceManager.java147
-rw-r--r--services/usb/java/com/android/server/usb/UsbService.java18
-rw-r--r--telecomm/java/android/telecom/Call.java28
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java18
-rw-r--r--telephony/java/android/telephony/CellIdentityCdma.java34
-rw-r--r--telephony/java/android/telephony/CellIdentityGsm.java51
-rw-r--r--telephony/java/android/telephony/CellIdentityLte.java50
-rw-r--r--telephony/java/android/telephony/CellIdentityTdscdma.java44
-rw-r--r--telephony/java/android/telephony/CellIdentityWcdma.java46
-rw-r--r--telephony/java/android/telephony/CellInfo.java5
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthCdma.java37
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthGsm.java21
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthLte.java112
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthTdscdma.java20
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthWcdma.java22
-rw-r--r--telephony/java/android/telephony/PhoneStateListener.java8
-rw-r--r--telephony/java/android/telephony/SignalStrength.java17
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java10
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java231
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl47
-rw-r--r--telephony/java/com/android/internal/telephony/SmsApplication.java11
-rw-r--r--tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java34
-rw-r--r--tests/net/java/android/net/NetworkStatsTest.java78
-rw-r--r--tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java111
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java21
-rw-r--r--wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java8
834 files changed, 22666 insertions, 9857 deletions
diff --git a/Android.bp b/Android.bp
index 54b576003432..b715b7336d23 100644
--- a/Android.bp
+++ b/Android.bp
@@ -150,6 +150,8 @@ java_defaults {
"core/java/android/content/pm/dex/ISnapshotRuntimeProfileCallback.aidl",
"core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl",
"core/java/android/database/IContentObserver.aidl",
+ "core/java/android/debug/IAdbManager.aidl",
+ "core/java/android/debug/IAdbTransport.aidl",
":libcamera_client_aidl",
":libcamera_client_framework_aidl",
"core/java/android/hardware/IConsumerIrService.aidl",
@@ -235,8 +237,7 @@ java_defaults {
"core/java/android/os/IDeviceIdentifiersPolicyService.aidl",
"core/java/android/os/IDeviceIdleController.aidl",
"core/java/android/os/IHardwarePropertiesManager.aidl",
- "core/java/android/os/IIncidentManager.aidl",
- "core/java/android/os/IIncidentReportStatusListener.aidl",
+ ":libincident_aidl",
"core/java/android/os/IMaintenanceActivityListener.aidl",
"core/java/android/os/IMessenger.aidl",
"core/java/android/os/INetworkActivityListener.aidl",
@@ -249,8 +250,7 @@ java_defaults {
"core/java/android/os/IRecoverySystemProgressListener.aidl",
"core/java/android/os/IRemoteCallback.aidl",
"core/java/android/os/ISchedulingPolicyService.aidl",
- "core/java/android/os/IStatsCompanionService.aidl",
- "core/java/android/os/IStatsManager.aidl",
+ ":statsd_aidl",
"core/java/android/os/ISystemUpdateManager.aidl",
"core/java/android/os/IThermalEventListener.aidl",
"core/java/android/os/IThermalService.aidl",
@@ -724,6 +724,22 @@ java_defaults {
}
+filegroup {
+ name: "libincident_aidl",
+ srcs: [
+ "core/java/android/os/IIncidentManager.aidl",
+ "core/java/android/os/IIncidentReportStatusListener.aidl",
+ ],
+}
+
+filegroup {
+ name: "statsd_aidl",
+ srcs: [
+ "core/java/android/os/IStatsCompanionService.aidl",
+ "core/java/android/os/IStatsManager.aidl",
+ ],
+}
+
java_library {
name: "framework",
defaults: ["framework-defaults"],
@@ -934,12 +950,14 @@ gensrcs {
"core/proto/android/os/batterytype.proto",
"core/proto/android/os/cpufreq.proto",
"core/proto/android/os/cpuinfo.proto",
+ "core/proto/android/os/data.proto",
"core/proto/android/os/kernelwake.proto",
"core/proto/android/os/pagetypeinfo.proto",
"core/proto/android/os/procrank.proto",
"core/proto/android/os/ps.proto",
"core/proto/android/os/system_properties.proto",
"core/proto/android/util/event_log_tags.proto",
+ "core/proto/android/util/log.proto",
],
// Append protoc-gen-cppstream tool's PATH otherwise aprotoc can't find the plugin tool
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 5c212213f2d1..ec3366c2eb2f 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,20 +1,5 @@
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
- -fw core/
- graphics/java/android
- packages/PrintRecommendationService/
- packages/PrintSpooler/
- packages/PackageInstaller/
- packages/SystemUI/
- services/print/
- services/usb/
- telephony/
- tests/ActivityViewTest/
- tests/LotsOfApps/
- tests/NativeProcessesMemoryTest/
- tests/OdmApps/
- tests/SystemMemoryTest/
- wifi/
api_lint_hook = ${REPO_ROOT}/frameworks/base/tools/apilint/apilint_sha.sh ${PREUPLOAD_COMMIT}
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
index e224fa39422c..35d380232bec 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
@@ -245,10 +245,11 @@ public class StaticLayoutPerfTest {
state.pauseTiming();
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -261,10 +262,11 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -277,10 +279,11 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -293,11 +296,12 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -310,11 +314,12 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -328,10 +333,11 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -345,10 +351,11 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -362,11 +369,12 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
@@ -380,11 +388,12 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.start(1200, 200);
+ final RecordingCanvas c = node.startRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
+ node.endRecording();
}
}
diff --git a/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java b/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java
new file mode 100644
index 000000000000..0c1f2899690d
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/util/ArraySetPerfTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.function.Predicate;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class ArraySetPerfTest {
+ private static final int NUM_ITERATIONS = 100;
+ private static final int SET_SIZE_SMALL = 10;
+ private static final int SET_SIZE_LARGE = 50;
+
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ @Test
+ public void testValueAt_InBounds() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ ArraySet<Integer> set = new ArraySet<>();
+ set.add(0);
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ set.valueAt(0);
+ }
+ }
+ }
+
+ @Test
+ public void testValueAt_OutOfBounds_Negative() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ ArraySet<Integer> set = new ArraySet<>();
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ try {
+ set.valueAt(-1);
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+ }
+ }
+
+ /**
+ * Tests the case where ArraySet could index into its array even though the index is out of
+ * bounds.
+ */
+ @Test
+ public void testValueAt_OutOfBounds_EdgeCase() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ ArraySet<Integer> set = new ArraySet<>();
+ set.add(0);
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ try {
+ set.valueAt(1);
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+ }
+ }
+
+ /**
+ * This is the same code as testRemoveIf_Small_* without the removeIf in order to measure
+ * the performance of the rest of the code in the loop.
+ */
+ @Test
+ public void testRemoveIf_Small_Base() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> i % 2 == 0;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_SMALL; ++j) {
+ set.add(j);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Small_RemoveNothing() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> false;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_SMALL; ++j) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Small_RemoveAll() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> true;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_SMALL; j++) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Small_RemoveHalf() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> i % 2 == 0;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_SMALL; ++j) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+
+ /**
+ * This is the same code as testRemoveIf_Large_* without the removeIf in order to measure
+ * the performance of the rest of the code in the loop.
+ */
+ @Test
+ public void testRemoveIf_Large_Base() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> i % 2 == 0;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_LARGE; ++j) {
+ set.add(j);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Large_RemoveNothing() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> false;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_LARGE; ++j) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Large_RemoveAll() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> true;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_LARGE; ++j) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+
+ @Test
+ public void testRemoveIf_Large_RemoveHalf() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ Predicate<Integer> predicate = (i) -> i % 2 == 0;
+ while (state.keepRunning()) {
+ for (int i = 0; i < NUM_ITERATIONS; ++i) {
+ ArraySet<Integer> set = new ArraySet<>();
+ for (int j = 0; j < SET_SIZE_LARGE; ++j) {
+ set.add(j);
+ }
+ set.removeIf(predicate);
+ }
+ }
+ }
+}
diff --git a/api/current.txt b/api/current.txt
index 02070c518f1a..5ab3f6a05d33 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -1209,6 +1209,7 @@ package android {
field public static final int shareInterpolator = 16843195; // 0x10101bb
field public static final int sharedUserId = 16842763; // 0x101000b
field public static final int sharedUserLabel = 16843361; // 0x1010261
+ field public static final int shell = 16844180; // 0x1010594
field public static final int shortcutDisabledMessage = 16844075; // 0x101052b
field public static final int shortcutId = 16844072; // 0x1010528
field public static final int shortcutLongLabel = 16844074; // 0x101052a
@@ -10833,6 +10834,7 @@ package android.content.pm {
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
method public static java.lang.CharSequence getCategoryTitle(android.content.Context, int);
+ method public boolean isProfileableByShell();
method public boolean isVirtualPreload();
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
field public static final int CATEGORY_AUDIO = 1; // 0x1
@@ -22925,6 +22927,8 @@ package android.media {
method public java.util.Map<java.util.Locale, java.lang.String> getLabels();
method public java.util.Locale getLocale();
method public int getMasteringIndication();
+ method public int getPresentationId();
+ method public int getProgramId();
method public boolean hasAudioDescription();
method public boolean hasDialogueEnhancement();
method public boolean hasSpokenSubtitles();
@@ -22935,6 +22939,18 @@ package android.media {
field public static final int MASTERING_NOT_INDICATED = 0; // 0x0
}
+ public static class AudioPresentation.Builder {
+ ctor public AudioPresentation.Builder(int);
+ method public android.media.AudioPresentation build();
+ method public android.media.AudioPresentation.Builder setHasAudioDescription(boolean);
+ method public android.media.AudioPresentation.Builder setHasDialogueEnhancement(boolean);
+ method public android.media.AudioPresentation.Builder setHasSpokenSubtitles(boolean);
+ method public android.media.AudioPresentation.Builder setLabels(java.util.Map<android.icu.util.ULocale, java.lang.String>);
+ method public android.media.AudioPresentation.Builder setLocale(android.icu.util.ULocale);
+ method public android.media.AudioPresentation.Builder setMasteringIndication(int);
+ method public android.media.AudioPresentation.Builder setProgramId(int);
+ }
+
public class AudioRecord implements android.media.AudioRouting {
ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
@@ -36816,6 +36832,7 @@ package android.provider {
method public android.database.Cursor queryChildDocuments(java.lang.String, java.lang.String[], android.os.Bundle) throws java.io.FileNotFoundException;
method public abstract android.database.Cursor queryDocument(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
+ method public android.database.Cursor queryRecentDocuments(java.lang.String, java.lang.String[], android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
method public abstract android.database.Cursor queryRoots(java.lang.String[]) throws java.io.FileNotFoundException;
method public android.database.Cursor querySearchDocuments(java.lang.String, java.lang.String, java.lang.String[]) throws java.io.FileNotFoundException;
method public void removeDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
@@ -36900,6 +36917,7 @@ package android.provider {
public final class MediaStore {
ctor public MediaStore();
+ method public static java.util.Set<java.lang.String> getAllVolumeNames(android.content.Context);
method public static android.net.Uri getDocumentUri(android.content.Context, android.net.Uri);
method public static android.net.Uri getMediaScannerUri();
method public static android.net.Uri getMediaUri(android.content.Context, android.net.Uri);
@@ -36907,9 +36925,12 @@ package android.provider {
method public static java.lang.String getVolumeName(android.net.Uri);
field public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
field public static final java.lang.String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE";
+ field public static final java.lang.String ACTION_REVIEW = "android.provider.action.REVIEW";
+ field public static final java.lang.String ACTION_REVIEW_SECURE = "android.provider.action.REVIEW_SECURE";
field public static final java.lang.String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
field public static final java.lang.String AUTHORITY = "media";
field public static final android.net.Uri AUTHORITY_URI;
+ field public static final java.lang.String EXTRA_BRIGHTNESS = "android.provider.extra.BRIGHTNESS";
field public static final java.lang.String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
field public static final java.lang.String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
field public static final java.lang.String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
@@ -37035,7 +37056,7 @@ package android.provider {
public static final class MediaStore.Audio.Media implements android.provider.MediaStore.Audio.AudioColumns {
ctor public MediaStore.Audio.Media();
method public static android.net.Uri getContentUri(java.lang.String);
- method public static android.net.Uri getContentUriForPath(java.lang.String);
+ method public static deprecated android.net.Uri getContentUriForPath(java.lang.String);
field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
field public static final java.lang.String DEFAULT_SORT_ORDER = "title_key";
field public static final java.lang.String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/audio";
@@ -37157,6 +37178,7 @@ package android.provider {
field public static final java.lang.String DATE_ADDED = "date_added";
field public static final java.lang.String DATE_MODIFIED = "date_modified";
field public static final java.lang.String DISPLAY_NAME = "_display_name";
+ field public static final java.lang.String HASH = "_hash";
field public static final java.lang.String HEIGHT = "height";
field public static final java.lang.String MIME_TYPE = "mime_type";
field public static final java.lang.String SIZE = "_size";
@@ -41646,6 +41668,7 @@ package android.telecom {
field public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 2048; // 0x800
field public static final int PROPERTY_RTT = 1024; // 0x400
field public static final int PROPERTY_SELF_MANAGED = 256; // 0x100
+ field public static final int PROPERTY_VOIP_AUDIO_MODE = 4096; // 0x1000
field public static final int PROPERTY_WIFI = 8; // 0x8
}
@@ -42607,6 +42630,7 @@ package android.telephony {
field public static final java.lang.String KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
field public static final java.lang.String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool";
field public static final java.lang.String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = "support_3gpp_call_forwarding_while_roaming_bool";
+ field public static final java.lang.String KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL = "support_clir_network_default_bool";
field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
field public static final java.lang.String KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL = "support_emergency_sms_over_ims_bool";
field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
@@ -42713,6 +42737,7 @@ package android.telephony {
field public static final int CONNECTION_SECONDARY_SERVING = 2; // 0x2
field public static final int CONNECTION_UNKNOWN = 2147483647; // 0x7fffffff
field public static final android.os.Parcelable.Creator<android.telephony.CellInfo> CREATOR;
+ field public static final int UNAVAILABLE = 2147483647; // 0x7fffffff
}
public final class CellInfoCdma extends android.telephony.CellInfo implements android.os.Parcelable {
@@ -42796,6 +42821,7 @@ package android.telephony {
method public int getLevel();
method public int getRsrp();
method public int getRsrq();
+ method public int getRssi();
method public int getRssnr();
method public int getTimingAdvance();
method public void writeToParcel(android.os.Parcel, int);
@@ -43009,6 +43035,7 @@ package android.telephony {
field public static final int LISTEN_CELL_LOCATION = 16; // 0x10
field public static final int LISTEN_DATA_ACTIVITY = 128; // 0x80
field public static final int LISTEN_DATA_CONNECTION_STATE = 64; // 0x40
+ field public static final int LISTEN_EMERGENCY_NUMBER_LIST = 16777216; // 0x1000000
field public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 4; // 0x4
field public static final int LISTEN_NONE = 0; // 0x0
field public static final int LISTEN_SERVICE_STATE = 1; // 0x1
@@ -43074,6 +43101,7 @@ package android.telephony {
method public int getLevel();
method public boolean isGsm();
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int INVALID = 2147483647; // 0x7fffffff
}
public final class SmsManager {
@@ -43319,6 +43347,8 @@ package android.telephony {
method public int getCallState();
method public android.os.PersistableBundle getCarrierConfig();
method public deprecated android.telephony.CellLocation getCellLocation();
+ method public java.util.Map<java.lang.Integer, java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList();
+ method public java.util.Map<java.lang.Integer, java.util.List<android.telephony.emergency.EmergencyNumber>> getCurrentEmergencyNumberList(int);
method public int getDataActivity();
method public int getDataNetworkType();
method public int getDataState();
@@ -43372,6 +43402,7 @@ package android.telephony {
method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String);
method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String);
method public boolean isConcurrentVoiceAndDataSupported();
+ method public boolean isCurrentEmergencyNumber(java.lang.String);
method public boolean isDataEnabled();
method public boolean isDataRoamingEnabled();
method public boolean isHearingAidCompatibilitySupported();
@@ -45839,6 +45870,7 @@ package android.transition {
ctor public deprecated Scene(android.view.ViewGroup, android.view.ViewGroup);
method public void enter();
method public void exit();
+ method public static android.transition.Scene getCurrentScene(android.view.View);
method public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
method public android.view.ViewGroup getSceneRoot();
method public void setEnterAction(java.lang.Runnable);
@@ -51427,6 +51459,99 @@ package android.view.inputmethod {
package android.view.textclassifier {
+ public final class ConversationActions implements android.os.Parcelable {
+ ctor public ConversationActions(java.util.List<android.view.textclassifier.ConversationActions.ConversationAction>);
+ method public int describeContents();
+ method public java.util.List<android.view.textclassifier.ConversationActions.ConversationAction> getConversationActions();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions> CREATOR;
+ field public static final java.lang.String HINT_FOR_IN_APP = "in_app";
+ field public static final java.lang.String HINT_FOR_NOTIFICATION = "notification";
+ field public static final java.lang.String TYPE_CALL_PHONE = "call_phone";
+ field public static final java.lang.String TYPE_CREATE_REMINDER = "create_reminder";
+ field public static final java.lang.String TYPE_OPEN_URL = "open_url";
+ field public static final java.lang.String TYPE_SEND_EMAIL = "send_email";
+ field public static final java.lang.String TYPE_SEND_SMS = "send_sms";
+ field public static final java.lang.String TYPE_SHARE_LOCATION = "share_location";
+ field public static final java.lang.String TYPE_TEXT_REPLY = "text_reply";
+ field public static final java.lang.String TYPE_TRACK_FLIGHT = "track_flight";
+ field public static final java.lang.String TYPE_VIEW_CALENDAR = "view_calendar";
+ field public static final java.lang.String TYPE_VIEW_MAP = "view_map";
+ }
+
+ public static final class ConversationActions.ConversationAction implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.app.RemoteAction getAction();
+ method public float getConfidenceScore();
+ method public android.os.Bundle getExtras();
+ method public java.lang.CharSequence getTextReply();
+ method public java.lang.String getType();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.ConversationAction> CREATOR;
+ }
+
+ public static final class ConversationActions.ConversationAction.Builder {
+ ctor public ConversationActions.ConversationAction.Builder(java.lang.String);
+ method public android.view.textclassifier.ConversationActions.ConversationAction build();
+ method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setAction(android.app.RemoteAction);
+ method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setConfidenceScore(float);
+ method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setExtras(android.os.Bundle);
+ method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setTextReply(java.lang.CharSequence);
+ }
+
+ public static final class ConversationActions.Message implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.app.Person getAuthor();
+ method public android.os.Bundle getExtras();
+ method public java.lang.CharSequence getText();
+ method public java.time.ZonedDateTime getTime();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Message> CREATOR;
+ }
+
+ public static final class ConversationActions.Message.Builder {
+ ctor public ConversationActions.Message.Builder();
+ method public android.view.textclassifier.ConversationActions.Message build();
+ method public android.view.textclassifier.ConversationActions.Message.Builder setAuthor(android.app.Person);
+ method public android.view.textclassifier.ConversationActions.Message.Builder setComposeTime(java.time.ZonedDateTime);
+ method public android.view.textclassifier.ConversationActions.Message.Builder setExtras(android.os.Bundle);
+ method public android.view.textclassifier.ConversationActions.Message.Builder setText(java.lang.CharSequence);
+ }
+
+ public static final class ConversationActions.Request implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
+ method public java.util.List<java.lang.String> getHints();
+ method public int getMaxSuggestions();
+ method public android.view.textclassifier.ConversationActions.TypeConfig getTypeConfig();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Request> CREATOR;
+ }
+
+ public static final class ConversationActions.Request.Builder {
+ ctor public ConversationActions.Request.Builder(java.util.List<android.view.textclassifier.ConversationActions.Message>);
+ method public android.view.textclassifier.ConversationActions.Request build();
+ method public android.view.textclassifier.ConversationActions.Request.Builder setHints(java.util.List<java.lang.String>);
+ method public android.view.textclassifier.ConversationActions.Request.Builder setMaxSuggestions(int);
+ method public android.view.textclassifier.ConversationActions.Request.Builder setTypeConfig(android.view.textclassifier.ConversationActions.TypeConfig);
+ }
+
+ public static final class ConversationActions.TypeConfig implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.Collection<java.lang.String> resolveTypes(java.util.Collection<java.lang.String>);
+ method public boolean shouldIncludeTypesFromTextClassifier();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.TypeConfig> CREATOR;
+ }
+
+ public static final class ConversationActions.TypeConfig.Builder {
+ ctor public ConversationActions.TypeConfig.Builder();
+ method public android.view.textclassifier.ConversationActions.TypeConfig build();
+ method public android.view.textclassifier.ConversationActions.TypeConfig.Builder includeTypesFromTextClassifier(boolean);
+ method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setExcludedTypes(java.util.Collection<java.lang.String>);
+ method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setIncludedTypes(java.util.Collection<java.lang.String>);
+ }
+
public final class SelectionEvent implements android.os.Parcelable {
method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int);
method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int, android.view.textclassifier.TextClassification);
@@ -51481,6 +51606,7 @@ package android.view.textclassifier {
method public float getConfidenceScore(java.lang.String);
method public java.lang.String getEntity(int);
method public int getEntityCount();
+ method public android.os.Bundle getExtras();
method public deprecated android.graphics.drawable.Drawable getIcon();
method public java.lang.String getId();
method public deprecated android.content.Intent getIntent();
@@ -51496,6 +51622,7 @@ package android.view.textclassifier {
method public android.view.textclassifier.TextClassification.Builder addAction(android.app.RemoteAction);
method public android.view.textclassifier.TextClassification build();
method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
+ method public android.view.textclassifier.TextClassification.Builder setExtras(android.os.Bundle);
method public deprecated android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
method public android.view.textclassifier.TextClassification.Builder setId(java.lang.String);
method public deprecated android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
@@ -51508,6 +51635,7 @@ package android.view.textclassifier {
method public int describeContents();
method public android.os.LocaleList getDefaultLocales();
method public int getEndIndex();
+ method public android.os.Bundle getExtras();
method public java.time.ZonedDateTime getReferenceTime();
method public int getStartIndex();
method public java.lang.CharSequence getText();
@@ -51519,6 +51647,7 @@ package android.view.textclassifier {
ctor public TextClassification.Request.Builder(java.lang.CharSequence, int, int);
method public android.view.textclassifier.TextClassification.Request build();
method public android.view.textclassifier.TextClassification.Request.Builder setDefaultLocales(android.os.LocaleList);
+ method public android.view.textclassifier.TextClassification.Request.Builder setExtras(android.os.Bundle);
method public android.view.textclassifier.TextClassification.Request.Builder setReferenceTime(java.time.ZonedDateTime);
}
@@ -51563,6 +51692,7 @@ package android.view.textclassifier {
method public default int getMaxGenerateLinksTextLength();
method public default boolean isDestroyed();
method public default void onSelectionEvent(android.view.textclassifier.SelectionEvent);
+ method public default android.view.textclassifier.ConversationActions suggestConversationActions(android.view.textclassifier.ConversationActions.Request);
method public default android.view.textclassifier.TextSelection suggestSelection(android.view.textclassifier.TextSelection.Request);
method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
@@ -54291,6 +54421,7 @@ package android.widget {
method public void setLong(int, java.lang.String, long);
method public void setOnClickFillInIntent(int, android.content.Intent);
method public void setOnClickPendingIntent(int, android.app.PendingIntent);
+ method public void setOnClickResponse(int, android.widget.RemoteViews.RemoteResponse);
method public void setPendingIntentTemplate(int, android.app.PendingIntent);
method public void setProgressBar(int, int, int, boolean);
method public void setRelativeScrollPosition(int, int);
@@ -54311,6 +54442,7 @@ package android.widget {
method public void showPrevious(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.widget.RemoteViews> CREATOR;
+ field public static final java.lang.String EXTRA_SHARED_ELEMENT_BOUNDS = "android.widget.extra.SHARED_ELEMENT_BOUNDS";
}
public static class RemoteViews.ActionException extends java.lang.RuntimeException {
@@ -54318,6 +54450,13 @@ package android.widget {
ctor public RemoteViews.ActionException(java.lang.String);
}
+ public static class RemoteViews.RemoteResponse {
+ ctor public RemoteViews.RemoteResponse();
+ method public android.widget.RemoteViews.RemoteResponse addSharedElement(int, java.lang.String);
+ method public static android.widget.RemoteViews.RemoteResponse fromFillInIntent(android.content.Intent);
+ method public static android.widget.RemoteViews.RemoteResponse fromPendingIntent(android.app.PendingIntent);
+ }
+
public static abstract class RemoteViews.RemoteView implements java.lang.annotation.Annotation {
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 7f5833022004..550f217922b4 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -93,12 +93,14 @@ package android {
field public static final java.lang.String LOCATION_HARDWARE = "android.permission.LOCATION_HARDWARE";
field public static final java.lang.String LOCK_DEVICE = "android.permission.LOCK_DEVICE";
field public static final java.lang.String LOOP_RADIO = "android.permission.LOOP_RADIO";
+ field public static final java.lang.String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY";
field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
field public static final java.lang.String MANAGE_APP_OPS_RESTRICTIONS = "android.permission.MANAGE_APP_OPS_RESTRICTIONS";
field public static final java.lang.String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS";
field public static final java.lang.String MANAGE_AUTO_FILL = "android.permission.MANAGE_AUTO_FILL";
field public static final java.lang.String MANAGE_CARRIER_OEM_UNLOCK_STATE = "android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE";
field public static final java.lang.String MANAGE_CA_CERTIFICATES = "android.permission.MANAGE_CA_CERTIFICATES";
+ field public static final java.lang.String MANAGE_DEBUGGING = "android.permission.MANAGE_DEBUGGING";
field public static final java.lang.String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
field public static final java.lang.String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS";
field public static final java.lang.String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
@@ -292,6 +294,8 @@ package android.app {
}
public class AppOpsManager {
+ method public java.util.List<android.app.AppOpsManager.HistoricalPackageOps> getAllHistoricPackagesOps(java.lang.String[], long, long);
+ method public android.app.AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int, java.lang.String, java.lang.String[], long, long);
method public static java.lang.String[] getOpStrs();
method public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, java.lang.String, int[]);
method public static java.lang.String opToPermission(java.lang.String);
@@ -341,6 +345,39 @@ package android.app {
field public static final java.lang.String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
field public static final java.lang.String OPSTR_WRITE_SMS = "android:write_sms";
field public static final java.lang.String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
+ field public static final int UID_STATE_BACKGROUND = 4; // 0x4
+ field public static final int UID_STATE_CACHED = 5; // 0x5
+ field public static final int UID_STATE_FOREGROUND = 3; // 0x3
+ field public static final int UID_STATE_FOREGROUND_SERVICE = 2; // 0x2
+ field public static final int UID_STATE_PERSISTENT = 0; // 0x0
+ field public static final int UID_STATE_TOP = 1; // 0x1
+ }
+
+ public static final class AppOpsManager.HistoricalOpEntry implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getAccessCount(int);
+ method public long getAccessDuration(int);
+ method public long getBackgroundAccessCount();
+ method public long getBackgroundAccessDuration();
+ method public long getBackgroundRejectCount();
+ method public long getForegroundAccessCount();
+ method public long getForegroundAccessDuration();
+ method public long getForegroundRejectCount();
+ method public java.lang.String getOp();
+ method public long getRejectCount(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOpEntry> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.app.AppOpsManager.HistoricalOpEntry getEntry(java.lang.String);
+ method public android.app.AppOpsManager.HistoricalOpEntry getEntryAt(int);
+ method public int getEntryCount();
+ method public java.lang.String getPackageName();
+ method public int getUid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
}
public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
@@ -809,9 +846,12 @@ package android.app.role {
public final class RoleManager {
method public void addRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
+ method public boolean addRoleHolderFromController(java.lang.String, java.lang.String);
method public void clearRoleHoldersAsUser(java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
- method public java.util.Set<java.lang.String> getRoleHoldersAsUser(java.lang.String, android.os.UserHandle);
+ method public java.util.List<java.lang.String> getRoleHolders(java.lang.String);
+ method public java.util.List<java.lang.String> getRoleHoldersAsUser(java.lang.String, android.os.UserHandle);
method public void removeRoleHolderAsUser(java.lang.String, java.lang.String, android.os.UserHandle, java.util.concurrent.Executor, android.app.role.RoleManagerCallback);
+ method public boolean removeRoleHolderFromController(java.lang.String, java.lang.String);
field public static final java.lang.String EXTRA_REQUEST_ROLE_NAME = "android.app.role.extra.REQUEST_ROLE_NAME";
}
@@ -870,9 +910,11 @@ package android.app.usage {
method public int getAppStandbyBucket(java.lang.String);
method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets();
method public void registerAppUsageObserver(int, java.lang.String[], long, java.util.concurrent.TimeUnit, android.app.PendingIntent);
+ method public void registerUsageSessionObserver(int, java.lang.String[], long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit, android.app.PendingIntent, android.app.PendingIntent);
method public void setAppStandbyBucket(java.lang.String, int);
method public void setAppStandbyBuckets(java.util.Map<java.lang.String, java.lang.Integer>);
method public void unregisterAppUsageObserver(int);
+ method public void unregisterUsageSessionObserver(int);
method public void whitelistAppTemporarily(java.lang.String, long, android.os.UserHandle);
field public static final java.lang.String EXTRA_OBSERVER_ID = "android.app.usage.extra.OBSERVER_ID";
field public static final java.lang.String EXTRA_TIME_LIMIT = "android.app.usage.extra.TIME_LIMIT";
@@ -1007,6 +1049,7 @@ package android.content {
field public static final java.lang.String ACTION_PRE_BOOT_COMPLETED = "android.intent.action.PRE_BOOT_COMPLETED";
field public static final java.lang.String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
field public static final java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
+ field public static final java.lang.String ACTION_REVIEW_APP_PERMISSION_USAGE = "android.intent.action.REVIEW_APP_PERMISSION_USAGE";
field public static final java.lang.String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS";
field public static final java.lang.String ACTION_REVIEW_PERMISSION_USAGE = "android.intent.action.REVIEW_PERMISSION_USAGE";
field public static final java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
@@ -4460,6 +4503,10 @@ package android.provider {
public final class Settings {
field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_SHOW_ADMIN_SUPPORT_DETAILS = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
+ field public static final int USER_SETUP_PERSONALIZATION_COMPLETE = 10; // 0xa
+ field public static final int USER_SETUP_PERSONALIZATION_NOT_STARTED = 0; // 0x0
+ field public static final int USER_SETUP_PERSONALIZATION_PAUSED = 2; // 0x2
+ field public static final int USER_SETUP_PERSONALIZATION_STARTED = 1; // 0x1
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
@@ -4470,10 +4517,13 @@ package android.provider {
field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
+ field public static final java.lang.String DEVICE_DEMO_MODE = "device_demo_mode";
+ field public static final java.lang.String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED = "device_provisioning_mobile_data";
field public static final java.lang.String EUICC_PROVISIONED = "euicc_provisioned";
field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent";
field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis";
field public static final java.lang.String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
+ field public static final java.lang.String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
field public static final java.lang.String SMS_ACCESS_RESTRICTION_ENABLED = "sms_access_restriction_enabled";
field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on";
field public static final java.lang.String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
@@ -4484,16 +4534,23 @@ package android.provider {
public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
+ field public static final java.lang.String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
field public static final java.lang.String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
field public static final java.lang.String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size";
field public static final java.lang.String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size";
field public static final java.lang.String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length";
field public static final java.lang.String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length";
+ field public static final java.lang.String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
+ field public static final java.lang.String DOZE_ALWAYS_ON = "doze_always_on";
field public static final java.lang.String HUSH_GESTURE_USED = "hush_gesture_used";
field public static final java.lang.String INSTANT_APPS_ENABLED = "instant_apps_enabled";
field public static final java.lang.String LAST_SETUP_SHOWN = "last_setup_shown";
+ field public static final java.lang.String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
+ field public static final java.lang.String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications";
field public static final java.lang.String MANUAL_RINGER_TOGGLE_COUNT = "manual_ringer_toggle_count";
+ field public static final java.lang.String USER_SETUP_COMPLETE = "user_setup_complete";
+ field public static final java.lang.String USER_SETUP_PERSONALIZATION_STATE = "user_setup_personalization_state";
field public static final java.lang.String VOLUME_HUSH_GESTURE = "volume_hush_gesture";
}
@@ -5546,6 +5603,8 @@ package android.telephony {
method public boolean isVideoCallingEnabled();
method public deprecated boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle);
method public boolean needsOtaServiceProvisioning();
+ method public boolean rebootRadio();
+ method public boolean resetRadioConfig();
method public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>);
method public void setCarrierDataEnabled(boolean);
method public void setDataActivationState(int);
@@ -6830,6 +6889,14 @@ package android.view {
}
+package android.view.accessibility {
+
+ public final class AccessibilityManager {
+ method public void performAccessibilityShortcut();
+ }
+
+}
+
package android.webkit {
public abstract class CookieManager {
diff --git a/api/test-current.txt b/api/test-current.txt
index 8f08c7108721..604eebd4ffb1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -78,6 +78,8 @@ package android.app {
}
public class AppOpsManager {
+ method public java.util.List<android.app.AppOpsManager.HistoricalPackageOps> getAllHistoricPackagesOps(java.lang.String[], long, long);
+ method public android.app.AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int, java.lang.String, java.lang.String[], long, long);
method public static int getNumOps();
method public static java.lang.String[] getOpStrs();
method public boolean isOperationActive(int, int, java.lang.String);
@@ -135,6 +137,33 @@ package android.app {
field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
}
+ public static final class AppOpsManager.HistoricalOpEntry implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getAccessCount(int);
+ method public long getAccessDuration(int);
+ method public long getBackgroundAccessCount();
+ method public long getBackgroundAccessDuration();
+ method public long getBackgroundRejectCount();
+ method public long getForegroundAccessCount();
+ method public long getForegroundAccessDuration();
+ method public long getForegroundRejectCount();
+ method public java.lang.String getOp();
+ method public long getRejectCount(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOpEntry> CREATOR;
+ }
+
+ public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.app.AppOpsManager.HistoricalOpEntry getEntry(java.lang.String);
+ method public android.app.AppOpsManager.HistoricalOpEntry getEntryAt(int);
+ method public int getEntryCount();
+ method public java.lang.String getPackageName();
+ method public int getUid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR;
+ }
+
public static abstract interface AppOpsManager.OnOpActiveChangedListener {
method public abstract void onOpActiveChanged(int, int, java.lang.String, boolean);
}
@@ -578,12 +607,6 @@ package android.media {
method public static boolean isEncodingLinearPcm(int);
}
- public final class AudioPresentation {
- ctor public AudioPresentation(int, int, java.util.Map<java.lang.String, java.lang.String>, java.lang.String, int, boolean, boolean, boolean);
- method public int getPresentationId();
- method public int getProgramId();
- }
-
public final class BufferingParams implements android.os.Parcelable {
method public int describeContents();
method public int getInitialMarkMs();
@@ -960,6 +983,7 @@ package android.provider {
public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
field public static final java.lang.String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled";
+ field public static final java.lang.String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service";
field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
field public static final java.lang.String AUTOFILL_SERVICE = "autofill_service";
field public static final java.lang.String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count";
@@ -1212,6 +1236,7 @@ package android.telephony {
public class TelephonyManager {
method public int getCarrierIdListVersion();
+ method public boolean isRttSupported();
method public void refreshUiccProfile();
method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff
@@ -1327,6 +1352,14 @@ package android.transition {
}
+package android.util {
+
+ public final class ArraySet<E> implements java.util.Collection java.util.Set {
+ method public E valueAtUnchecked(int);
+ }
+
+}
+
package android.util.proto {
public final class EncodedBuffer {
@@ -1611,6 +1644,17 @@ package android.view {
package android.view.accessibility {
+ public final class AccessibilityManager {
+ method public void addAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, android.os.Handler);
+ method public java.lang.String getAccessibilityShortcutService();
+ method public void performAccessibilityShortcut();
+ method public void removeAccessibilityServicesStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener);
+ }
+
+ public static abstract interface AccessibilityManager.AccessibilityServicesStateChangeListener {
+ method public abstract void onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager);
+ }
+
public class AccessibilityNodeInfo implements android.os.Parcelable {
method public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
method public void writeToParcelNoRecycle(android.os.Parcel, int);
diff --git a/cmds/incident/Android.bp b/cmds/incident/Android.bp
new file mode 100644
index 000000000000..2a5ec5bfacaf
--- /dev/null
+++ b/cmds/incident/Android.bp
@@ -0,0 +1,46 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_binary {
+ name: "incident",
+
+ srcs: [
+ "main.cpp",
+ ":incident_sections",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libcutils",
+ "liblog",
+ "libutils",
+ "libincident",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-missing-field-initializers",
+ "-Wno-unused-variable",
+ "-Wunused-parameter",
+ ],
+}
+
+genrule {
+ name: "incident_sections",
+ tools: ["incident-section-gen"],
+ out: ["incident_sections.cpp"],
+ cmd: "$(location incident-section-gen) incident > $(out)",
+}
diff --git a/cmds/incident/Android.mk b/cmds/incident/Android.mk
deleted file mode 100644
index 8615f9b63e43..000000000000
--- a/cmds/incident/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- main.cpp
-
-LOCAL_MODULE := incident
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- libbinder \
- libcutils \
- liblog \
- libutils \
- libincident
-
-LOCAL_CFLAGS += \
- -Wall -Werror -Wno-missing-field-initializers -Wno-unused-variable -Wunused-parameter
-
-LOCAL_MODULE_CLASS := EXECUTABLES
-gen_src_dir := $(local-generated-sources-dir)
-
-gen := $(gen_src_dir)/incident_sections.cpp
-$(gen): $(HOST_OUT_EXECUTABLES)/incident-section-gen
-$(gen): PRIVATE_CUSTOM_TOOL = \
- $(HOST_OUT_EXECUTABLES)/incident-section-gen incident > $@
-$(gen): $(HOST_OUT_EXECUTABLES)/incident-section-gen
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(gen)
-
-gen_src_dir:=
-gen:=
-
-include $(BUILD_EXECUTABLE)
diff --git a/cmds/incidentd/Android.bp b/cmds/incidentd/Android.bp
new file mode 100644
index 000000000000..1e970f46b01d
--- /dev/null
+++ b/cmds/incidentd/Android.bp
@@ -0,0 +1,117 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// =========
+// incidentd
+// =========
+
+cc_binary {
+ name: "incidentd",
+
+ srcs: [
+ "src/**/*.cpp",
+ ":incidentd_section_list",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-missing-field-initializers",
+ "-Wno-unused-variable",
+ "-Wunused-parameter",
+
+ // Allow implicit fallthrough in IncidentService.cpp:85 until it is fixed.
+ "-Wno-error=implicit-fallthrough",
+
+ // optimize for size (protobuf glop can get big)
+ "-Os",
+ //"-g",
+ //"-O0",
+ ],
+
+ local_include_dirs: ["src"],
+ generated_headers: ["gen-platform-proto-constants"],
+
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libdebuggerd_client",
+ "libdumputils",
+ "libincident",
+ "liblog",
+ "libprotoutil",
+ "libservices",
+ "libutils",
+ ],
+
+ init_rc: ["incidentd.rc"],
+}
+
+// ==============
+// incidentd_test
+// ==============
+
+cc_test {
+ name: "incidentd_test",
+ test_suites: ["device-tests"],
+
+ cflags: [
+ "-Werror",
+ "-Wall",
+ "-Wno-unused-variable",
+ "-Wunused-parameter",
+
+ // Allow implicit fallthrough in IncidentService.cpp:85 until it is fixed.
+ "-Wno-error=implicit-fallthrough",
+ ],
+
+ local_include_dirs: ["src"],
+ generated_headers: ["gen-platform-proto-constants"],
+
+ srcs: [
+ "tests/**/*.cpp",
+ "src/PrivacyBuffer.cpp",
+ "src/FdBuffer.cpp",
+ "src/Privacy.cpp",
+ "src/Reporter.cpp",
+ "src/Section.cpp",
+ "src/Throttler.cpp",
+ "src/incidentd_util.cpp",
+ "src/report_directory.cpp",
+ ],
+
+ data: ["testdata/**/*"],
+
+ static_libs: ["libgmock"],
+
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libdebuggerd_client",
+ "libdumputils",
+ "libincident",
+ "liblog",
+ "libprotobuf-cpp-lite",
+ "libprotoutil",
+ "libservices",
+ "libutils",
+ ],
+}
+
+genrule {
+ name: "incidentd_section_list",
+ tools: ["incident-section-gen"],
+ out: ["section_list.cpp"],
+ cmd: "$(location incident-section-gen) incidentd > $(out)",
+}
diff --git a/cmds/incidentd/Android.mk b/cmds/incidentd/Android.mk
deleted file mode 100644
index eba558653b04..000000000000
--- a/cmds/incidentd/Android.mk
+++ /dev/null
@@ -1,156 +0,0 @@
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-# proto files used in incidentd to generate cppstream proto headers.
-PROTO_FILES:= \
- frameworks/base/core/proto/android/os/backtrace.proto \
- frameworks/base/core/proto/android/os/data.proto \
- frameworks/base/core/proto/android/util/log.proto
-
-# ========= #
-# incidentd #
-# ========= #
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := incidentd
-
-LOCAL_SRC_FILES := $(call all-cpp-files-under, src) \
-
-LOCAL_CFLAGS += \
- -Wall -Werror -Wno-missing-field-initializers -Wno-unused-variable -Wunused-parameter
-
-# Allow implicit fallthrough in IncidentService.cpp:85 until it is fixed.
-LOCAL_CFLAGS += -Wno-error=implicit-fallthrough
-
-ifeq (debug,)
- LOCAL_CFLAGS += \
- -g -O0
-else
- # optimize for size (protobuf glop can get big)
- LOCAL_CFLAGS += \
- -Os
-endif
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- libbinder \
- libdebuggerd_client \
- libdumputils \
- libincident \
- liblog \
- libprotoutil \
- libservices \
- libutils
-
-LOCAL_MODULE_CLASS := EXECUTABLES
-
-gen_src_dir := $(local-generated-sources-dir)
-
-# generate section_list.cpp
-GEN_LIST := $(gen_src_dir)/src/section_list.cpp
-$(GEN_LIST): $(HOST_OUT_EXECUTABLES)/incident-section-gen
-$(GEN_LIST): PRIVATE_CUSTOM_TOOL = \
- $(HOST_OUT_EXECUTABLES)/incident-section-gen incidentd > $@
-$(GEN_LIST): $(HOST_OUT_EXECUTABLES)/incident-section-gen
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN_LIST)
-GEN_LIST:=
-
-# generate cppstream proto, add proto files to PROTO_FILES
-GEN_PROTO := $(gen_src_dir)/proto.timestamp
-$(GEN_PROTO): $(HOST_OUT_EXECUTABLES)/aprotoc $(HOST_OUT_EXECUTABLES)/protoc-gen-cppstream $(PROTO_FILES)
-$(GEN_PROTO): PRIVATE_GEN_SRC_DIR := $(gen_src_dir)
-$(GEN_PROTO): PRIVATE_CUSTOM_TOOL = \
- $(HOST_OUT_EXECUTABLES)/aprotoc --plugin=protoc-gen-cppstream=$(HOST_OUT_EXECUTABLES)/protoc-gen-cppstream \
- --cppstream_out=$(PRIVATE_GEN_SRC_DIR) -Iexternal/protobuf/src -I . \
- $(PROTO_FILES) \
- && touch $@
-$(GEN_PROTO): $(HOST_OUT_EXECUTABLES)/aprotoc
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN_PROTO)
-GEN_PROTO:=
-
-gen_src_dir:=
-
-LOCAL_INIT_RC := incidentd.rc
-
-include $(BUILD_EXECUTABLE)
-
-# ============== #
-# incidentd_test #
-# ============== #
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := incidentd_test
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_CFLAGS := -Werror -Wall -Wno-unused-variable -Wunused-parameter
-
-# Allow implicit fallthrough in IncidentService.cpp:85 until it is fixed.
-LOCAL_CFLAGS += -Wno-error=implicit-fallthrough
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
-
-LOCAL_SRC_FILES := $(call all-cpp-files-under, tests) \
- src/PrivacyBuffer.cpp \
- src/FdBuffer.cpp \
- src/Privacy.cpp \
- src/Reporter.cpp \
- src/Section.cpp \
- src/Throttler.cpp \
- src/incidentd_util.cpp \
- src/report_directory.cpp \
-
-LOCAL_STATIC_LIBRARIES := \
- libgmock \
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- libbinder \
- libdebuggerd_client \
- libdumputils \
- libincident \
- liblog \
- libprotobuf-cpp-lite \
- libprotoutil \
- libservices \
- libutils \
-
-LOCAL_TEST_DATA := $(call find-test-data-in-subdirs, $(LOCAL_PATH), *, testdata)
-
-LOCAL_MODULE_CLASS := NATIVE_TESTS
-gen_src_dir := $(local-generated-sources-dir)
-# generate cppstream proto for testing
-GEN_PROTO := $(gen_src_dir)/test.proto.timestamp
-$(GEN_PROTO): $(HOST_OUT_EXECUTABLES)/aprotoc $(HOST_OUT_EXECUTABLES)/protoc-gen-cppstream $(PROTO_FILES)
-$(GEN_PROTO): PRIVATE_GEN_SRC_DIR := $(gen_src_dir)
-$(GEN_PROTO): PRIVATE_CUSTOM_TOOL = \
- $(HOST_OUT_EXECUTABLES)/aprotoc --plugin=protoc-gen-cppstream=$(HOST_OUT_EXECUTABLES)/protoc-gen-cppstream \
- --cppstream_out=$(PRIVATE_GEN_SRC_DIR) -Iexternal/protobuf/src -I . \
- $(PROTO_FILES) \
- && touch $@
-$(GEN_PROTO): $(HOST_OUT_EXECUTABLES)/aprotoc
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN_PROTO)
-GEN_PROTO:=
-
-gen_src_dir:=
-
-include $(BUILD_NATIVE_TEST)
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index 94203f4feccd..a3cd8a3bb32b 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2015 The Android Open Source Project
+// Copyright (C) 2017 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.
@@ -42,6 +42,279 @@ cc_library_host_shared {
}
+cc_defaults {
+ name: "statsd_defaults",
+ aidl: {
+ include_dirs: ["frameworks/base/core/java"],
+ },
+
+ srcs: [
+ ":statsd_aidl",
+ "src/statsd_config.proto",
+ "src/FieldValue.cpp",
+ "src/hash.cpp",
+ "src/stats_log_util.cpp",
+ "src/anomaly/AlarmMonitor.cpp",
+ "src/anomaly/AlarmTracker.cpp",
+ "src/anomaly/AnomalyTracker.cpp",
+ "src/anomaly/DurationAnomalyTracker.cpp",
+ "src/anomaly/subscriber_util.cpp",
+ "src/condition/CombinationConditionTracker.cpp",
+ "src/condition/condition_util.cpp",
+ "src/condition/SimpleConditionTracker.cpp",
+ "src/condition/ConditionWizard.cpp",
+ "src/condition/StateTracker.cpp",
+ "src/config/ConfigKey.cpp",
+ "src/config/ConfigListener.cpp",
+ "src/config/ConfigManager.cpp",
+ "src/external/Perfetto.cpp",
+ "src/external/Perfprofd.cpp",
+ "src/external/StatsPuller.cpp",
+ "src/external/StatsCompanionServicePuller.cpp",
+ "src/external/SubsystemSleepStatePuller.cpp",
+ "src/external/ResourceHealthManagerPuller.cpp",
+ "src/external/ResourceThermalManagerPuller.cpp",
+ "src/external/StatsPullerManager.cpp",
+ "src/external/puller_util.cpp",
+ "src/logd/LogEvent.cpp",
+ "src/logd/LogListener.cpp",
+ "src/matchers/CombinationLogMatchingTracker.cpp",
+ "src/matchers/EventMatcherWizard.cpp",
+ "src/matchers/matcher_util.cpp",
+ "src/matchers/SimpleLogMatchingTracker.cpp",
+ "src/metrics/MetricProducer.cpp",
+ "src/metrics/EventMetricProducer.cpp",
+ "src/metrics/CountMetricProducer.cpp",
+ "src/metrics/DurationMetricProducer.cpp",
+ "src/metrics/duration_helper/OringDurationTracker.cpp",
+ "src/metrics/duration_helper/MaxDurationTracker.cpp",
+ "src/metrics/ValueMetricProducer.cpp",
+ "src/metrics/GaugeMetricProducer.cpp",
+ "src/metrics/MetricsManager.cpp",
+ "src/metrics/metrics_manager_util.cpp",
+ "src/packages/UidMap.cpp",
+ "src/storage/StorageManager.cpp",
+ "src/StatsLogProcessor.cpp",
+ "src/StatsService.cpp",
+ "src/statscompanion_util.cpp",
+ "src/subscriber/IncidentdReporter.cpp",
+ "src/subscriber/SubscriberReporter.cpp",
+ "src/HashableDimensionKey.cpp",
+ "src/guardrail/StatsdStats.cpp",
+ "src/socket/StatsSocketListener.cpp",
+ "src/shell/ShellSubscriber.cpp",
+ "src/shell/shell_config.proto",
+
+ ":perfprofd_aidl",
+ ],
+
+ local_include_dirs: [
+ "src",
+ ],
+
+ static_libs: [
+ "libhealthhalutils",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libincident",
+ "liblog",
+ "libutils",
+ "libservices",
+ "libprotoutil",
+ "libstatslog",
+ "libhardware",
+ "libhardware_legacy",
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "android.frameworks.stats@1.0",
+ "android.hardware.health@2.0",
+ "android.hardware.power@1.0",
+ "android.hardware.power@1.1",
+ "android.hardware.thermal@1.0",
+ "libpackagelistparser",
+ "libsysutils",
+ "libcutils",
+ ],
+}
+
+// =========
+// statsd
+// =========
+
+cc_binary {
+ name: "statsd",
+ defaults: ["statsd_defaults"],
+
+ srcs: ["src/main.cpp"],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ "-Wno-unused-parameter",
+ // optimize for size (protobuf glop can get big)
+ "-Os",
+ // "-g",
+ // "-O0",
+ ],
+
+ product_variables: {
+ eng: {
+ // Enable sanitizer ONLY on eng builds
+ //sanitize: {
+ // address: true,
+ //},
+ },
+ debuggable: {
+ // Add a flag to enable stats log printing from statsd on debug builds.
+ cflags: ["-DVERY_VERBOSE_PRINTING"],
+ },
+ },
+
+ proto: {
+ type: "lite",
+ },
+
+ shared_libs: ["libgtest_prod"],
+
+ vintf_fragments: ["android.frameworks.stats@1.0-service.xml"],
+
+ init_rc: ["statsd.rc"],
+}
+
+// ==============
+// statsd_test
+// ==============
+
+cc_test {
+ name: "statsd_test",
+ defaults: ["statsd_defaults"],
+ test_suites: ["device-tests"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-missing-field-initializers",
+ "-Wno-unused-variable",
+ "-Wno-unused-function",
+ "-Wno-unused-parameter",
+ ],
+
+ srcs: [
+ "src/atom_field_options.proto",
+ "src/atoms.proto",
+ "src/stats_log.proto",
+ "src/shell/shell_data.proto",
+ "tests/AlarmMonitor_test.cpp",
+ "tests/anomaly/AlarmTracker_test.cpp",
+ "tests/anomaly/AnomalyTracker_test.cpp",
+ "tests/ConfigManager_test.cpp",
+ "tests/external/puller_util_test.cpp",
+ "tests/indexed_priority_queue_test.cpp",
+ "tests/LogEntryMatcher_test.cpp",
+ "tests/LogEvent_test.cpp",
+ "tests/MetricsManager_test.cpp",
+ "tests/StatsLogProcessor_test.cpp",
+ "tests/StatsService_test.cpp",
+ "tests/UidMap_test.cpp",
+ "tests/FieldValue_test.cpp",
+ "tests/condition/CombinationConditionTracker_test.cpp",
+ "tests/condition/SimpleConditionTracker_test.cpp",
+ "tests/condition/StateTracker_test.cpp",
+ "tests/metrics/OringDurationTracker_test.cpp",
+ "tests/metrics/MaxDurationTracker_test.cpp",
+ "tests/metrics/CountMetricProducer_test.cpp",
+ "tests/metrics/DurationMetricProducer_test.cpp",
+ "tests/metrics/EventMetricProducer_test.cpp",
+ "tests/metrics/ValueMetricProducer_test.cpp",
+ "tests/metrics/GaugeMetricProducer_test.cpp",
+ "tests/guardrail/StatsdStats_test.cpp",
+ "tests/metrics/metrics_test_helper.cpp",
+ "tests/statsd_test_util.cpp",
+ "tests/e2e/WakelockDuration_e2e_test.cpp",
+ "tests/e2e/MetricActivation_e2e_test.cpp",
+ "tests/e2e/MetricConditionLink_e2e_test.cpp",
+ "tests/e2e/Alarm_e2e_test.cpp",
+ "tests/e2e/Attribution_e2e_test.cpp",
+ "tests/e2e/GaugeMetric_e2e_push_test.cpp",
+ "tests/e2e/GaugeMetric_e2e_pull_test.cpp",
+ "tests/e2e/ValueMetric_pull_e2e_test.cpp",
+ "tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp",
+ "tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp",
+ "tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp",
+ "tests/e2e/Anomaly_count_e2e_test.cpp",
+ "tests/e2e/Anomaly_duration_sum_e2e_test.cpp",
+ "tests/e2e/ConfigTtl_e2e_test.cpp",
+ "tests/e2e/PartialBucket_e2e_test.cpp",
+ "tests/shell/ShellSubscriber_test.cpp",
+ ],
+
+ static_libs: [
+ "libgmock",
+ "libplatformprotos",
+ ],
+
+ proto: {
+ type: "full",
+ include_dirs: ["external/protobuf/src"],
+ },
+
+ shared_libs: ["libprotobuf-cpp-full"],
+
+}
+
+//#############################
+// statsd micro benchmark
+//#############################
+
+cc_benchmark {
+ name: "statsd_benchmark",
+ defaults: ["statsd_defaults"],
+
+ srcs: [
+ "src/atom_field_options.proto",
+ "src/atoms.proto",
+ "src/stats_log.proto",
+ "benchmark/main.cpp",
+ "benchmark/hello_world_benchmark.cpp",
+ "benchmark/log_event_benchmark.cpp",
+ "benchmark/stats_write_benchmark.cpp",
+ "benchmark/filter_value_benchmark.cpp",
+ "benchmark/get_dimensions_for_condition_benchmark.cpp",
+ "benchmark/metric_util.cpp",
+ "benchmark/duration_metric_benchmark.cpp",
+ ],
+
+ proto: {
+ type: "full",
+ include_dirs: ["external/protobuf/src"],
+ },
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-unused-parameter",
+ "-Wno-unused-variable",
+ "-Wno-unused-function",
+
+ // Bug: http://b/29823425 Disable -Wvarargs for Clang update to r271374
+ "-Wno-varargs"
+ ],
+
+ static_libs: [
+ "libplatformprotos",
+ ],
+
+ shared_libs: [
+ "libgtest_prod",
+ "libstatslog",
+ "libprotobuf-cpp-full",
+ ],
+}
// ==== java proto device library (for test only) ==============================
java_library {
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
deleted file mode 100644
index 5818f5d550c3..000000000000
--- a/cmds/statsd/Android.mk
+++ /dev/null
@@ -1,319 +0,0 @@
-# Copyright (C) 2017 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-statsd_common_src := \
- ../../core/java/android/os/IStatsCompanionService.aidl \
- ../../core/java/android/os/IStatsManager.aidl \
- src/statsd_config.proto \
- src/FieldValue.cpp \
- src/hash.cpp \
- src/stats_log_util.cpp \
- src/anomaly/AlarmMonitor.cpp \
- src/anomaly/AlarmTracker.cpp \
- src/anomaly/AnomalyTracker.cpp \
- src/anomaly/DurationAnomalyTracker.cpp \
- src/anomaly/subscriber_util.cpp \
- src/condition/CombinationConditionTracker.cpp \
- src/condition/condition_util.cpp \
- src/condition/SimpleConditionTracker.cpp \
- src/condition/ConditionWizard.cpp \
- src/condition/StateTracker.cpp \
- src/config/ConfigKey.cpp \
- src/config/ConfigListener.cpp \
- src/config/ConfigManager.cpp \
- src/external/Perfetto.cpp \
- src/external/Perfprofd.cpp \
- src/external/StatsPuller.cpp \
- src/external/StatsCompanionServicePuller.cpp \
- src/external/SubsystemSleepStatePuller.cpp \
- src/external/ResourceHealthManagerPuller.cpp \
- src/external/ResourceThermalManagerPuller.cpp \
- src/external/StatsPullerManager.cpp \
- src/external/puller_util.cpp \
- src/logd/LogEvent.cpp \
- src/logd/LogListener.cpp \
- src/matchers/CombinationLogMatchingTracker.cpp \
- src/matchers/EventMatcherWizard.cpp \
- src/matchers/matcher_util.cpp \
- src/matchers/SimpleLogMatchingTracker.cpp \
- src/metrics/MetricProducer.cpp \
- src/metrics/EventMetricProducer.cpp \
- src/metrics/CountMetricProducer.cpp \
- src/metrics/DurationMetricProducer.cpp \
- src/metrics/duration_helper/OringDurationTracker.cpp \
- src/metrics/duration_helper/MaxDurationTracker.cpp \
- src/metrics/ValueMetricProducer.cpp \
- src/metrics/GaugeMetricProducer.cpp \
- src/metrics/MetricsManager.cpp \
- src/metrics/metrics_manager_util.cpp \
- src/packages/UidMap.cpp \
- src/storage/StorageManager.cpp \
- src/StatsLogProcessor.cpp \
- src/StatsService.cpp \
- src/statscompanion_util.cpp \
- src/subscriber/IncidentdReporter.cpp \
- src/subscriber/SubscriberReporter.cpp \
- src/HashableDimensionKey.cpp \
- src/guardrail/StatsdStats.cpp \
- src/socket/StatsSocketListener.cpp \
- src/shell/ShellSubscriber.cpp \
- src/shell/shell_config.proto
-
-# TODO(b/110563449): Once statsd is using a blueprint file, migrate to the proper filegroups.
-statsd_common_src += \
- ../../../../system/extras/perfprofd/binder_interface/aidl/android/os/IPerfProfd.aidl
-
-statsd_common_c_includes := \
- $(LOCAL_PATH)/src \
- $(LOCAL_PATH)/../../libs/services/include
-
-statsd_common_aidl_includes := \
- $(LOCAL_PATH)/../../core/java
-
-statsd_common_static_libraries := \
- libhealthhalutils
-
-statsd_common_shared_libraries := \
- libbase \
- libbinder \
- libincident \
- liblog \
- libutils \
- libservices \
- libprotoutil \
- libstatslog \
- libhardware \
- libhardware_legacy \
- libhidlbase \
- libhidltransport \
- libhwbinder \
- android.frameworks.stats@1.0 \
- android.hardware.health@2.0 \
- android.hardware.power@1.0 \
- android.hardware.power@1.1 \
- android.hardware.thermal@1.0 \
- libpackagelistparser \
- libsysutils \
- libcutils
-
-# =========
-# statsd
-# =========
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := statsd
-
-LOCAL_SRC_FILES := \
- $(statsd_common_src) \
- src/main.cpp
-
-LOCAL_CFLAGS += \
- -Wall \
- -Wextra \
- -Werror \
- -Wno-unused-parameter
-
-ifeq (debug,)
- LOCAL_CFLAGS += \
- -g -O0
-else
- # optimize for size (protobuf glop can get big)
- LOCAL_CFLAGS += \
- -Os
-endif
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite
-
-LOCAL_AIDL_INCLUDES := $(statsd_common_aidl_includes)
-LOCAL_C_INCLUDES += $(statsd_common_c_includes)
-
-LOCAL_STATIC_LIBRARIES := $(statsd_common_static_libraries)
-
-LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
- libgtest_prod
-
-LOCAL_MODULE_CLASS := EXECUTABLES
-
-# Enable sanitizer ONLY on eng builds.
-#ifeq ($(TARGET_BUILD_VARIANT),eng)
-# LOCAL_CLANG := true
-# LOCAL_SANITIZE := address
-#endif
-
-# Add a flag to enable stats log printing from statsd on debug builds.
-ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
- LOCAL_CFLAGS += \
- -DVERY_VERBOSE_PRINTING
-endif
-
-LOCAL_INIT_RC := statsd.rc
-
-include $(BUILD_EXECUTABLE)
-
-
-# ==============
-# statsd_test
-# ==============
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := statsd_test
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_AIDL_INCLUDES := $(statsd_common_aidl_includes)
-LOCAL_C_INCLUDES += $(statsd_common_c_includes)
-
-LOCAL_CFLAGS += \
- -Wall \
- -Werror \
- -Wno-missing-field-initializers \
- -Wno-unused-variable \
- -Wno-unused-function \
- -Wno-unused-parameter
-
-LOCAL_SRC_FILES := \
- $(statsd_common_src) \
- src/atom_field_options.proto \
- src/atoms.proto \
- src/stats_log.proto \
- src/shell/shell_data.proto \
- tests/AlarmMonitor_test.cpp \
- tests/anomaly/AlarmTracker_test.cpp \
- tests/anomaly/AnomalyTracker_test.cpp \
- tests/ConfigManager_test.cpp \
- tests/external/puller_util_test.cpp \
- tests/indexed_priority_queue_test.cpp \
- tests/LogEntryMatcher_test.cpp \
- tests/LogEvent_test.cpp \
- tests/MetricsManager_test.cpp \
- tests/StatsLogProcessor_test.cpp \
- tests/StatsService_test.cpp \
- tests/UidMap_test.cpp \
- tests/FieldValue_test.cpp \
- tests/condition/CombinationConditionTracker_test.cpp \
- tests/condition/SimpleConditionTracker_test.cpp \
- tests/condition/StateTracker_test.cpp \
- tests/metrics/OringDurationTracker_test.cpp \
- tests/metrics/MaxDurationTracker_test.cpp \
- tests/metrics/CountMetricProducer_test.cpp \
- tests/metrics/DurationMetricProducer_test.cpp \
- tests/metrics/EventMetricProducer_test.cpp \
- tests/metrics/ValueMetricProducer_test.cpp \
- tests/metrics/GaugeMetricProducer_test.cpp \
- tests/guardrail/StatsdStats_test.cpp \
- tests/metrics/metrics_test_helper.cpp \
- tests/statsd_test_util.cpp \
- tests/e2e/WakelockDuration_e2e_test.cpp \
- tests/e2e/MetricActivation_e2e_test.cpp \
- tests/e2e/MetricConditionLink_e2e_test.cpp \
- tests/e2e/Alarm_e2e_test.cpp \
- tests/e2e/Attribution_e2e_test.cpp \
- tests/e2e/GaugeMetric_e2e_push_test.cpp \
- tests/e2e/GaugeMetric_e2e_pull_test.cpp \
- tests/e2e/ValueMetric_pull_e2e_test.cpp \
- tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp \
- tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp \
- tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp \
- tests/e2e/Anomaly_count_e2e_test.cpp \
- tests/e2e/Anomaly_duration_sum_e2e_test.cpp \
- tests/e2e/ConfigTtl_e2e_test.cpp \
- tests/e2e/PartialBucket_e2e_test.cpp \
- tests/shell/ShellSubscriber_test.cpp
-
-LOCAL_STATIC_LIBRARIES := \
- $(statsd_common_static_libraries) \
- libgmock \
- libplatformprotos
-
-LOCAL_PROTOC_OPTIMIZE_TYPE := full
-
-LOCAL_PROTOC_FLAGS := \
- -Iexternal/protobuf/src
-
-LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
- libprotobuf-cpp-full
-
-include $(BUILD_NATIVE_TEST)
-
-##############################
-# statsd micro benchmark
-##############################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := statsd_benchmark
-
-LOCAL_SRC_FILES := $(statsd_common_src) \
- src/atom_field_options.proto \
- src/atoms.proto \
- src/stats_log.proto \
- benchmark/main.cpp \
- benchmark/hello_world_benchmark.cpp \
- benchmark/log_event_benchmark.cpp \
- benchmark/stats_write_benchmark.cpp \
- benchmark/filter_value_benchmark.cpp \
- benchmark/get_dimensions_for_condition_benchmark.cpp \
- benchmark/metric_util.cpp \
- benchmark/duration_metric_benchmark.cpp
-
-LOCAL_STATIC_LIBRARIES := \
- $(statsd_common_static_libraries)
-
-LOCAL_PROTOC_OPTIMIZE_TYPE := full
-
-LOCAL_PROTOC_FLAGS := \
- -Iexternal/protobuf/src
-
-LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
- libprotobuf-cpp-full
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- platformprotoslite
-
-LOCAL_C_INCLUDES := $(statsd_common_c_includes)
-
-LOCAL_CFLAGS := -Wall \
- -Werror \
- -Wno-unused-parameter \
- -Wno-unused-variable \
- -Wno-unused-function \
-
-# Bug: http://b/29823425 Disable -Wvarargs for Clang update to r271374
-LOCAL_CFLAGS += -Wno-varargs
-
-LOCAL_AIDL_INCLUDES := $(statsd_common_aidl_includes)
-
-LOCAL_STATIC_LIBRARIES := \
- $(statsd_common_static_libraries) \
- libplatformprotos
-
-LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
- libgtest_prod \
- libstatslog
-
-LOCAL_MODULE_TAGS := eng tests
-
-include $(BUILD_NATIVE_BENCHMARK)
-
-
-statsd_common_src:=
-statsd_common_aidl_includes:=
-statsd_common_c_includes:=
-statsd_common_static_libraries:=
-statsd_common_shared_libraries:=
-
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/cmds/statsd/android.frameworks.stats@1.0-service.xml b/cmds/statsd/android.frameworks.stats@1.0-service.xml
new file mode 100644
index 000000000000..bb02f66a28b1
--- /dev/null
+++ b/cmds/statsd/android.frameworks.stats@1.0-service.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="framework">
+ <hal>
+ <name>android.frameworks.stats</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IStats</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 51d05bbb86d1..5620184d5038 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -2399,6 +2399,10 @@ message ProcessMemoryState {
// Peak RSS usage of the process. Value is read from the VmHWM field in /proc/PID/status or
// from memory.max_usage_in_bytes under /dev/memcg if the device uses per-app memory cgroups.
optional int64 rss_high_watermark_in_bytes = 9;
+
+ // Elapsed real time when the process started.
+ // Value is read from /proc/PID/stat, field 22. 0 if read from per-app memory cgroups.
+ optional int64 start_time_nanos = 10;
}
/*
@@ -2540,10 +2544,17 @@ message Temperature {
* Binder stats will be reset every time the data is pulled. It means it can only be pulled by one
* config on the device.
*
- * Next tag: 14
+ * Next tag: 15
*/
message BinderCalls {
+ // UID of the process responsible for the binder transaction. It will be set if the process
+ // executing the binder transaction attribute the transaction to another uid using
+ // Binder.setThreadWorkSource().
+ //
+ // If not set, the value will be -1.
optional int32 uid = 1 [(is_uid) = true];
+ // UID of the process executing the binder transaction.
+ optional int32 direct_caller_uid = 14;
// Fully qualified class name of the API call.
//
// This is a system server class name.
diff --git a/cmds/statsd/src/external/StatsPuller.cpp b/cmds/statsd/src/external/StatsPuller.cpp
index 436a8801896f..e3f251a5263d 100644
--- a/cmds/statsd/src/external/StatsPuller.cpp
+++ b/cmds/statsd/src/external/StatsPuller.cpp
@@ -46,6 +46,7 @@ bool StatsPuller::Pull(const int64_t elapsedTimeNs, std::vector<std::shared_ptr<
if (elapsedTimeNs - mLastPullTimeNs < mCoolDownNs) {
(*data) = mCachedData;
StatsdStats::getInstance().notePullFromCache(mTagId);
+ StatsdStats::getInstance().notePullDelay(mTagId, getElapsedRealtimeNs() - elapsedTimeNs);
return true;
}
if (mMinPullIntervalNs > elapsedTimeNs - mLastPullTimeNs) {
@@ -55,7 +56,9 @@ bool StatsPuller::Pull(const int64_t elapsedTimeNs, std::vector<std::shared_ptr<
}
mCachedData.clear();
mLastPullTimeNs = elapsedTimeNs;
+ int64_t pullStartTimeNs = getElapsedRealtimeNs();
bool ret = PullInternal(&mCachedData);
+ StatsdStats::getInstance().notePullTime(mTagId, getElapsedRealtimeNs() - pullStartTimeNs);
for (const shared_ptr<LogEvent>& data : mCachedData) {
data->setElapsedTimestampNs(elapsedTimeNs);
data->setLogdWallClockTimestampNs(wallClockTimeNs);
@@ -64,6 +67,7 @@ bool StatsPuller::Pull(const int64_t elapsedTimeNs, std::vector<std::shared_ptr<
mergeIsolatedUidsToHostUid(mCachedData, mUidMap, mTagId);
(*data) = mCachedData;
}
+ StatsdStats::getInstance().notePullDelay(mTagId, getElapsedRealtimeNs() - elapsedTimeNs);
return ret;
}
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index c9b361d8cc82..9633980420ef 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -167,13 +167,13 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
// process_memory_state
{android::util::PROCESS_MEMORY_STATE,
{{4, 5, 6, 7, 8, 9},
- {2, 3},
+ {2, 3, 10},
1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}},
// native_process_memory_state
{android::util::NATIVE_PROCESS_MEMORY_STATE,
- {{3, 4, 5, 6, 7},
- {2},
+ {{3, 4, 5, 6},
+ {2, 7},
1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::NATIVE_PROCESS_MEMORY_STATE)}},
// temperature
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 023d835a8429..d2919c51a65e 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -335,7 +335,8 @@ void StatsdStats::noteRegisteredPeriodicAlarmChanged() {
void StatsdStats::updateMinPullIntervalSec(int pullAtomId, long intervalSec) {
lock_guard<std::mutex> lock(mLock);
- mPulledAtomStats[pullAtomId].minPullIntervalSec = intervalSec;
+ mPulledAtomStats[pullAtomId].minPullIntervalSec =
+ std::min(mPulledAtomStats[pullAtomId].minPullIntervalSec, intervalSec);
}
void StatsdStats::notePull(int pullAtomId) {
@@ -348,6 +349,24 @@ void StatsdStats::notePullFromCache(int pullAtomId) {
mPulledAtomStats[pullAtomId].totalPullFromCache++;
}
+void StatsdStats::notePullTime(int pullAtomId, int64_t pullTimeNs) {
+ lock_guard<std::mutex> lock(mLock);
+ auto& pullStats = mPulledAtomStats[pullAtomId];
+ pullStats.maxPullTimeNs = std::max(pullStats.maxPullTimeNs, pullTimeNs);
+ pullStats.avgPullTimeNs = (pullStats.avgPullTimeNs * pullStats.numPullTime + pullTimeNs) /
+ (pullStats.numPullTime + 1);
+ pullStats.numPullTime += 1;
+}
+
+void StatsdStats::notePullDelay(int pullAtomId, int64_t pullDelayNs) {
+ lock_guard<std::mutex> lock(mLock);
+ auto& pullStats = mPulledAtomStats[pullAtomId];
+ pullStats.maxPullDelayNs = std::max(pullStats.maxPullDelayNs, pullDelayNs);
+ pullStats.avgPullDelayNs = (pullStats.avgPullDelayNs * pullStats.numPullDelay + pullDelayNs) /
+ (pullStats.numPullDelay + 1);
+ pullStats.numPullDelay += 1;
+}
+
void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) {
lock_guard<std::mutex> lock(mLock);
@@ -394,6 +413,16 @@ void StatsdStats::resetInternalLocked() {
config.second->metric_dimension_in_condition_stats.clear();
config.second->alert_stats.clear();
}
+ for (auto& pullStats : mPulledAtomStats) {
+ pullStats.second.totalPull = 0;
+ pullStats.second.totalPullFromCache = 0;
+ pullStats.second.avgPullTimeNs = 0;
+ pullStats.second.maxPullTimeNs = 0;
+ pullStats.second.numPullTime = 0;
+ pullStats.second.avgPullDelayNs = 0;
+ pullStats.second.maxPullDelayNs = 0;
+ pullStats.second.numPullDelay = 0;
+ }
}
string buildTimeString(int64_t timeSec) {
@@ -498,8 +527,14 @@ void StatsdStats::dumpStats(int out) const {
dprintf(out, "********Pulled Atom stats***********\n");
for (const auto& pair : mPulledAtomStats) {
- dprintf(out, "Atom %d->%ld, %ld, %ld\n", (int)pair.first, (long)pair.second.totalPull,
- (long)pair.second.totalPullFromCache, (long)pair.second.minPullIntervalSec);
+ dprintf(out,
+ "Atom %d->(total pull)%ld, (pull from cache)%ld, (min pull interval)%ld, (average "
+ "pull time nanos)%lld, (max pull time nanos)%lld, (average pull delay nanos)%lld, "
+ "(max pull delay nanos)%lld\n",
+ (int)pair.first, (long)pair.second.totalPull, (long)pair.second.totalPullFromCache,
+ (long)pair.second.minPullIntervalSec, (long long)pair.second.avgPullTimeNs,
+ (long long)pair.second.maxPullTimeNs, (long long)pair.second.avgPullDelayNs,
+ (long long)pair.second.maxPullDelayNs);
}
if (mAnomalyAlarmRegisteredStats > 0) {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 7d95b54cc574..777d8652d2b6 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -263,16 +263,34 @@ public:
void setUidMapChanges(int changes);
void setCurrentUidMapMemory(int bytes);
- // Update minimum interval between pulls for an pulled atom
+ /*
+ * Updates minimum interval between pulls for an pulled atom.
+ */
void updateMinPullIntervalSec(int pullAtomId, long intervalSec);
- // Notify pull request for an atom
+ /*
+ * Notes an atom is pulled.
+ */
void notePull(int pullAtomId);
- // Notify pull request for an atom served from cached data
+ /*
+ * Notes an atom is served from puller cache.
+ */
void notePullFromCache(int pullAtomId);
/*
+ * Records time for actual pulling, not including those served from cache and not including
+ * statsd processing delays.
+ */
+ void notePullTime(int pullAtomId, int64_t pullTimeNs);
+
+ /*
+ * Records pull delay for a pulled atom, including those served from cache and including statsd
+ * processing delays.
+ */
+ void notePullDelay(int pullAtomId, int64_t pullDelayNs);
+
+ /*
* Records when system server restarts.
*/
void noteSystemServerRestart(int32_t timeSec);
@@ -302,9 +320,15 @@ public:
void dumpStats(int outFd) const;
typedef struct {
- long totalPull;
- long totalPullFromCache;
- long minPullIntervalSec;
+ long totalPull = 0;
+ long totalPullFromCache = 0;
+ long minPullIntervalSec = LONG_MAX;
+ int64_t avgPullTimeNs = 0;
+ int64_t maxPullTimeNs = 0;
+ long numPullTime = 0;
+ int64_t avgPullDelayNs = 0;
+ int64_t maxPullDelayNs = 0;
+ long numPullDelay = 0;
} PulledAtomStats;
private:
@@ -368,6 +392,7 @@ private:
FRIEND_TEST(StatsdStatsTest, TestTimestampThreshold);
FRIEND_TEST(StatsdStatsTest, TestAnomalyMonitor);
FRIEND_TEST(StatsdStatsTest, TestSystemServerCrash);
+ FRIEND_TEST(StatsdStatsTest, TestPullAtomStats);
};
} // namespace statsd
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index e8f74d3008e4..8bfa36059e9a 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -370,6 +370,10 @@ message StatsdStatsReport {
optional int64 total_pull = 2;
optional int64 total_pull_from_cache = 3;
optional int64 min_pull_interval_sec = 4;
+ optional int64 average_pull_time_nanos = 5;
+ optional int64 max_pull_time_nanos = 6;
+ optional int64 average_pull_delay_nanos = 7;
+ optional int64 max_pull_delay_nanos = 8;
}
repeated PulledAtomStats pulled_atom_stats = 10;
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 2498d9f32d06..44fa72e77a0d 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -59,6 +59,10 @@ const int FIELD_ID_PULL_ATOM_ID = 1;
const int FIELD_ID_TOTAL_PULL = 2;
const int FIELD_ID_TOTAL_PULL_FROM_CACHE = 3;
const int FIELD_ID_MIN_PULL_INTERVAL_SEC = 4;
+const int FIELD_ID_AVERAGE_PULL_TIME_NANOS = 5;
+const int FIELD_ID_MAX_PULL_TIME_NANOS = 6;
+const int FIELD_ID_AVERAGE_PULL_DELAY_NANOS = 7;
+const int FIELD_ID_MAX_PULL_DELAY_NANOS = 8;
namespace {
@@ -434,6 +438,14 @@ void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>
(long long)pair.second.totalPullFromCache);
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_MIN_PULL_INTERVAL_SEC,
(long long)pair.second.minPullIntervalSec);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_AVERAGE_PULL_TIME_NANOS,
+ (long long)pair.second.avgPullTimeNs);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_MAX_PULL_TIME_NANOS,
+ (long long)pair.second.maxPullTimeNs);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_AVERAGE_PULL_DELAY_NANOS,
+ (long long)pair.second.avgPullDelayNs);
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_MAX_PULL_DELAY_NANOS,
+ (long long)pair.second.maxPullDelayNs);
protoOutput->end(token);
}
diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
index f37f908532ca..6069516e9666 100644
--- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -244,6 +244,39 @@ TEST(StatsdStatsTest, TestAtomLog) {
EXPECT_TRUE(sensorAtomGood);
}
+TEST(StatsdStatsTest, TestPullAtomStats) {
+ StatsdStats stats;
+
+ stats.updateMinPullIntervalSec(android::util::DISK_SPACE, 3333L);
+ stats.updateMinPullIntervalSec(android::util::DISK_SPACE, 2222L);
+ stats.updateMinPullIntervalSec(android::util::DISK_SPACE, 4444L);
+
+ stats.notePull(android::util::DISK_SPACE);
+ stats.notePullTime(android::util::DISK_SPACE, 1111L);
+ stats.notePullDelay(android::util::DISK_SPACE, 1111L);
+ stats.notePull(android::util::DISK_SPACE);
+ stats.notePullTime(android::util::DISK_SPACE, 3333L);
+ stats.notePullDelay(android::util::DISK_SPACE, 3335L);
+ stats.notePull(android::util::DISK_SPACE);
+ stats.notePullFromCache(android::util::DISK_SPACE);
+
+ vector<uint8_t> output;
+ stats.dumpStats(&output, false);
+ StatsdStatsReport report;
+ bool good = report.ParseFromArray(&output[0], output.size());
+ EXPECT_TRUE(good);
+
+ EXPECT_EQ(1, report.pulled_atom_stats_size());
+
+ EXPECT_EQ(android::util::DISK_SPACE, report.pulled_atom_stats(0).atom_id());
+ EXPECT_EQ(3, report.pulled_atom_stats(0).total_pull());
+ EXPECT_EQ(1, report.pulled_atom_stats(0).total_pull_from_cache());
+ EXPECT_EQ(2222L, report.pulled_atom_stats(0).min_pull_interval_sec());
+ EXPECT_EQ(2222L, report.pulled_atom_stats(0).average_pull_time_nanos());
+ EXPECT_EQ(3333L, report.pulled_atom_stats(0).max_pull_time_nanos());
+ EXPECT_EQ(2223L, report.pulled_atom_stats(0).average_pull_delay_nanos());
+ EXPECT_EQ(3335L, report.pulled_atom_stats(0).max_pull_delay_nanos());
+}
TEST(StatsdStatsTest, TestAnomalyMonitor) {
StatsdStats stats;
diff --git a/cmds/statsd/tools/Android.mk b/cmds/statsd/tools/Android.mk
deleted file mode 100644
index 7253c9637026..000000000000
--- a/cmds/statsd/tools/Android.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (C) 2017 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.
-#
-#
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-#Include the sub-makefiles
-include $(call all-makefiles-under,$(LOCAL_PATH)) \ No newline at end of file
diff --git a/cmds/statsd/tools/dogfood/Android.bp b/cmds/statsd/tools/dogfood/Android.bp
new file mode 100644
index 000000000000..bb494a6025af
--- /dev/null
+++ b/cmds/statsd/tools/dogfood/Android.bp
@@ -0,0 +1,37 @@
+// Copyright (C) 2017 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.
+//
+//
+
+android_app {
+ name: "StatsdDogfood",
+ platform_apis: true,
+
+ srcs: ["src/**/*.java"],
+
+ resource_dirs: ["res"],
+ static_libs: [
+ "platformprotoslite",
+ "statsdprotolite",
+ ],
+
+ privileged: true,
+ dex_preopt: {
+ enabled: false,
+ },
+ certificate: "platform",
+ optimize: {
+ enabled: false,
+ },
+}
diff --git a/cmds/statsd/tools/dogfood/Android.mk b/cmds/statsd/tools/dogfood/Android.mk
deleted file mode 100644
index baf235bb91be..000000000000
--- a/cmds/statsd/tools/dogfood/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2017 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.
-#
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := StatsdDogfood
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite \
- statsdprotolite
-
-LOCAL_PRIVILEGED_MODULE := true
-LOCAL_DEX_PREOPT := false
-LOCAL_CERTIFICATE := platform
-LOCAL_PROGUARD_ENABLED := disabled
-
-include $(BUILD_PACKAGE)
diff --git a/cmds/statsd/tools/loadtest/Android.bp b/cmds/statsd/tools/loadtest/Android.bp
new file mode 100644
index 000000000000..bf87fc51dce1
--- /dev/null
+++ b/cmds/statsd/tools/loadtest/Android.bp
@@ -0,0 +1,37 @@
+// Copyright (C) 2017 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.
+//
+//
+
+android_app {
+ name: "StatsdLoadtest",
+ platform_apis: true,
+
+ srcs: ["src/**/*.java"],
+
+ resource_dirs: ["res"],
+ static_libs: [
+ "platformprotoslite",
+ "statsdprotolite",
+ ],
+
+ certificate: "platform",
+ privileged: true,
+ dex_preopt: {
+ enabled: false,
+ },
+ optimize: {
+ enabled: false,
+ },
+}
diff --git a/cmds/statsd/tools/loadtest/Android.mk b/cmds/statsd/tools/loadtest/Android.mk
deleted file mode 100644
index 219cd9525bbd..000000000000
--- a/cmds/statsd/tools/loadtest/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2017 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.
-#
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := StatsdLoadtest
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite \
- statsdprotolite
-
-LOCAL_CERTIFICATE := platform
-LOCAL_PRIVILEGED_MODULE := true
-LOCAL_DEX_PREOPT := false
-LOCAL_PROGUARD_ENABLED := disabled
-
-include $(BUILD_PACKAGE)
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 2d5103875bd1..ff436f18ed3f 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -2184,6 +2184,56 @@ HPLandroid/graphics/drawable/VectorDrawable$VPath$1;->set(Ljava/lang/Object;Ljav
HPLandroid/graphics/drawable/VectorDrawable$VPath;->setPathData(Landroid/util/PathParser$PathData;)V
HPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->getProperty(Ljava/lang/String;)Landroid/util/Property;
HPLandroid/graphics/drawable/VectorDrawable;->getOpticalInsets()Landroid/graphics/Insets;
+HPLandroid/graphics/text/LineBreaker;-><init>(III[ILandroid/graphics/text/LineBreaker$1;)V
+HPLandroid/graphics/text/LineBreaker;->computeLineBreaks(Landroid/graphics/text/MeasuredText;Landroid/graphics/text/LineBreaker$ParagraphConstraints;I)Landroid/graphics/text/LineBreaker$Result;
+HPLandroid/graphics/text/LineBreaker;->access$100()J
+HPLandroid/graphics/text/LineBreaker;->access$200(J)I
+HPLandroid/graphics/text/LineBreaker;->access$300(JI)I
+HPLandroid/graphics/text/LineBreaker;->access$400(JI)F
+HPLandroid/graphics/text/LineBreaker;->access$500(JI)F
+HPLandroid/graphics/text/LineBreaker;->access$600(JI)F
+HPLandroid/graphics/text/LineBreaker;->access$700(JI)I
+HPLandroid/graphics/text/LineBreaker$Builder;-><init>()V
+HPLandroid/graphics/text/LineBreaker$Builder;->setBreakStrategy(I)Landroid/graphics/text/LineBreaker$Builder;
+HPLandroid/graphics/text/LineBreaker$Builder;->setHyphenationFrequency(I)Landroid/graphics/text/LineBreaker$Builder;
+HPLandroid/graphics/text/LineBreaker$Builder;->setJustified(I)Landroid/graphics/text/LineBreaker$Builder;
+HPLandroid/graphics/text/LineBreaker$Builder;->setIndents([I)Landroid/graphics/text/LineBreaker$Builder;
+HPLandroid/graphics/text/LineBreaker$Builder;->build()Landroid/graphics/text/LineBreaker;
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;-><init>()V
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setWidth(F)V
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setIndent(FI)V
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->setTabStops([II)V
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->getWidth()F
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->getFirstWidth()F
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->getFirstWidthLineCount()I
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->getTabStops()[I
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->getDefaultTabStop()I
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->access$800(Landroid/graphics/text/LineBreaker$ParagraphConstraints;)F
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->access$900(Landroid/graphics/text/LineBreaker$ParagraphConstraints;)I
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->access$1000(Landroid/graphics/text/LineBreaker$ParagraphConstraints;)F
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->access$1100(Landroid/graphics/text/LineBreaker$ParagraphConstraints;)[I
+HPLandroid/graphics/text/LineBreaker$ParagraphConstraints;->access$1200(Landroid/graphics/text/LineBreaker$ParagraphConstraints;)I
+HPLandroid/graphics/text/LineBreaker$Result;-><init>(JLandroid/graphics/text/LineBreaker$1;)V
+HPLandroid/graphics/text/LineBreaker$Result;->getLineCount()I
+HPLandroid/graphics/text/LineBreaker$Result;->getLineBreakOffset(I)I
+HPLandroid/graphics/text/LineBreaker$Result;->getLineWidth(I)F
+HPLandroid/graphics/text/LineBreaker$Result;->getLineAscent(I)F
+HPLandroid/graphics/text/LineBreaker$Result;->getLineDescent(I)F
+HPLandroid/graphics/text/LineBreaker$Result;->hasLineTab(I)Z
+HPLandroid/graphics/text/LineBreaker$Result;->getLineHyphenEdit(I)I
+HPLandroid/graphics/text/MeasuredText;-><init>(J[CLandroid/graphics/text/MeasuredText$1;)V
+HPLandroid/graphics/text/MeasuredText;->getChars()[C
+HPLandroid/graphics/text/MeasuredText;->getWidth(II)F
+HPLandroid/graphics/text/MeasuredText;->getMemoryUsage()I
+HPLandroid/graphics/text/MeasuredText;->getBounds(IILandroid/graphics/Rect;)V
+HPLandroid/graphics/text/MeasuredText;->getCharWidthAt(I)F
+HPLandroid/graphics/text/MeasuredText;->getNativePtr()J
+HPLandroid/graphics/text/MeasuredText$Builder;-><init>([C)V
+HPLandroid/graphics/text/MeasuredText$Builder;->appendStyleRun(Landroid/graphics/Paint;IZ)Landroid/graphics/text/MeasuredText$Builder;
+HPLandroid/graphics/text/MeasuredText$Builder;->appendReplacementRun(Landroid/graphics/Paint;IF)Landroid/graphics/text/MeasuredText$Builder;
+HPLandroid/graphics/text/MeasuredText$Builder;->setComputeHyphenation(Z)Landroid/graphics/text/MeasuredText$Builder;
+HPLandroid/graphics/text/MeasuredText$Builder;->setComputeLayout(Z)Landroid/graphics/text/MeasuredText$Builder;
+HPLandroid/graphics/text/MeasuredText$Builder;->build()Landroid/graphics/text/MeasuredText;
HPLandroid/hardware/Camera$AutoFocusCallback;->onAutoFocus(ZLandroid/hardware/Camera;)V
HPLandroid/hardware/Camera$EventHandler;->handleMessage(Landroid/os/Message;)V
HPLandroid/hardware/Camera$Parameters;->getFlashMode()Ljava/lang/String;
@@ -13145,7 +13195,7 @@ HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionCancelled()V
HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionFinished()V
HSPLandroid/app/ActivityManagerInternal;->notifyAppTransitionStarting(Landroid/util/SparseIntArray;J)V
HSPLandroid/app/ActivityManagerInternal;->notifyDockedStackMinimizedChanged(Z)V
-HSPLandroid/app/ActivityManagerInternal;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+HSPLandroid/app/ActivityManagerInternal;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;I)V
HSPLandroid/app/ActivityManagerInternal;->notifyKeyguardTrustedChanged()V
HSPLandroid/app/ActivityManagerInternal;->notifyNetworkPolicyRulesUpdated(IJ)V
HSPLandroid/app/ActivityManagerInternal;->onLocalVoiceInteractionStarted(Landroid/os/IBinder;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)V
@@ -31250,9 +31300,10 @@ HSPLandroid/text/Layout;->replaceWith(Ljava/lang/CharSequence;Landroid/text/Text
HSPLandroid/text/Layout;->setJustificationMode(I)V
HSPLandroid/text/Layout;->shouldClampCursor(I)Z
HSPLandroid/text/MeasuredParagraph;-><init>()V
-HSPLandroid/text/MeasuredParagraph;->applyMetricsAffectingSpan(Landroid/text/TextPaint;[Landroid/text/style/MetricAffectingSpan;IIJ)V
-HSPLandroid/text/MeasuredParagraph;->applyReplacementRun(Landroid/text/style/ReplacementSpan;IIJ)V
-HSPLandroid/text/MeasuredParagraph;->applyStyleRun(IIJ)V
+HPLandroid/text/MeasuredParagraph;->getMeasuredText()Landroid/graphics/text/MeasuredText;
+HSPLandroid/text/MeasuredParagraph;->applyMetricsAffectingSpan(Landroid/text/TextPaint;[Landroid/text/style/MetricAffectingSpan;IILandroid/graphics/text/MeasuredText$Builder;)V
+HSPLandroid/text/MeasuredParagraph;->applyReplacementRun(Landroid/text/style/ReplacementSpan;IILandroid/graphics/text/MeasuredText$Builder;)V
+HSPLandroid/text/MeasuredParagraph;->applyStyleRun(IILandroid/graphics/text/MeasuredText$Builder;)V
HSPLandroid/text/MeasuredParagraph;->breakText(IZF)I
HSPLandroid/text/MeasuredParagraph;->buildForBidi(Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
HSPLandroid/text/MeasuredParagraph;->buildForMeasurement(Landroid/text/TextPaint;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph;
@@ -31287,6 +31338,7 @@ HSPLandroid/text/PackedObjectVector;->moveRowGapTo(I)V
HSPLandroid/text/PackedObjectVector;->setValue(IILjava/lang/Object;)V
HSPLandroid/text/PackedObjectVector;->size()I
HSPLandroid/text/PrecomputedText$Params;-><init>(Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;II)V
+HPLandroid/text/PrecomputedText;->getCharWidthAt(I)F
HSPLandroid/text/PrecomputedText;->createMeasuredParagraphs(Ljava/lang/CharSequence;Landroid/text/PrecomputedText$Params;IIZ)[Landroid/text/PrecomputedText$ParagraphInfo;
HSPLandroid/text/Selection$END;-><init>(Landroid/text/Selection$1;)V
HSPLandroid/text/Selection$MEMORY;-><init>(Landroid/text/Selection$1;)V
@@ -32750,15 +32802,8 @@ HSPLandroid/view/IWindowManager;->isViewServerRunning()Z
HSPLandroid/view/IWindowManager;->isWindowTraceEnabled()Z
HSPLandroid/view/IWindowManager;->lockNow(Landroid/os/Bundle;)V
HSPLandroid/view/IWindowManager;->openSession(Landroid/view/IWindowSessionCallback;Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;)Landroid/view/IWindowSession;
-HSPLandroid/view/IWindowManager;->overridePendingAppTransition(Ljava/lang/String;IILandroid/os/IRemoteCallback;)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionAspectScaledThumb(Landroid/graphics/GraphicBuffer;IIIILandroid/os/IRemoteCallback;Z)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionClipReveal(IIII)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionInPlace(Ljava/lang/String;I)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionMultiThumb([Landroid/view/AppTransitionAnimationSpec;Landroid/os/IRemoteCallback;Landroid/os/IRemoteCallback;Z)V
HSPLandroid/view/IWindowManager;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;Z)V
HSPLandroid/view/IWindowManager;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionScaleUp(IIII)V
-HSPLandroid/view/IWindowManager;->overridePendingAppTransitionThumb(Landroid/graphics/GraphicBuffer;IILandroid/os/IRemoteCallback;Z)V
HSPLandroid/view/IWindowManager;->prepareAppTransition(IZ)V
HSPLandroid/view/IWindowManager;->reenableKeyguard(Landroid/os/IBinder;)V
HSPLandroid/view/IWindowManager;->refreshScreenCaptureDisabled(I)V
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index bbc3f35aa05a..7382cd3f5ff1 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -1418,7 +1418,6 @@ Landroid/view/IWindowManager;->getBaseDisplaySize(ILandroid/graphics/Point;)V
Landroid/view/IWindowManager;->getDockedStackSide()I
Landroid/view/IWindowManager;->getInitialDisplayDensity(I)I
Landroid/view/IWindowManager;->getInitialDisplaySize(ILandroid/graphics/Point;)V
-Landroid/view/IWindowManager;->getPendingAppTransition()I
Landroid/view/IWindowManager;->hasNavigationBar()Z
Landroid/view/IWindowManager;->isKeyguardLocked()Z
Landroid/view/IWindowManager;->isKeyguardSecure()Z
@@ -1455,7 +1454,6 @@ Landroid/webkit/IWebViewUpdateService;->getCurrentWebViewPackageName()Ljava/lang
Landroid/webkit/IWebViewUpdateService;->getValidWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
Landroid/webkit/IWebViewUpdateService;->isFallbackPackage(Ljava/lang/String;)Z
Landroid/widget/RelativeLayout$DependencyGraph$Node;-><init>()V
-Landroid/widget/RemoteViews$OnClickHandler;-><init>()V
Landroid/widget/ScrollBarDrawable;-><init>()V
Lcom/android/ims/ImsConfigListener$Stub;-><init>()V
Lcom/android/ims/internal/IImsCallSession$Stub;-><init>()V
@@ -2283,347 +2281,6 @@ Lcom/google/android/mms/util/PduCache;->purge(Landroid/net/Uri;)Lcom/google/andr
Lcom/google/android/mms/util/PduCache;->purgeAll()V
Lcom/google/android/mms/util/PduCacheEntry;->getPdu()Lcom/google/android/mms/pdu/GenericPdu;
Lcom/google/android/mms/util/SqliteWrapper;->insert(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
-Ljava/io/Console;->encoding()Ljava/lang/String;
-Ljava/io/File;->filePath:Ljava/nio/file/Path;
-Ljava/io/File;->fs:Ljava/io/FileSystem;
-Ljava/io/File;->path:Ljava/lang/String;
-Ljava/io/File;->prefixLength:I
-Ljava/io/File;->status:Ljava/io/File$PathStatus;
-Ljava/io/FileDescriptor;->descriptor:I
-Ljava/io/FileDescriptor;->getInt$()I
-Ljava/io/FileDescriptor;->isSocket$()Z
-Ljava/io/FileDescriptor;->setInt$(I)V
-Ljava/io/FileInputStream;->fd:Ljava/io/FileDescriptor;
-Ljava/io/FileOutputStream;->channel:Ljava/nio/channels/FileChannel;
-Ljava/io/FileOutputStream;->fd:Ljava/io/FileDescriptor;
-Ljava/io/FileSystem;->canonicalize(Ljava/lang/String;)Ljava/lang/String;
-Ljava/io/FileSystem;->checkAccess(Ljava/io/File;I)Z
-Ljava/io/FileSystem;->compare(Ljava/io/File;Ljava/io/File;)I
-Ljava/io/FileSystem;->createDirectory(Ljava/io/File;)Z
-Ljava/io/FileSystem;->createFileExclusively(Ljava/lang/String;)Z
-Ljava/io/FileSystem;->delete(Ljava/io/File;)Z
-Ljava/io/FileSystem;->fromURIPath(Ljava/lang/String;)Ljava/lang/String;
-Ljava/io/FileSystem;->getBooleanAttributes(Ljava/io/File;)I
-Ljava/io/FileSystem;->getDefaultParent()Ljava/lang/String;
-Ljava/io/FileSystem;->getLastModifiedTime(Ljava/io/File;)J
-Ljava/io/FileSystem;->getLength(Ljava/io/File;)J
-Ljava/io/FileSystem;->getPathSeparator()C
-Ljava/io/FileSystem;->getSeparator()C
-Ljava/io/FileSystem;->getSpace(Ljava/io/File;I)J
-Ljava/io/FileSystem;->hashCode(Ljava/io/File;)I
-Ljava/io/FileSystem;->isAbsolute(Ljava/io/File;)Z
-Ljava/io/FileSystem;->list(Ljava/io/File;)[Ljava/lang/String;
-Ljava/io/FileSystem;->listRoots()[Ljava/io/File;
-Ljava/io/FileSystem;->normalize(Ljava/lang/String;)Ljava/lang/String;
-Ljava/io/FileSystem;->prefixLength(Ljava/lang/String;)I
-Ljava/io/FileSystem;->rename(Ljava/io/File;Ljava/io/File;)Z
-Ljava/io/FileSystem;->resolve(Ljava/io/File;)Ljava/lang/String;
-Ljava/io/FileSystem;->resolve(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Ljava/io/FileSystem;->setLastModifiedTime(Ljava/io/File;J)Z
-Ljava/io/FileSystem;->setPermission(Ljava/io/File;IZZ)Z
-Ljava/io/FileSystem;->setReadOnly(Ljava/io/File;)Z
-Ljava/io/ObjectInputStream;->bin:Ljava/io/ObjectInputStream$BlockDataInputStream;
-Ljava/io/ObjectInputStream;->bytesToDoubles([BI[DII)V
-Ljava/io/ObjectInputStream;->bytesToFloats([BI[FII)V
-Ljava/io/ObjectOutputStream;->protocol:I
-Ljava/io/ObjectStreamClass;->computeDefaultSUID(Ljava/lang/Class;)J
-Ljava/io/ObjectStreamClass;->computeFieldOffsets()V
-Ljava/io/ObjectStreamClass;->fields:[Ljava/io/ObjectStreamField;
-Ljava/io/ObjectStreamClass;->getConstructorId(Ljava/lang/Class;)J
-Ljava/io/ObjectStreamClass;->getLocalDesc()Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamClass;->getNumObjFields()I
-Ljava/io/ObjectStreamClass;->getPrimDataSize()I
-Ljava/io/ObjectStreamClass;->hasReadObjectMethod()Z
-Ljava/io/ObjectStreamClass;->hasReadObjectNoDataMethod()Z
-Ljava/io/ObjectStreamClass;->hasWriteObjectData()Z
-Ljava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object;
-Ljava/io/ObjectStreamClass;->newInstance(Ljava/lang/Class;J)Ljava/lang/Object;
-Ljava/io/ObjectStreamField;->getField()Ljava/lang/reflect/Field;
-Ljava/io/RandomAccessFile;->fd:Ljava/io/FileDescriptor;
-Ljava/lang/AbstractStringBuilder;->value:[C
-Ljava/lang/Boolean;->value:Z
-Ljava/lang/Byte;->toHexString(BZ)Ljava/lang/String;
-Ljava/lang/Byte;->value:B
-Ljava/lang/Character;->value:C
-Ljava/lang/Class;-><init>()V
-Ljava/lang/Class;->accessFlags:I
-Ljava/lang/Class;->classLoader:Ljava/lang/ClassLoader;
-Ljava/lang/Class;->clinitThreadId:I
-Ljava/lang/Class;->dexCache:Ljava/lang/Object;
-Ljava/lang/Class;->dexClassDefIndex:I
-Ljava/lang/Class;->getDeclaredMethodsUnchecked(Z)[Ljava/lang/reflect/Method;
-Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;Z)Ljava/lang/reflect/Method;
-Ljava/lang/Class;->ifTable:[Ljava/lang/Object;
-Ljava/lang/Class;->name:Ljava/lang/String;
-Ljava/lang/Class;->objectSize:I
-Ljava/lang/Class;->status:I
-Ljava/lang/ClassLoader;->parent:Ljava/lang/ClassLoader;
-Ljava/lang/Double;->value:D
-Ljava/lang/Enum;->getSharedConstants(Ljava/lang/Class;)[Ljava/lang/Enum;
-Ljava/lang/Enum;->name:Ljava/lang/String;
-Ljava/lang/Enum;->ordinal:I
-Ljava/lang/Float;->value:F
-Ljava/lang/Integer;->value:I
-Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V
-Ljava/lang/Long;->value:J
-Ljava/lang/Object;->identityHashCode(Ljava/lang/Object;)I
-Ljava/lang/ref/Reference;->getReferent()Ljava/lang/Object;
-Ljava/lang/ref/Reference;->referent:Ljava/lang/Object;
-Ljava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V
-Ljava/lang/reflect/AccessibleObject;->override:Z
-Ljava/lang/reflect/Constructor;->serializationCopy(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
-Ljava/lang/reflect/Executable;->artMethod:J
-Ljava/lang/reflect/Field;->accessFlags:I
-Ljava/lang/reflect/Field;->getOffset()I
-Ljava/lang/reflect/Parameter;-><init>(Ljava/lang/String;ILjava/lang/reflect/Executable;I)V
-Ljava/lang/reflect/Proxy;->invoke(Ljava/lang/reflect/Proxy;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
-Ljava/lang/Runtime;-><init>()V
-Ljava/lang/Runtime;->load(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Ljava/lang/Runtime;->loadLibrary(Ljava/lang/String;Ljava/lang/ClassLoader;)V
-Ljava/lang/Runtime;->loadLibrary0(Ljava/lang/ClassLoader;Ljava/lang/String;)V
-Ljava/lang/Runtime;->mLibPaths:[Ljava/lang/String;
-Ljava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;
-Ljava/lang/Short;->value:S
-Ljava/lang/StackTraceElement;->declaringClass:Ljava/lang/String;
-Ljava/lang/StackTraceElement;->fileName:Ljava/lang/String;
-Ljava/lang/StackTraceElement;->lineNumber:I
-Ljava/lang/StackTraceElement;->methodName:Ljava/lang/String;
-Ljava/lang/String;-><init>(II[C)V
-Ljava/lang/String;->count:I
-Ljava/lang/String;->getCharsNoCheck(II[CI)V
-Ljava/lang/String;->hash:I
-Ljava/lang/String;->indexOf([CII[CIII)I
-Ljava/lang/String;->lastIndexOf([CII[CIII)I
-Ljava/lang/System;-><init>()V
-Ljava/lang/System;->arraycopy([CI[CII)V
-Ljava/lang/System;->arraycopy([FI[FII)V
-Ljava/lang/System;->arraycopy([II[III)V
-Ljava/lang/System;->arraycopy([JI[JII)V
-Ljava/lang/System;->arraycopy([SI[SII)V
-Ljava/lang/System;->arraycopy([ZI[ZII)V
-Ljava/lang/System;->log(CLjava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/System;->logE(Ljava/lang/String;)V
-Ljava/lang/System;->logE(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/System;->logW(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V
-Ljava/lang/Thread;->contextClassLoader:Ljava/lang/ClassLoader;
-Ljava/lang/Thread;->daemon:Z
-Ljava/lang/Thread;->dispatchUncaughtException(Ljava/lang/Throwable;)V
-Ljava/lang/Thread;->getUncaughtExceptionPreHandler()Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread;->group:Ljava/lang/ThreadGroup;
-Ljava/lang/Thread;->inheritableThreadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/Thread;->inheritedAccessControlContext:Ljava/security/AccessControlContext;
-Ljava/lang/Thread;->lock:Ljava/lang/Object;
-Ljava/lang/Thread;->name:Ljava/lang/String;
-Ljava/lang/Thread;->nativePeer:J
-Ljava/lang/Thread;->parkBlocker:Ljava/lang/Object;
-Ljava/lang/Thread;->priority:I
-Ljava/lang/Thread;->target:Ljava/lang/Runnable;
-Ljava/lang/Thread;->threadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/Thread;->threadSeqNumber:J
-Ljava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V
-Ljava/lang/ThreadGroup;->groups:[Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadGroup;->mainThreadGroup:Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadGroup;->name:Ljava/lang/String;
-Ljava/lang/ThreadGroup;->ngroups:I
-Ljava/lang/ThreadGroup;->parent:Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadGroup;->systemThreadGroup:Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadGroup;->threadTerminated(Ljava/lang/Thread;)V
-Ljava/lang/ThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/Throwable;->backtrace:Ljava/lang/Object;
-Ljava/lang/Throwable;->cause:Ljava/lang/Throwable;
-Ljava/lang/Throwable;->detailMessage:Ljava/lang/String;
-Ljava/lang/Throwable;->getOurStackTrace()[Ljava/lang/StackTraceElement;
-Ljava/lang/Throwable;->nativeFillInStackTrace()Ljava/lang/Object;
-Ljava/lang/Throwable;->printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V
-Ljava/lang/Throwable;->stackTrace:[Ljava/lang/StackTraceElement;
-Ljava/lang/Throwable;->suppressedExceptions:Ljava/util/List;
-Ljava/lang/Void;-><init>()V
-Ljava/net/Authenticator;->theAuthenticator:Ljava/net/Authenticator;
-Ljava/net/DatagramSocket;->getFileDescriptor$()Ljava/io/FileDescriptor;
-Ljava/net/DatagramSocket;->impl:Ljava/net/DatagramSocketImpl;
-Ljava/net/HttpCookie;->assignors:Ljava/util/Map;
-Ljava/net/HttpCookie;->comment:Ljava/lang/String;
-Ljava/net/HttpCookie;->commentURL:Ljava/lang/String;
-Ljava/net/HttpCookie;->domain:Ljava/lang/String;
-Ljava/net/HttpCookie;->header:Ljava/lang/String;
-Ljava/net/HttpCookie;->httpOnly:Z
-Ljava/net/HttpCookie;->maxAge:J
-Ljava/net/HttpCookie;->name:Ljava/lang/String;
-Ljava/net/HttpCookie;->path:Ljava/lang/String;
-Ljava/net/HttpCookie;->portlist:Ljava/lang/String;
-Ljava/net/HttpCookie;->secure:Z
-Ljava/net/HttpCookie;->toDiscard:Z
-Ljava/net/HttpCookie;->tspecials:Ljava/lang/String;
-Ljava/net/HttpCookie;->value:Ljava/lang/String;
-Ljava/net/HttpCookie;->version:I
-Ljava/net/HttpCookie;->whenCreated:J
-Ljava/net/Inet4Address;-><init>()V
-Ljava/net/Inet6Address$Inet6AddressHolder;->ipaddress:[B
-Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id:I
-Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id_set:Z
-Ljava/net/Inet6Address$Inet6AddressHolder;->scope_ifname:Ljava/net/NetworkInterface;
-Ljava/net/Inet6Address;-><init>()V
-Ljava/net/Inet6Address;->holder6:Ljava/net/Inet6Address$Inet6AddressHolder;
-Ljava/net/InetAddress$InetAddressHolder;->address:I
-Ljava/net/InetAddress$InetAddressHolder;->family:I
-Ljava/net/InetAddress$InetAddressHolder;->hostName:Ljava/lang/String;
-Ljava/net/InetAddress$InetAddressHolder;->originalHostName:Ljava/lang/String;
-Ljava/net/InetAddress;->clearDnsCache()V
-Ljava/net/InetAddress;->getAllByNameOnNet(Ljava/lang/String;I)[Ljava/net/InetAddress;
-Ljava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder;
-Ljava/net/InetAddress;->holder:Ljava/net/InetAddress$InetAddressHolder;
-Ljava/net/InetAddress;->isNumeric(Ljava/lang/String;)Z
-Ljava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
-Ljava/net/InetSocketAddress;->holder:Ljava/net/InetSocketAddress$InetSocketAddressHolder;
-Ljava/net/InterfaceAddress;-><init>()V
-Ljava/net/Proxy;-><init>()V
-Ljava/net/ServerSocket;->factory:Ljava/net/SocketImplFactory;
-Ljava/net/Socket;->factory:Ljava/net/SocketImplFactory;
-Ljava/net/Socket;->getFileDescriptor$()Ljava/io/FileDescriptor;
-Ljava/net/Socket;->impl:Ljava/net/SocketImpl;
-Ljava/net/SocketException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-Ljava/net/SocketImpl;->serverSocket:Ljava/net/ServerSocket;
-Ljava/net/SocketImpl;->socket:Ljava/net/Socket;
-Ljava/net/SocksSocketImpl;-><init>()V
-Ljava/net/URI;->fragment:Ljava/lang/String;
-Ljava/net/URI;->host:Ljava/lang/String;
-Ljava/net/URI;->port:I
-Ljava/net/URI;->query:Ljava/lang/String;
-Ljava/net/URI;->string:Ljava/lang/String;
-Ljava/net/URL;->factory:Ljava/net/URLStreamHandlerFactory;
-Ljava/net/URL;->handler:Ljava/net/URLStreamHandler;
-Ljava/net/URL;->handlers:Ljava/util/Hashtable;
-Ljava/net/URL;->protocol:Ljava/lang/String;
-Ljava/net/URLClassLoader;->acc:Ljava/security/AccessControlContext;
-Ljava/net/URLClassLoader;->ucp:Lsun/misc/URLClassPath;
-Ljava/nio/Buffer;->address:J
-Ljava/nio/Buffer;->capacity:I
-Ljava/nio/Buffer;->limit:I
-Ljava/nio/Buffer;->position:I
-Ljava/nio/Buffer;->_elementSizeShift:I
-Ljava/nio/ByteBuffer;->hb:[B
-Ljava/nio/ByteBuffer;->isReadOnly:Z
-Ljava/nio/ByteBuffer;->offset:I
-Ljava/nio/CharBuffer;->toString(II)Ljava/lang/String;
-Ljava/nio/charset/Charset;->defaultCharset:Ljava/nio/charset/Charset;
-Ljava/nio/charset/CharsetEncoder;->canEncode(Ljava/nio/CharBuffer;)Z
-Ljava/nio/DirectByteBuffer;-><init>(JI)V
-Ljava/security/KeyPairGenerator;->getInstance(Lsun/security/jca/GetInstance$Instance;Ljava/lang/String;)Ljava/security/KeyPairGenerator;
-Ljava/security/KeyStore;->keyStoreSpi:Ljava/security/KeyStoreSpi;
-Ljava/security/Signature;->getInstance(Lsun/security/jca/GetInstance$Instance;Ljava/lang/String;)Ljava/security/Signature;
-Ljava/security/spec/ECParameterSpec;->getCurveName()Ljava/lang/String;
-Ljava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V
-Ljava/text/Collator;->icuColl:Landroid/icu/text/Collator;
-Ljava/text/DateFormat;->is24Hour:Ljava/lang/Boolean;
-Ljava/text/DecimalFormatSymbols;->getPercentString()Ljava/lang/String;
-Ljava/text/NumberFormat;->getInstance(Ljava/util/Locale;I)Ljava/text/NumberFormat;
-Ljava/time/Duration;->toSeconds()Ljava/math/BigDecimal;
-Ljava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)V
-Ljava/time/ZoneId;->of(Ljava/lang/String;Z)Ljava/time/ZoneId;
-Ljava/util/ArrayDeque;->elements:[Ljava/lang/Object;
-Ljava/util/ArrayDeque;->head:I
-Ljava/util/ArrayDeque;->tail:I
-Ljava/util/ArrayList$SubList;->offset:I
-Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList;
-Ljava/util/ArrayList$SubList;->parentOffset:I
-Ljava/util/ArrayList$SubList;->size:I
-Ljava/util/ArrayList;->elementData:[Ljava/lang/Object;
-Ljava/util/ArrayList;->size:I
-Ljava/util/Arrays$ArrayList;->a:[Ljava/lang/Object;
-Ljava/util/Arrays;->deepToString([Ljava/lang/Object;Ljava/lang/StringBuilder;Ljava/util/Set;)V
-Ljava/util/Calendar;->zone:Ljava/util/TimeZone;
-Ljava/util/Collections$EmptyList;-><init>()V
-Ljava/util/Collections$EmptyMap;-><init>()V
-Ljava/util/Collections$SynchronizedCollection;->c:Ljava/util/Collection;
-Ljava/util/Collections$SynchronizedList;->list:Ljava/util/List;
-Ljava/util/Collections$SynchronizedMap;->m:Ljava/util/Map;
-Ljava/util/Collections$UnmodifiableCollection;->c:Ljava/util/Collection;
-Ljava/util/Collections$UnmodifiableMap;->m:Ljava/util/Map;
-Ljava/util/concurrent/atomic/AtomicInteger;->value:I
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasMoreElements()Z
-Ljava/util/concurrent/CopyOnWriteArrayList;->elements:[Ljava/lang/Object;
-Ljava/util/concurrent/CopyOnWriteArraySet;->al:Ljava/util/concurrent/CopyOnWriteArrayList;
-Ljava/util/concurrent/Executors$RunnableAdapter;->task:Ljava/lang/Runnable;
-Ljava/util/concurrent/FutureTask;->callable:Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/FutureTask;->EXCEPTIONAL:I
-Ljava/util/concurrent/FutureTask;->outcome:Ljava/lang/Object;
-Ljava/util/concurrent/FutureTask;->state:I
-Ljava/util/concurrent/LinkedBlockingDeque;->first:Ljava/util/concurrent/LinkedBlockingDeque$Node;
-Ljava/util/concurrent/LinkedBlockingDeque;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/LinkedBlockingQueue;->capacity:I
-Ljava/util/concurrent/LinkedBlockingQueue;->head:Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/LinkedBlockingQueue;->putLock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/LinkedBlockingQueue;->takeLock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/locks/ReentrantLock;->sync:Ljava/util/concurrent/locks/ReentrantLock$Sync;
-Ljava/util/concurrent/PriorityBlockingQueue;->dequeue()Ljava/lang/Object;
-Ljava/util/concurrent/PriorityBlockingQueue;->lock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/PriorityBlockingQueue;->notEmpty:Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/ThreadPoolExecutor;->allowCoreThreadTimeOut:Z
-Ljava/util/concurrent/ThreadPoolExecutor;->ctl:Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/ThreadPoolExecutor;->defaultHandler:Ljava/util/concurrent/RejectedExecutionHandler;
-Ljava/util/concurrent/ThreadPoolExecutor;->mainLock:Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/EnumMap;->keyType:Ljava/lang/Class;
-Ljava/util/EnumSet;->elementType:Ljava/lang/Class;
-Ljava/util/HashMap$HashIterator;->hasNext()Z
-Ljava/util/HashMap$HashIterator;->remove()V
-Ljava/util/HashMap$Node;->key:Ljava/lang/Object;
-Ljava/util/HashMap$Node;->next:Ljava/util/HashMap$Node;
-Ljava/util/HashMap$Node;->value:Ljava/lang/Object;
-Ljava/util/HashMap;->modCount:I
-Ljava/util/HashMap;->table:[Ljava/util/HashMap$Node;
-Ljava/util/HashSet;->map:Ljava/util/HashMap;
-Ljava/util/jar/JarFile;->manifest:Ljava/util/jar/Manifest;
-Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
-Ljava/util/LinkedHashMap;->accessOrder:Z
-Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
-Ljava/util/LinkedList$Node;->item:Ljava/lang/Object;
-Ljava/util/LinkedList$Node;->next:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;->first:Ljava/util/LinkedList$Node;
-Ljava/util/LinkedList;->size:I
-Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
-Ljava/util/Locale;->getInstance(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
-Ljava/util/logging/Handler;->sealed:Z
-Ljava/util/logging/Logger;->treeLock:Ljava/lang/Object;
-Ljava/util/logging/LogManager;->getFormatterProperty(Ljava/lang/String;Ljava/util/logging/Formatter;)Ljava/util/logging/Formatter;
-Ljava/util/PriorityQueue;->modCount:I
-Ljava/util/PriorityQueue;->queue:[Ljava/lang/Object;
-Ljava/util/PriorityQueue;->size:I
-Ljava/util/Properties;->saveConvert(Ljava/lang/String;ZZ)Ljava/lang/String;
-Ljava/util/Random;->seedUniquifier()J
-Ljava/util/regex/Matcher;->appendPos:I
-Ljava/util/TimerTask;->period:J
-Ljava/util/UUID;->leastSigBits:J
-Ljava/util/UUID;->mostSigBits:J
-Ljava/util/Vector;->elementData(I)Ljava/lang/Object;
-Ljava/util/zip/Adler32;->update(II)I
-Ljava/util/zip/CRC32;->update(II)I
-Ljava/util/zip/Deflater;->buf:[B
-Ljava/util/zip/Deflater;->finish:Z
-Ljava/util/zip/Deflater;->finished:Z
-Ljava/util/zip/Deflater;->len:I
-Ljava/util/zip/Deflater;->level:I
-Ljava/util/zip/Deflater;->off:I
-Ljava/util/zip/Deflater;->setParams:Z
-Ljava/util/zip/Deflater;->strategy:I
-Ljava/util/zip/Inflater;->buf:[B
-Ljava/util/zip/Inflater;->finished:Z
-Ljava/util/zip/Inflater;->len:I
-Ljava/util/zip/Inflater;->needDict:Z
-Ljava/util/zip/Inflater;->off:I
-Ljava/util/zip/ZipEntry;-><init>(Ljava/lang/String;Ljava/lang/String;JJJII[BJ)V
-Ljava/util/zip/ZipEntry;->method:I
-Ljava/util/zip/ZipFile;->close(J)V
-Ljava/util/zip/ZipFile;->getEntry(J[BZ)J
-Ljava/util/zip/ZipFile;->jzfile:J
-Ljava/util/zip/ZipInputStream;->flag:I
-Ljava/util/zip/ZipInputStream;->tmpbuf:[B
-Ljava/util/zip/ZipOutputStream;->method:I
-Ljava/util/zip/ZipOutputStream;->names:Ljava/util/HashSet;
-Ljava/util/zip/ZipOutputStream;->written:J
-Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ssl/SSLServerSocketFactory;
-Ljavax/net/ssl/SSLSocketFactory;->createSocket(Ljava/net/Socket;Ljava/io/InputStream;Z)Ljava/net/Socket;
-Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
Lorg/ccil/cowan/tagsoup/AttributesImpl;->data:[Ljava/lang/String;
Lorg/ccil/cowan/tagsoup/AttributesImpl;->length:I
Lorg/ccil/cowan/tagsoup/ElementType;->theAtts:Lorg/ccil/cowan/tagsoup/AttributesImpl;
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index 4275bd47f1ad..575ba340f52a 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -245,7 +245,3 @@ Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/inter
Lcom/android/internal/R$styleable;->NumberPicker:[I
Lcom/android/internal/R$styleable;->TwoLineListItem:[I
Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z
-Ljava/lang/System;->arraycopy([BI[BII)V
-Ljava/net/Inet4Address;->ALL:Ljava/net/InetAddress;
-Ljava/net/Inet4Address;->ANY:Ljava/net/InetAddress;
-Ljava/net/Inet6Address;->ANY:Ljava/net/InetAddress;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 95bcf0ecf132..b6bff9c78544 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -1240,6 +1240,12 @@ android.graphics.fonts.FontVariationAxis
android.graphics.pdf.PdfDocument
android.graphics.pdf.PdfEditor
android.graphics.pdf.PdfRenderer
+android.graphics.text.LineBreaker
+android.graphics.text.LineBreaker$Builder
+android.graphics.text.LineBreaker$ParagraphConstraints
+android.graphics.text.LineBreaker$Result
+android.graphics.text.MeasuredText
+android.graphics.text.MeasuredText$Builder
android.hardware.Camera
android.hardware.Camera$CameraInfo
android.hardware.Camera$Face
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 3189d089e6d8..579144bbce73 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -16,17 +16,15 @@
package android.accounts;
-import static android.Manifest.permission.GET_ACCOUNTS;
-
+import android.annotation.BroadcastBehavior;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.Size;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.annotation.SdkConstant.SdkConstantType;
-import android.annotation.BroadcastBehavior;
import android.annotation.UnsupportedAppUsage;
import android.app.Activity;
import android.content.BroadcastReceiver;
@@ -36,27 +34,24 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.res.Resources;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.database.SQLException;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.R;
+
import com.google.android.collect.Maps;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.SuppressWarnings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -510,7 +505,7 @@ public class AccountManager {
* {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}.
*
* @param account The account to query for user data
- * @return The user data, null if the account or key doesn't exist
+ * @return The user data, null if the account, key doesn't exist, or the user is locked
*/
public String getUserData(final Account account, final String key) {
if (account == null) throw new IllegalArgumentException("account is null");
@@ -880,7 +875,7 @@ public class AccountManager {
* @param userdata String values to use for the account's userdata, null for
* none
* @return True if the account was successfully added, false if the account
- * already exists, the account is null, or another error occurs.
+ * already exists, the account is null, the user is locked, or another error occurs.
*/
public boolean addAccountExplicitly(Account account, String password, Bundle userdata) {
if (account == null) throw new IllegalArgumentException("account is null");
@@ -1349,7 +1344,7 @@ public class AccountManager {
* @param account The account for which an auth token is to be fetched. Cannot be {@code null}.
* @param authTokenType The type of auth token to fetch. Cannot be {@code null}.
* @return The cached auth token for this account and type, or null if
- * no auth token is cached or the account does not exist.
+ * no auth token is cached, the account does not exist, or the user is locked
* @see #getAuthToken
*/
public String peekAuthToken(final Account account, final String authTokenType) {
@@ -1420,7 +1415,7 @@ public class AccountManager {
}
/**
- * Sets one userdata key for an account. Intended by use for the
+ * Sets one userdata key for an account. Intended by use for the
* authenticator to stash state for itself, not directly by applications.
* The meaning of the keys and values is up to the authenticator.
*
@@ -3082,7 +3077,7 @@ public class AccountManager {
}
/**
- * Asks the user to enter a new password for an account but not updating the
+ * Asks the user to enter a new password for the account but not updating the
* saved credentials for the account until {@link #finishSession} is called.
* <p>
* This method may be called from any thread, but the returned
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 3cc5e370bc83..a66681956233 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -131,8 +131,6 @@ import com.android.internal.app.ToolbarActionBar;
import com.android.internal.app.WindowDecorActionBar;
import com.android.internal.policy.PhoneWindow;
-import dalvik.system.VMRuntime;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -7272,31 +7270,6 @@ public class Activity extends ContextThemeWrapper
}
}
- // This property is set for all non-user builds except final release
- boolean isApiWarningEnabled = SystemProperties.getInt("ro.art.hiddenapi.warning", 0) == 1;
-
- if (isAppDebuggable || isApiWarningEnabled) {
- if (!mMainThread.mHiddenApiWarningShown && VMRuntime.getRuntime().hasUsedHiddenApi()) {
- // Only show the warning once per process.
- mMainThread.mHiddenApiWarningShown = true;
-
- String appName = getApplicationInfo().loadLabel(getPackageManager())
- .toString();
- String warning = "Detected problems with API compatibility\n"
- + "(visit g.co/dev/appcompat for more info)";
- if (isAppDebuggable) {
- new AlertDialog.Builder(this)
- .setTitle(appName)
- .setMessage(warning)
- .setPositiveButton(android.R.string.ok, null)
- .setCancelable(false)
- .show();
- } else {
- Toast.makeText(this, appName + "\n" + warning, Toast.LENGTH_LONG).show();
- }
- }
- }
-
mActivityTransitionState.enterReady(this);
getApplication().dispatchActivityPostStarted(this);
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3b2a21e61e54..9079f1a174a2 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -5878,14 +5878,17 @@ public final class ActivityThread extends ClientTransactionHandler {
}
}
- // Allow application-generated systrace messages if we're debuggable.
- boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
- Trace.setAppTracingAllowed(isAppDebuggable);
- ThreadedRenderer.setDebuggingEnabled(isAppDebuggable || Build.IS_DEBUGGABLE);
- if (isAppDebuggable && data.enableBinderTracking) {
+ // Allow binder tracing, and application-generated systrace messages if we're profileable.
+ boolean isAppProfileable = data.appInfo.isProfileableByShell();
+ Trace.setAppTracingAllowed(isAppProfileable);
+ if (isAppProfileable && data.enableBinderTracking) {
Binder.enableTracing();
}
+ // Allow renderer debugging features if we're debuggable.
+ boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ ThreadedRenderer.setDebuggingEnabled(isAppDebuggable || Build.IS_DEBUGGABLE);
+
/**
* Initialize the default http proxy in this process for the reasons we set the time zone.
*/
diff --git a/core/java/android/app/AppOpsManager.aidl b/core/java/android/app/AppOpsManager.aidl
index 4b97a15f6181..9329fbc83376 100644
--- a/core/java/android/app/AppOpsManager.aidl
+++ b/core/java/android/app/AppOpsManager.aidl
@@ -18,3 +18,6 @@ package android.app;
parcelable AppOpsManager.PackageOps;
parcelable AppOpsManager.OpEntry;
+
+parcelable AppOpsManager.HistoricalPackageOps;
+parcelable AppOpsManager.HistoricalOpEntry;
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 8f82ee7d988a..8ae9f33b424c 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -17,6 +17,7 @@
package android.app;
import android.Manifest;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -26,6 +27,7 @@ import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.app.usage.UsageStatsManager;
import android.content.Context;
+import android.content.pm.ParceledListSlice;
import android.media.AudioAttributes.AttributeUsage;
import android.os.Binder;
import android.os.IBinder;
@@ -41,8 +43,11 @@ import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -138,22 +143,38 @@ public class AppOpsManager {
"foreground", // MODE_FOREGROUND
};
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, prefix = { "UID_STATE_" }, value = {
+ UID_STATE_PERSISTENT,
+ UID_STATE_TOP,
+ UID_STATE_FOREGROUND_SERVICE,
+ UID_STATE_FOREGROUND,
+ UID_STATE_BACKGROUND,
+ UID_STATE_CACHED
+ })
+ public @interface UidState {}
+
/**
* Metrics about an op when its uid is persistent.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_PERSISTENT = 0;
/**
* Metrics about an op when its uid is at the top.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_TOP = 1;
/**
* Metrics about an op when its uid is running a foreground service.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_FOREGROUND_SERVICE = 2;
/**
@@ -166,18 +187,21 @@ public class AppOpsManager {
* Metrics about an op when its uid is in the foreground for any other reasons.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_FOREGROUND = 3;
/**
* Metrics about an op when its uid is in the background for any reason.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_BACKGROUND = 4;
/**
* Metrics about an op when its uid is cached.
* @hide
*/
+ @SystemApi
public static final int UID_STATE_CACHED = 5;
/**
@@ -1284,13 +1308,13 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED, // POST_NOTIFICATION
AppOpsManager.MODE_ALLOWED, // NEIGHBORING_CELLS
AppOpsManager.MODE_ALLOWED, // CALL_PHONE
- AppOpsManager.MODE_DEFAULT, // READ_SMS
- AppOpsManager.MODE_DEFAULT, // WRITE_SMS
- AppOpsManager.MODE_DEFAULT, // RECEIVE_SMS
+ AppOpsManager.MODE_ALLOWED, // READ_SMS
+ AppOpsManager.MODE_IGNORED, // WRITE_SMS
+ AppOpsManager.MODE_ALLOWED, // RECEIVE_SMS
AppOpsManager.MODE_ALLOWED, // RECEIVE_EMERGENCY_BROADCAST
AppOpsManager.MODE_ALLOWED, // RECEIVE_MMS
- AppOpsManager.MODE_DEFAULT, // RECEIVE_WAP_PUSH
- AppOpsManager.MODE_DEFAULT, // SEND_SMS
+ AppOpsManager.MODE_ALLOWED, // RECEIVE_WAP_PUSH
+ AppOpsManager.MODE_ALLOWED, // SEND_SMS
AppOpsManager.MODE_ALLOWED, // READ_ICC_SMS
AppOpsManager.MODE_ALLOWED, // WRITE_ICC_SMS
AppOpsManager.MODE_DEFAULT, // WRITE_SETTINGS
@@ -1327,7 +1351,7 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED, // PROCESS_OUTGOING_CALLS
AppOpsManager.MODE_ALLOWED, // USE_FINGERPRINT
AppOpsManager.MODE_ALLOWED, // BODY_SENSORS
- AppOpsManager.MODE_DEFAULT, // READ_CELL_BROADCASTS
+ AppOpsManager.MODE_ALLOWED, // READ_CELL_BROADCASTS
AppOpsManager.MODE_ERRORED, // MOCK_LOCATION
AppOpsManager.MODE_ALLOWED, // READ_EXTERNAL_STORAGE
AppOpsManager.MODE_ALLOWED, // WRITE_EXTERNAL_STORAGE
@@ -1883,6 +1907,377 @@ public class AppOpsManager {
}
/**
+ * This class represents historical app op information about a package. The history
+ * is aggregated information about ops for a certain amount of time such
+ * as the times the op was accessed, the times the op was rejected, the total
+ * duration the app op has been accessed.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final class HistoricalPackageOps implements Parcelable {
+ private final int mUid;
+ private final @NonNull String mPackageName;
+ private final @NonNull List<HistoricalOpEntry> mEntries;
+
+ /**
+ * @hide
+ */
+ public HistoricalPackageOps(int uid, @NonNull String packageName) {
+ mUid = uid;
+ mPackageName = packageName;
+ mEntries = new ArrayList<>();
+ }
+
+ HistoricalPackageOps(@NonNull Parcel parcel) {
+ mUid = parcel.readInt();
+ mPackageName = parcel.readString();
+ mEntries = parcel.createTypedArrayList(HistoricalOpEntry.CREATOR);
+ }
+
+ /**
+ * @hide
+ */
+ public void addEntry(@NonNull HistoricalOpEntry entry) {
+ mEntries.add(entry);
+ }
+
+ /**
+ * Gets the package name which the data represents.
+ *
+ * @return The package name which the data represents.
+ */
+ public @NonNull String getPackageName() {
+ return mPackageName;
+ }
+
+ /**
+ * Gets the UID which the data represents.
+ *
+ * @return The UID which the data represents.
+ */
+ public int getUid() {
+ return mUid;
+ }
+
+ /**
+ * Gets number historical app op entries.
+ *
+ * @return The number historical app op entries.
+ *
+ * @see #getEntryAt(int)
+ */
+ public int getEntryCount() {
+ return mEntries.size();
+ }
+
+ /**
+ * Gets the historical at a given index.
+ *
+ * @param index The index to lookup.
+ *
+ * @return The entry at the given index.
+ *
+ * @see #getEntryCount()
+ */
+ public @NonNull HistoricalOpEntry getEntryAt(int index) {
+ return mEntries.get(index);
+ }
+
+ /**
+ * Gets the historical entry for a given op name.
+ *
+ * @param opName The op name.
+ *
+ * @return The historical entry for that op name.
+ */
+ public @Nullable HistoricalOpEntry getEntry(@NonNull String opName) {
+ final int entryCount = mEntries.size();
+ for (int i = 0; i < entryCount; i++) {
+ final HistoricalOpEntry entry = mEntries.get(i);
+ if (entry.getOp().equals(opName)) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel parcel, int flags) {
+ parcel.writeInt(mUid);
+ parcel.writeString(mPackageName);
+ parcel.writeTypedList(mEntries, flags);
+ }
+
+ public static final Creator<HistoricalPackageOps> CREATOR =
+ new Creator<HistoricalPackageOps>() {
+ @Override
+ public @NonNull HistoricalPackageOps createFromParcel(@NonNull Parcel parcel) {
+ return new HistoricalPackageOps(parcel);
+ }
+
+ @Override
+ public @NonNull HistoricalPackageOps[] newArray(int size) {
+ return new HistoricalPackageOps[size];
+ }
+ };
+ }
+
+ /**
+ * This class represents historical information about an app op. The history
+ * is aggregated information about the op for a certain amount of time such
+ * as the times the op was accessed, the times the op was rejected, the total
+ * duration the app op has been accessed.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final class HistoricalOpEntry implements Parcelable {
+ private final int mOp;
+ private final long[] mAccessCount;
+ private final long[] mRejectCount;
+ private final long[] mAccessDuration;
+
+ /**
+ * @hide
+ */
+ public HistoricalOpEntry(int op) {
+ mOp = op;
+ mAccessCount = new long[_NUM_UID_STATE];
+ mRejectCount = new long[_NUM_UID_STATE];
+ mAccessDuration = new long[_NUM_UID_STATE];
+ }
+
+ HistoricalOpEntry(@NonNull Parcel parcel) {
+ mOp = parcel.readInt();
+ mAccessCount = parcel.createLongArray();
+ mRejectCount = parcel.createLongArray();
+ mAccessDuration = parcel.createLongArray();
+ }
+
+ /**
+ * @hide
+ */
+ public void addEntry(@UidState int uidState, long accessCount,
+ long rejectCount, long accessDuration) {
+ mAccessCount[uidState] = accessCount;
+ mRejectCount[uidState] = rejectCount;
+ mAccessDuration[uidState] = accessDuration;
+ }
+
+ /**
+ * Gets the op name.
+ *
+ * @return The op name.
+ */
+ public @NonNull String getOp() {
+ return sOpToString[mOp];
+ }
+
+ /**
+ * Gets the number times the op was accessed (performed) in the foreground.
+ *
+ * @return The times the op was accessed in the foreground.
+ *
+ * @see #getBackgroundAccessCount()
+ * @see #getAccessCount(int)
+ */
+ public long getForegroundAccessCount() {
+ return sum(mAccessCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ }
+
+ /**
+ * Gets the number times the op was accessed (performed) in the background.
+ *
+ * @return The times the op was accessed in the background.
+ *
+ * @see #getForegroundAccessCount()
+ * @see #getAccessCount(int)
+ */
+ public long getBackgroundAccessCount() {
+ return sum(mAccessCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ }
+
+ /**
+ * Gets the number times the op was accessed (performed) for a given uid state.
+ *
+ * @param uidState The UID state for which to query. Could be one of
+ * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+ * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
+ * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ *
+ * @return The times the op was accessed for the given UID state.
+ *
+ * @see #getForegroundAccessCount()
+ * @see #getBackgroundAccessCount()
+ */
+ public long getAccessCount(@UidState int uidState) {
+ return mAccessCount[uidState];
+ }
+
+ /**
+ * Gets the number times the op was rejected in the foreground.
+ *
+ * @return The times the op was rejected in the foreground.
+ *
+ * @see #getBackgroundRejectCount()
+ * @see #getRejectCount(int)
+ */
+ public long getForegroundRejectCount() {
+ return sum(mRejectCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ }
+
+ /**
+ * Gets the number times the op was rejected in the background.
+ *
+ * @return The times the op was rejected in the background.
+ *
+ * @see #getForegroundRejectCount()
+ * @see #getRejectCount(int)
+ */
+ public long getBackgroundRejectCount() {
+ return sum(mRejectCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ }
+
+ /**
+ * Gets the number times the op was rejected for a given uid state.
+ *
+ * @param uidState The UID state for which to query. Could be one of
+ * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+ * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
+ * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ *
+ * @return The times the op was rejected for the given UID state.
+ *
+ * @see #getForegroundRejectCount()
+ * @see #getBackgroundRejectCount()
+ */
+ public long getRejectCount(@UidState int uidState) {
+ return mRejectCount[uidState];
+ }
+
+ /**
+ * Gets the total duration the app op was accessed (performed) in the foreground.
+ *
+ * @return The total duration the app op was accessed in the foreground.
+ *
+ * @see #getBackgroundAccessDuration()
+ * @see #getAccessDuration(int)
+ */
+ public long getForegroundAccessDuration() {
+ return sum(mAccessDuration, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ }
+
+ /**
+ * Gets the total duration the app op was accessed (performed) in the background.
+ *
+ * @return The total duration the app op was accessed in the background.
+ *
+ * @see #getForegroundAccessDuration()
+ * @see #getAccessDuration(int)
+ */
+ public long getBackgroundAccessDuration() {
+ return sum(mAccessDuration, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ }
+
+ /**
+ * Gets the total duration the app op was accessed (performed) for a given UID state.
+ *
+ * @param uidState The UID state for which to query. Could be one of
+ * {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
+ * {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
+ * {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ *
+ * @return The total duration the app op was accessed for the given UID state.
+ *
+ * @see #getForegroundAccessDuration()
+ * @see #getBackgroundAccessDuration()
+ */
+ public long getAccessDuration(@UidState int uidState) {
+ return mAccessDuration[uidState];
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mOp);
+ parcel.writeLongArray(mAccessCount);
+ parcel.writeLongArray(mRejectCount);
+ parcel.writeLongArray(mAccessDuration);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+ final HistoricalOpEntry otherInstance = (HistoricalOpEntry) other;
+ if (mOp != otherInstance.mOp) {
+ return false;
+ }
+ if (!Arrays.equals(mAccessCount, otherInstance.mAccessCount)) {
+ return false;
+ }
+ if (!Arrays.equals(mRejectCount, otherInstance.mRejectCount)) {
+ return false;
+ }
+ return Arrays.equals(mAccessDuration, otherInstance.mAccessDuration);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mOp;
+ result = 31 * result + Arrays.hashCode(mAccessCount);
+ result = 31 * result + Arrays.hashCode(mRejectCount);
+ result = 31 * result + Arrays.hashCode(mAccessDuration);
+ return result;
+ }
+
+ /**
+ *
+ * Computes the sum given the start and end index.
+ *
+ * @param counts The data array.
+ * @param start The start index (inclusive)
+ * @param end The end index (exclusive)
+ * @return The sum.
+ */
+ private static long sum(@NonNull long[] counts, int start, int end) {
+ long totalCount = 0;
+ for (int i = start; i <= end; i++) {
+ totalCount += counts[i];
+ }
+ return totalCount;
+ }
+
+ public static final Creator<HistoricalOpEntry> CREATOR = new Creator<HistoricalOpEntry>() {
+ @Override
+ public @NonNull HistoricalOpEntry createFromParcel(@NonNull Parcel source) {
+ return new HistoricalOpEntry(source);
+ }
+
+ @Override
+ public @NonNull HistoricalOpEntry[] newArray(int size) {
+ return new HistoricalOpEntry[size];
+ }
+ };
+ }
+
+ /**
* Callback for notification of changes to operation state.
*/
public interface OnOpChangedListener {
@@ -1957,6 +2352,74 @@ public class AppOpsManager {
}
/**
+ * Retrieve historical app op stats for a package.
+ *
+ * @param uid The UID to query for.
+ * @param packageName The package to query for.
+ * @param beginTimeMillis The beginning of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be non
+ * negative.
+ * @param endTimeMillis The end of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be after
+ * {@code beginTimeMillis}.
+ * @param opNames The ops to query for. Pass {@code null} for all ops.
+ *
+ * @return The historical ops or {@code null} if there are no ops for this package.
+ *
+ * @throws IllegalArgumentException If any of the argument contracts is violated.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
+ public @Nullable HistoricalPackageOps getHistoricalPackagesOps(
+ int uid, @NonNull String packageName, @Nullable String[] opNames,
+ long beginTimeMillis, long endTimeMillis) {
+ try {
+ return mService.getHistoricalPackagesOps(uid, packageName, opNames,
+ beginTimeMillis, endTimeMillis);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve historical app op stats for all packages.
+ *
+ * @param beginTimeMillis The beginning of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be non
+ * negative.
+ * @param endTimeMillis The end of the interval in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian). Must be after
+ * {@code beginTimeMillis}.
+ * @param opNames The ops to query for. Pass {@code null} for all ops.
+ *
+ * @return The historical ops or an empty list if there are no ops for any package.
+ *
+ * @throws IllegalArgumentException If any of the argument contracts is violated.
+ *
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
+ public @NonNull List<HistoricalPackageOps> getAllHistoricPackagesOps(
+ @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis) {
+ try {
+ @SuppressWarnings("unchecked")
+ final ParceledListSlice<HistoricalPackageOps> payload =
+ mService.getAllHistoricalPackagesOps(opNames, beginTimeMillis, endTimeMillis);
+ if (payload != null) {
+ return payload.getList();
+ }
+ return Collections.emptyList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Sets given app op in the specified mode for app ops in the UID.
* This applies to all apps currently in the UID or installed in
* this UID in the future.
diff --git a/core/java/android/app/AutomaticZenRule.java b/core/java/android/app/AutomaticZenRule.java
index 62f6bac2a24f..9d68133c01da 100644
--- a/core/java/android/app/AutomaticZenRule.java
+++ b/core/java/android/app/AutomaticZenRule.java
@@ -151,7 +151,7 @@ public final class AutomaticZenRule implements Parcelable {
* Gets the zen policy.
*/
public ZenPolicy getZenPolicy() {
- return this.mZenPolicy.copy();
+ return mZenPolicy == null ? null : this.mZenPolicy.copy();
}
/**
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 357420bd0217..bd9cf6dda7ff 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -146,6 +146,7 @@ interface INotificationManager
int getZenMode();
ZenModeConfig getZenModeConfig();
+ NotificationManager.Policy getConsolidatedNotificationPolicy();
oneway void setZenMode(int mode, in Uri conditionId, String reason);
oneway void notifyConditions(String pkg, in IConditionProvider provider, in Condition[] conditions);
boolean isNotificationPolicyAccessGranted(String pkg);
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 3f07024d1e5a..89ec19bbc6dd 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -825,6 +825,18 @@ public class NotificationManager {
/**
* @hide
*/
+ public NotificationManager.Policy getConsolidatedNotificationPolicy() {
+ INotificationManager service = getService();
+ try {
+ return service.getConsolidatedNotificationPolicy();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @hide
+ */
public int getRuleInstanceCount(ComponentName owner) {
INotificationManager service = getService();
try {
@@ -1062,7 +1074,7 @@ public class NotificationManager {
}
/**
- * Gets the current notification policy.
+ * Gets the current user-specified default notification policy.
*
* <p>
*/
@@ -1621,6 +1633,71 @@ public class NotificationManager {
return new Policy[size];
}
};
+
+ /** @hide **/
+ public boolean allowAlarms() {
+ return (priorityCategories & PRIORITY_CATEGORY_ALARMS) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowMedia() {
+ return (priorityCategories & PRIORITY_CATEGORY_MEDIA) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowSystem() {
+ return (priorityCategories & PRIORITY_CATEGORY_SYSTEM) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowRepeatCallers() {
+ return (priorityCategories & PRIORITY_CATEGORY_REPEAT_CALLERS) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowCalls() {
+ return (priorityCategories & PRIORITY_CATEGORY_CALLS) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowMessages() {
+ return (priorityCategories & PRIORITY_CATEGORY_MESSAGES) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowEvents() {
+ return (priorityCategories & PRIORITY_CATEGORY_EVENTS) != 0;
+ }
+
+ /** @hide **/
+ public boolean allowReminders() {
+ return (priorityCategories & PRIORITY_CATEGORY_REMINDERS) != 0;
+ }
+
+ /** @hide **/
+ public int allowCallsFrom() {
+ return priorityCallSenders;
+ }
+
+ /** @hide **/
+ public int allowMessagesFrom() {
+ return priorityMessageSenders;
+ }
+
+ /**
+ * returns a deep copy of this policy
+ * @hide
+ */
+ public Policy copy() {
+ final Parcel parcel = Parcel.obtain();
+ try {
+ writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ return new Policy(parcel);
+ } finally {
+ parcel.recycle();
+ }
+ }
}
/**
@@ -1708,5 +1785,4 @@ public class NotificationManager {
default: return defValue;
}
}
-
}
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 77cebc8f408d..508ea3b40cce 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -48,6 +48,8 @@ import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
+import android.debug.AdbManager;
+import android.debug.IAdbManager;
import android.hardware.ConsumerIrManager;
import android.hardware.ISerialManager;
import android.hardware.SensorManager;
@@ -583,6 +585,15 @@ final class SystemServiceRegistry {
return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
}});
+ registerService(Context.ADB_SERVICE, AdbManager.class,
+ new CachedServiceFetcher<AdbManager>() {
+ @Override
+ public AdbManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(Context.ADB_SERVICE);
+ return new AdbManager(ctx, IAdbManager.Stub.asInterface(b));
+ }});
+
registerService(Context.SERIAL_SERVICE, SerialManager.class,
new CachedServiceFetcher<SerialManager>() {
@Override
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 92daf08dc59b..f129a717f2cd 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3845,6 +3845,11 @@ public class DevicePolicyManager {
public static final int KEYGUARD_DISABLE_IRIS = 1 << 8;
/**
+ * NOTE: Please remember to update the DevicePolicyManagerTest's testKeyguardDisabledFeatures
+ * CTS test when adding to the list above.
+ */
+
+ /**
* Disable all biometric authentication on keyguard secure screens (e.g. PIN/Pattern/Password).
*/
public static final int KEYGUARD_DISABLE_BIOMETRICS =
diff --git a/core/java/android/app/role/IRoleManager.aidl b/core/java/android/app/role/IRoleManager.aidl
index 64f69c182f78..2cf13ec24141 100644
--- a/core/java/android/app/role/IRoleManager.aidl
+++ b/core/java/android/app/role/IRoleManager.aidl
@@ -36,4 +36,8 @@ interface IRoleManager {
in IRoleManagerCallback callback);
void clearRoleHoldersAsUser(in String roleName, int userId, in IRoleManagerCallback callback);
+
+ boolean addRoleHolderFromController(in String roleName, in String packageName);
+
+ boolean removeRoleHolderFromController(in String roleName, in String packageName);
}
diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java
index f7c6dea21e85..ed27d9fe9fd4 100644
--- a/core/java/android/app/role/RoleManager.java
+++ b/core/java/android/app/role/RoleManager.java
@@ -22,19 +22,16 @@ import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
-import android.util.ArraySet;
import com.android.internal.util.Preconditions;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.Executor;
/**
@@ -51,8 +48,8 @@ import java.util.concurrent.Executor;
* role holders. To qualify for a role, an application must meet certain requirements, including
* defining certain components in its manifest. These requirements can be found in the AndroidX
* Libraries. Then the application will need user consent to become a role holder, which can be
- * requested using {@link Activity#startActivityForResult(Intent, int)} with the {@code Intent}
- * obtained from {@link #createRequestRoleIntent(String)}.
+ * requested using {@link android.app.Activity#startActivityForResult(Intent, int)} with the
+ * {@code Intent} obtained from {@link #createRequestRoleIntent(String)}.
* <p>
* Upon becoming a role holder, the application may be granted certain privileges that are role
* specific. When the application loses its role, these privileges will also be revoked.
@@ -89,6 +86,14 @@ public final class RoleManager {
@SystemApi
public static final String EXTRA_REQUEST_ROLE_NAME = "android.app.role.extra.REQUEST_ROLE_NAME";
+ /**
+ * The permission required to manage records of role holders in {@link RoleManager} directly.
+ *
+ * @hide
+ */
+ public static final String PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER =
+ "com.android.permissioncontroller.permission.MANAGE_ROLE_HOLDERS_FROM_CONTROLLER";
+
@NonNull
private final Context mContext;
@@ -105,11 +110,13 @@ public final class RoleManager {
}
/**
- * Returns an {@code Intent} suitable for passing to {@link Activity#startActivityForResult(
- * Intent, int)} which prompts the user to grant a role to this application.
+ * Returns an {@code Intent} suitable for passing to
+ * {@link android.app.Activity#startActivityForResult(Intent, int)} which prompts the user to
+ * grant a role to this application.
* <p>
- * If the role is granted, the {@code resultCode} will be {@link Activity#RESULT_OK}, otherwise
- * it will be {@link Activity#RESULT_CANCELED}.
+ * If the role is granted, the {@code resultCode} will be
+ * {@link android.app.Activity#RESULT_OK}, otherwise it will be
+ * {@link android.app.Activity#RESULT_CANCELED}.
*
* @param roleName the name of requested role
*
@@ -165,14 +172,37 @@ public final class RoleManager {
/**
* Get package names of the applications holding the role.
* <p>
- * <strong>Note: </strong>Using this API requires holding
+ * <strong>Note:</strong> Using this API requires holding
+ * {@code android.permission.MANAGE_ROLE_HOLDERS}.
+ *
+ * @param roleName the name of the role to get the role holder for
+ *
+ * @return a list of package names of the role holders, or an empty list if none.
+ *
+ * @throws IllegalArgumentException if the role name is {@code null} or empty.
+ *
+ * @see #getRoleHoldersAsUser(String, UserHandle)
+ *
+ * @hide
+ */
+ @NonNull
+ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
+ @SystemApi
+ public List<String> getRoleHolders(@NonNull String roleName) {
+ return getRoleHoldersAsUser(roleName, UserHandle.of(UserHandle.getCallingUserId()));
+ }
+
+ /**
+ * Get package names of the applications holding the role.
+ * <p>
+ * <strong>Note:</strong> Using this API requires holding
* {@code android.permission.MANAGE_ROLE_HOLDERS} and if the user id is not the current user
* {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
* @param roleName the name of the role to get the role holder for
* @param user the user to get the role holder for
*
- * @return the package name of the role holder, or {@code null} if none.
+ * @return a list of package names of the role holders, or an empty list if none.
*
* @throws IllegalArgumentException if the role name is {@code null} or empty.
*
@@ -185,23 +215,21 @@ public final class RoleManager {
@NonNull
@RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
@SystemApi
- public Set<String> getRoleHoldersAsUser(@NonNull String roleName, @NonNull UserHandle user) {
+ public List<String> getRoleHoldersAsUser(@NonNull String roleName, @NonNull UserHandle user) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
Preconditions.checkNotNull(user, "user cannot be null");
- List<String> roleHolders;
try {
- roleHolders = mService.getRoleHoldersAsUser(roleName, user.getIdentifier());
+ return mService.getRoleHoldersAsUser(roleName, user.getIdentifier());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
- return new ArraySet<>(roleHolders);
}
/**
* Add a specific application to the holders of a role. If the role is exclusive, the previous
* holder will be replaced.
* <p>
- * <strong>Note: </strong>Using this API requires holding
+ * <strong>Note:</strong> Using this API requires holding
* {@code android.permission.MANAGE_ROLE_HOLDERS} and if the user id is not the current user
* {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
@@ -240,7 +268,7 @@ public final class RoleManager {
/**
* Remove a specific application from the holders of a role.
* <p>
- * <strong>Note: </strong>Using this API requires holding
+ * <strong>Note:</strong> Using this API requires holding
* {@code android.permission.MANAGE_ROLE_HOLDERS} and if the user id is not the current user
* {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
@@ -279,7 +307,7 @@ public final class RoleManager {
/**
* Remove all holders of a role.
* <p>
- * <strong>Note: </strong>Using this API requires holding
+ * <strong>Note:</strong> Using this API requires holding
* {@code android.permission.MANAGE_ROLE_HOLDERS} and if the user id is not the current user
* {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
@@ -312,6 +340,74 @@ public final class RoleManager {
}
}
+ /**
+ * Add a specific application to the holders of a role, only modifying records inside
+ * {@link RoleManager}. Should only be called from
+ * {@link android.rolecontrollerservice.RoleControllerService}.
+ * <p>
+ * <strong>Note:</strong> Using this API requires holding
+ * {@link #PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER}.
+ *
+ * @param roleName the name of the role to add the role holder for
+ * @param packageName the package name of the application to add to the role holders
+ *
+ * @return whether the operation was successful, and will also be {@code true} if a matching
+ * role holder is already found.
+ *
+ * @throws IllegalArgumentException if the role name or package name is {@code null} or empty.
+ *
+ * @see #getRoleHolders(String)
+ * @see #removeRoleHolderFromController(String, String)
+ *
+ * @hide
+ */
+ @RequiresPermission(PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER)
+ @SystemApi
+ public boolean addRoleHolderFromController(@NonNull String roleName,
+ @NonNull String packageName) {
+ Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+ try {
+ return mService.addRoleHolderFromController(roleName, packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Remove a specific application from the holders of a role, only modifying records inside
+ * {@link RoleManager}. Should only be called from
+ * {@link android.rolecontrollerservice.RoleControllerService}.
+ * <p>
+ * <strong>Note:</strong> Using this API requires holding
+ * {@link #PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER}.
+ *
+ * @param roleName the name of the role to remove the role holder for
+ * @param packageName the package name of the application to remove from the role holders
+ *
+ * @return whether the operation was successful, and will also be {@code true} if no matching
+ * role holder was found to remove.
+ *
+ * @throws IllegalArgumentException if the role name or package name is {@code null} or empty.
+ *
+ * @see #getRoleHolders(String)
+ * @see #addRoleHolderFromController(String, String)
+ *
+ * @hide
+ */
+ @RequiresPermission(PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER)
+ @SystemApi
+ public boolean removeRoleHolderFromController(@NonNull String roleName,
+ @NonNull String packageName) {
+ Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+ try {
+ return mService.removeRoleHolderFromController(roleName, packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private static class RoleManagerCallbackDelegate extends IRoleManagerCallback.Stub {
@NonNull
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index 971352783dcb..4d52263c1d78 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -51,4 +51,8 @@ interface IUsageStatsManager {
void registerAppUsageObserver(int observerId, in String[] packages, long timeLimitMs,
in PendingIntent callback, String callingPackage);
void unregisterAppUsageObserver(int observerId, String callingPackage);
+ void registerUsageSessionObserver(int sessionObserverId, in String[] observed, long timeLimitMs,
+ long sessionThresholdTimeMs, in PendingIntent limitReachedCallbackIntent,
+ in PendingIntent sessionEndCallbackIntent, String callingPackage);
+ void unregisterUsageSessionObserver(int sessionObserverId, String callingPackage);
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index dbb00eb5c288..6d7400e0ef73 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -18,6 +18,7 @@ package android.app.usage;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -595,7 +596,7 @@ public final class UsageStatsManager {
* exceeded by the group of apps. The delivered Intent will also contain
* the extras {@link #EXTRA_OBSERVER_ID}, {@link #EXTRA_TIME_LIMIT} and
* {@link #EXTRA_TIME_USED}. Cannot be null.
- * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission or
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission and
* is not the profile owner of this user.
*/
@SystemApi
@@ -616,7 +617,7 @@ public final class UsageStatsManager {
* to any observer registered by this application. Unregistering an observer that was already
* unregistered or never registered will have no effect.
* @param observerId The id of the observer that was previously registered.
- * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission or is
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission and is
* not the profile owner of this user.
*/
@SystemApi
@@ -629,6 +630,81 @@ public final class UsageStatsManager {
}
}
+ /**
+ * Register a usage session observer that receives a callback on the provided {@code
+ * limitReachedCallbackIntent} when the sum of usages of apps in the packages array exceeds
+ * the {@code timeLimit} specified within a usage session. After the {@code timeLimit} has
+ * been reached, the usage session observer will receive a callback on the provided {@code
+ * sessionEndCallbackIntent} when the usage session ends. Registering another session
+ * observer against a {@code sessionObserverId} that has already been registered will
+ * override the previous session observer.
+ *
+ * @param sessionObserverId A unique id associated with the group of apps to be
+ * monitored. There can be multiple groups with common
+ * packages and different time limits.
+ * @param packages The list of packages to observe for foreground activity time. Cannot be null
+ * and must include at least one package.
+ * @param timeLimit The total time the set of apps can be used continuously before the {@code
+ * limitReachedCallbackIntent} is delivered. Must be at least one minute.
+ * @param timeUnit The unit for time specified in {@code timeLimit}. Cannot be null.
+ * @param sessionThresholdTime The time that can take place between usage sessions before the
+ * next session is considered a new session. Must be non-negative.
+ * @param sessionThresholdTimeUnit The unit for time specified in {@code sessionThreshold}.
+ * Cannot be null.
+ * @param limitReachedCallbackIntent The {@link PendingIntent} that will be dispatched when the
+ * time limit is exceeded by the group of apps. The delivered
+ * Intent will also contain the extras {@link
+ * #EXTRA_OBSERVER_ID}, {@link #EXTRA_TIME_LIMIT} and {@link
+ * #EXTRA_TIME_USED}. Cannot be null.
+ * @param sessionEndCallbackIntent The {@link PendingIntent} that will be dispatched when the
+ * session has ended after the time limit has been exceeded. The
+ * session is considered at its end after the {@code observed}
+ * usage has stopped and an additional {@code
+ * sessionThresholdTime} has passed. The delivered Intent will
+ * also contain the extras {@link #EXTRA_OBSERVER_ID} and {@link
+ * #EXTRA_TIME_USED}. Can be null.
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission and
+ * is not the profile owner of this user.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
+ public void registerUsageSessionObserver(int sessionObserverId, @NonNull String[] packages,
+ long timeLimit, @NonNull TimeUnit timeUnit, long sessionThresholdTime,
+ @NonNull TimeUnit sessionThresholdTimeUnit,
+ @NonNull PendingIntent limitReachedCallbackIntent,
+ @Nullable PendingIntent sessionEndCallbackIntent) {
+ try {
+ mService.registerUsageSessionObserver(sessionObserverId, packages,
+ timeUnit.toMillis(timeLimit),
+ sessionThresholdTimeUnit.toMillis(sessionThresholdTime),
+ limitReachedCallbackIntent, sessionEndCallbackIntent,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Unregister the usage session observer specified by the {@code sessionObserverId}. This will
+ * only apply to any app session observer registered by this application. Unregistering an
+ * observer that was already unregistered or never registered will have no effect.
+ *
+ * @param sessionObserverId The id of the observer that was previously registered.
+ * @throws SecurityException if the caller doesn't have the OBSERVE_APP_USAGE permission and
+ * is not the profile owner of this user.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE)
+ public void unregisterUsageSessionObserver(int sessionObserverId) {
+ try {
+ mService.unregisterUsageSessionObserver(sessionObserverId, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public static String reasonToString(int standbyReason) {
StringBuilder sb = new StringBuilder();
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index a9187b65a359..c6e94c722531 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -17,8 +17,12 @@
package android.appwidget;
import android.annotation.UnsupportedAppUsage;
+import android.app.Activity;
+import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
@@ -30,6 +34,7 @@ import android.os.CancellationSignal;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
+import android.util.Pair;
import android.util.SparseArray;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -44,6 +49,8 @@ import android.widget.RemoteViews.OnClickHandler;
import android.widget.RemoteViewsAdapter.RemoteAdapterConnectionCallback;
import android.widget.TextView;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.Executor;
/**
@@ -651,4 +658,39 @@ public class AppWidgetHostView extends FrameLayout {
super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AppWidgetHostView.class.getName());
}
+
+ /** @hide */
+ public ActivityOptions createSharedElementActivityOptions(
+ int[] sharedViewIds, String[] sharedViewNames, Intent fillInIntent) {
+ Context parentContext = getContext();
+ while ((parentContext instanceof ContextWrapper)
+ && !(parentContext instanceof Activity)) {
+ parentContext = ((ContextWrapper) parentContext).getBaseContext();
+ }
+ if (!(parentContext instanceof Activity)) {
+ return null;
+ }
+
+ List<Pair<View, String>> sharedElements = new ArrayList<>();
+ Bundle extras = new Bundle();
+
+ for (int i = 0; i < sharedViewIds.length; i++) {
+ View view = findViewById(sharedViewIds[i]);
+ if (view != null) {
+ sharedElements.add(Pair.create(view, sharedViewNames[i]));
+
+ extras.putParcelable(sharedViewNames[i], RemoteViews.getSourceBounds(view));
+ }
+ }
+
+ if (!sharedElements.isEmpty()) {
+ fillInIntent.putExtra(RemoteViews.EXTRA_SHARED_ELEMENT_BOUNDS, extras);
+ final ActivityOptions opts = ActivityOptions.makeSceneTransitionAnimation(
+ (Activity) parentContext,
+ sharedElements.toArray(new Pair[sharedElements.size()]));
+ opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return opts;
+ }
+ return null;
+ }
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 713cc8ba0bd2..e3788004cf5a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3967,6 +3967,18 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve a {@link
+ * Use with {@link #getSystemService} to retrieve a {@link
+ * android.debug.AdbManager} for access to ADB debug functions.
+ *
+ * @see #getSystemService(String)
+ * @see android.debug.AdbManager
+ *
+ * @hide
+ */
+ public static final String ADB_SERVICE = "adb";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a {@link
* android.hardware.SerialManager} for access to serial ports.
*
* @see #getSystemService(String)
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 5ab643cb666c..6c0fa4c4d35c 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -23,6 +23,7 @@ import android.annotation.BroadcastBehavior;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
@@ -1924,6 +1925,29 @@ public class Intent implements Parcelable, Cloneable {
public static final String ACTION_REVIEW_PERMISSION_USAGE =
"android.intent.action.REVIEW_PERMISSION_USAGE";
+ /**
+ * Activity action: Launch UI to review uses of permissions for a single app.
+ * <p>
+ * Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose
+ * permissions will be reviewed (mandatory).
+ * </p>
+ * <p>
+ * Output: Nothing.
+ * </p>
+ * <p class="note">
+ * This requires {@link android.Manifest.permission#GRANT_RUNTIME_PERMISSIONS} permission.
+ * </p>
+ *
+ * @see #EXTRA_PACKAGE_NAME
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_REVIEW_APP_PERMISSION_USAGE =
+ "android.intent.action.REVIEW_APP_PERMISSION_USAGE";
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Standard intent broadcast actions (see action variable).
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index c33f143b4cbc..6b5c6597f31d 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -635,6 +635,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public static final int PRIVATE_FLAG_USES_NON_SDK_API = 1 << 22;
+ /**
+ * Indicates whether this application can be profiled by the shell user,
+ * even when running on a device that is running in user mode.
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_PROFILEABLE_BY_SHELL = 1 << 23;
+
/** @hide */
@IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
@@ -654,6 +661,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
PRIVATE_FLAG_PRIVILEGED,
PRIVATE_FLAG_PRODUCT,
PRIVATE_FLAG_PRODUCT_SERVICES,
+ PRIVATE_FLAG_PROFILEABLE_BY_SHELL,
PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY,
PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
@@ -1929,6 +1937,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
/**
+ * Returns whether or not this application can be profiled by the shell user,
+ * even when running on a device that is running in user mode.
+ */
+ public boolean isProfileableByShell() {
+ return (privateFlags & PRIVATE_FLAG_PROFILEABLE_BY_SHELL) != 0;
+ }
+
+ /**
* Returns true if the app has declared in its manifest that it wants its split APKs to be
* loaded into isolated Contexts, with their own ClassLoaders and Resources objects.
* @hide
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 4708ea48cb6e..dc33bde7d3d7 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3547,6 +3547,8 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
false)) {
ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
+ // Debuggable implies profileable
+ ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL;
}
if (sa.getBoolean(
@@ -3913,6 +3915,14 @@ public class PackageParser {
// Dependencies for app installers; we don't currently try to
// enforce this.
XmlUtils.skipCurrentTag(parser);
+ } else if (tagName.equals("profileable")) {
+ sa = res.obtainAttributes(parser,
+ com.android.internal.R.styleable.AndroidManifestProfileable);
+ if (sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestProfileable_shell, false)) {
+ ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL;
+ }
+ XmlUtils.skipCurrentTag(parser);
} else {
if (!RIGID_PARSER) {
@@ -3929,10 +3939,13 @@ public class PackageParser {
}
}
- // Add a hidden app detail activity which forwards user to App Details page.
- Activity a = generateAppDetailsHiddenActivity(owner, flags, outError,
- owner.baseHardwareAccelerated);
- owner.activities.add(a);
+ if (TextUtils.isEmpty(owner.staticSharedLibName)) {
+ // Add a hidden app detail activity to normal apps which forwards user to App Details
+ // page.
+ Activity a = generateAppDetailsHiddenActivity(owner, flags, outError,
+ owner.baseHardwareAccelerated);
+ owner.activities.add(a);
+ }
if (hasActivityOrder) {
Collections.sort(owner.activities, (a1, a2) -> Integer.compare(a2.order, a1.order));
diff --git a/services/tests/wmtests/src/com/android/server/policy/DummyPolicyTests.java b/core/java/android/debug/AdbManager.java
index 03fb12350127..ae3d79490c98 100644
--- a/services/tests/wmtests/src/com/android/server/policy/DummyPolicyTests.java
+++ b/core/java/android/debug/AdbManager.java
@@ -14,33 +14,29 @@
* limitations under the License.
*/
-package com.android.server.policy;
+package android.debug;
-import android.platform.test.annotations.Presubmit;
-
-import org.junit.Test;
-
-import androidx.test.filters.FlakyTest;
+import android.annotation.SystemService;
+import android.content.Context;
/**
- * Dummy test for com.android.server.policy.
- * TODO(b/113800711): Remove this class once the actual tests are moved from servicestests.
+ * This class allows the control of ADB-related functions. Currently only ADB over USB is
+ * supported, and none of the API is public.
+ *
+ * @hide
*/
-public class DummyPolicyTests {
-
- @Presubmit
- @Test
- public void preSubmitTest() {}
-
- @FlakyTest
- @Presubmit
- @Test
- public void flakyPreSubmitTest() {}
-
- @Test
- public void postSubmitTest() {}
-
- @FlakyTest
- @Test
- public void flakyPostSubmitTest() {}
+@SystemService(Context.ADB_SERVICE)
+public class AdbManager {
+ private static final String TAG = "AdbManager";
+
+ private final Context mContext;
+ private final IAdbManager mService;
+
+ /**
+ * {@hide}
+ */
+ public AdbManager(Context context, IAdbManager service) {
+ mContext = context;
+ mService = service;
+ }
}
diff --git a/core/java/android/debug/AdbManagerInternal.java b/core/java/android/debug/AdbManagerInternal.java
new file mode 100644
index 000000000000..4469f0f965c3
--- /dev/null
+++ b/core/java/android/debug/AdbManagerInternal.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+/**
+ * This class allows the control of ADB-related functions that should only be called from the system
+ * server.
+ *
+ * @hide Only should be called from the system server.
+ */
+public abstract class AdbManagerInternal {
+ /**
+ * Registers a ADB transport mechanism.
+ *
+ * @param transport ADB transport interface to register
+ */
+ public abstract void registerTransport(IAdbTransport transport);
+
+ /**
+ * Unregisters a previously registered ADB transport mechanism.
+ *
+ * @param transport previously-added ADB transport interface to be removed
+ */
+ public abstract void unregisterTransport(IAdbTransport transport);
+
+ /**
+ * Returns {@code true} if ADB debugging is enabled.
+ */
+ public abstract boolean isAdbEnabled();
+}
diff --git a/core/java/android/debug/IAdbManager.aidl b/core/java/android/debug/IAdbManager.aidl
new file mode 100644
index 000000000000..79e0794fd9af
--- /dev/null
+++ b/core/java/android/debug/IAdbManager.aidl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+/**
+ * Interface to communicate remotely with the {@code AdbService} in the system server.
+ *
+ * @hide
+ */
+interface IAdbManager {
+ /**
+ * Allow ADB debugging from the attached host. If {@code alwaysAllow} is
+ * {@code true}, add {@code publicKey} to list of host keys that the
+ * user has approved.
+ *
+ * @param alwaysAllow if true, add permanently to list of allowed keys
+ * @param publicKey RSA key in mincrypt format and Base64-encoded
+ */
+ void allowDebugging(boolean alwaysAllow, String publicKey);
+
+ /**
+ * Deny ADB debugging from the attached host.
+ */
+ void denyDebugging();
+
+ /**
+ * Clear all public keys installed for secure ADB debugging.
+ */
+ void clearDebuggingKeys();
+}
diff --git a/core/java/android/debug/IAdbTransport.aidl b/core/java/android/debug/IAdbTransport.aidl
new file mode 100644
index 000000000000..77211fc93693
--- /dev/null
+++ b/core/java/android/debug/IAdbTransport.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+/** @hide */
+interface IAdbTransport {
+ void onAdbEnabled(boolean enabled);
+}
diff --git a/core/java/android/hardware/location/ContextHubIntentEvent.java b/core/java/android/hardware/location/ContextHubIntentEvent.java
new file mode 100644
index 000000000000..96e74969a2e8
--- /dev/null
+++ b/core/java/android/hardware/location/ContextHubIntentEvent.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.location;
+
+import android.annotation.NonNull;
+import android.app.PendingIntent;
+import android.content.Intent;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * A helper class to retrieve information about a Intent event received for a PendingIntent
+ * registered through {@link ContextHubClient.registerIntent(PendingIntent, long)}. This object
+ * can only be created through the factory method {@link ContextHubIntentEvent.fromIntent(Intent)}.
+ *
+ * @hide
+ */
+public class ContextHubIntentEvent {
+ @ContextHubManager.Event private final int mEventType;
+
+ @NonNull private final ContextHubInfo mContextHubInfo;
+
+ private final long mNanoAppId;
+
+ private final NanoAppMessage mNanoAppMessage;
+
+ private final int mNanoAppAbortCode;
+
+ private ContextHubIntentEvent(
+ @NonNull ContextHubInfo contextHubInfo, @ContextHubManager.Event int eventType,
+ long nanoAppId, NanoAppMessage nanoAppMessage, int nanoAppAbortCode) {
+ mContextHubInfo = contextHubInfo;
+ mEventType = eventType;
+ mNanoAppId = nanoAppId;
+ mNanoAppMessage = nanoAppMessage;
+ mNanoAppAbortCode = nanoAppAbortCode;
+ }
+
+ private ContextHubIntentEvent(
+ @NonNull ContextHubInfo contextHubInfo, @ContextHubManager.Event int eventType) {
+ this(contextHubInfo, eventType, -1 /* nanoAppId */, null /* nanoAppMessage */,
+ -1 /* nanoAppAbortCode */);
+ }
+
+ private ContextHubIntentEvent(
+ @NonNull ContextHubInfo contextHubInfo, @ContextHubManager.Event int eventType,
+ long nanoAppId) {
+ this(contextHubInfo, eventType, nanoAppId, null /* nanoAppMessage */,
+ -1 /* nanoAppAbortCode */);
+ }
+
+ private ContextHubIntentEvent(
+ @NonNull ContextHubInfo contextHubInfo, @ContextHubManager.Event int eventType,
+ long nanoAppId, @NonNull NanoAppMessage nanoAppMessage) {
+ this(contextHubInfo, eventType, nanoAppId, nanoAppMessage, -1 /* nanoAppAbortCode */);
+ }
+
+ private ContextHubIntentEvent(
+ @NonNull ContextHubInfo contextHubInfo, @ContextHubManager.Event int eventType,
+ long nanoAppId, int nanoAppAbortCode) {
+ this(contextHubInfo, eventType, nanoAppId, null /* nanoAppMessage */, nanoAppAbortCode);
+ }
+
+ /**
+ * Creates a ContextHubIntentEvent object from an Intent received through a PendingIntent
+ * registered through {@link ContextHubClient.registerIntent(PendingIntent, long)}.
+ *
+ * @param intent the Intent object from an Intent event
+ * @return the ContextHubIntentEvent object describing the event
+ *
+ * @throws IllegalArgumentException if the Intent was not a valid intent
+ */
+ @NonNull
+ public static ContextHubIntentEvent fromIntent(@NonNull Intent intent) {
+ Preconditions.checkNotNull(intent, "Intent cannot be null");
+
+ hasExtraOrThrow(intent, ContextHubManager.EXTRA_CONTEXT_HUB_INFO);
+ ContextHubInfo info = intent.getParcelableExtra(ContextHubManager.EXTRA_CONTEXT_HUB_INFO);
+ if (info == null) {
+ throw new IllegalArgumentException("ContextHubInfo extra was null");
+ }
+
+ int eventType = getIntExtraOrThrow(intent, ContextHubManager.EXTRA_EVENT_TYPE);
+ ContextHubIntentEvent event;
+ switch (eventType) {
+ case ContextHubManager.EVENT_NANOAPP_LOADED:
+ case ContextHubManager.EVENT_NANOAPP_UNLOADED:
+ case ContextHubManager.EVENT_NANOAPP_ENABLED:
+ case ContextHubManager.EVENT_NANOAPP_DISABLED:
+ case ContextHubManager.EVENT_NANOAPP_ABORTED:
+ case ContextHubManager.EVENT_NANOAPP_MESSAGE: // fall through
+ long nanoAppId = getLongExtraOrThrow(intent, ContextHubManager.EXTRA_NANOAPP_ID);
+ if (eventType == ContextHubManager.EVENT_NANOAPP_MESSAGE) {
+ hasExtraOrThrow(intent, ContextHubManager.EXTRA_MESSAGE);
+ NanoAppMessage message =
+ intent.getParcelableExtra(ContextHubManager.EXTRA_MESSAGE);
+ if (message == null) {
+ throw new IllegalArgumentException("NanoAppMessage extra was null");
+ }
+
+ event = new ContextHubIntentEvent(info, eventType, nanoAppId, message);
+ } else if (eventType == ContextHubManager.EVENT_NANOAPP_ABORTED) {
+ int nanoAppAbortCode = getIntExtraOrThrow(
+ intent, ContextHubManager.EXTRA_NANOAPP_ABORT_CODE);
+ event = new ContextHubIntentEvent(info, eventType, nanoAppId, nanoAppAbortCode);
+ } else {
+ event = new ContextHubIntentEvent(info, eventType, nanoAppId);
+ }
+ break;
+
+ case ContextHubManager.EVENT_HUB_RESET:
+ event = new ContextHubIntentEvent(info, eventType);
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unknown intent event type " + eventType);
+ }
+
+ return event;
+ }
+
+ /**
+ * @return the event type of this Intent event
+ */
+ @ContextHubManager.Event
+ public int getEventType() {
+ return mEventType;
+ }
+
+ /**
+ * @return the ContextHubInfo object describing the Context Hub this event was for
+ */
+ @NonNull
+ public ContextHubInfo getContextHubInfo() {
+ return mContextHubInfo;
+ }
+
+ /**
+ * @return the ID of the nanoapp this event was for
+ *
+ * @throws UnsupportedOperationException if the event did not have a nanoapp associated
+ */
+ public long getNanoAppId() {
+ if (mEventType == ContextHubManager.EVENT_HUB_RESET) {
+ throw new UnsupportedOperationException(
+ "Cannot invoke getNanoAppId() on Context Hub reset event");
+ }
+ return mNanoAppId;
+ }
+
+ /**
+ * @return the nanoapp's abort code
+ *
+ * @throws UnsupportedOperationException if this was not a nanoapp abort event
+ */
+ public int getNanoAppAbortCode() {
+ if (mEventType != ContextHubManager.EVENT_NANOAPP_ABORTED) {
+ throw new UnsupportedOperationException(
+ "Cannot invoke getNanoAppAbortCode() on non-abort event: " + mEventType);
+ }
+ return mNanoAppAbortCode;
+ }
+
+ /**
+ * @return the message from a nanoapp
+ *
+ * @throws UnsupportedOperationException if this was not a nanoapp message event
+ */
+ @NonNull
+ public NanoAppMessage getNanoAppMessage() {
+ if (mEventType != ContextHubManager.EVENT_NANOAPP_MESSAGE) {
+ throw new UnsupportedOperationException(
+ "Cannot invoke getNanoAppMessage() on non-message event: " + mEventType);
+ }
+ return mNanoAppMessage;
+ }
+
+ @Override
+ public String toString() {
+ String out = "ContextHubIntentEvent[eventType = " + mEventType
+ + ", contextHubId = " + mContextHubInfo.getId();
+
+ if (mEventType != ContextHubManager.EVENT_HUB_RESET) {
+ out += ", nanoAppId = 0x" + Long.toHexString(mNanoAppId);
+ }
+ if (mEventType == ContextHubManager.EVENT_NANOAPP_ABORTED) {
+ out += ", nanoAppAbortCode = " + mNanoAppAbortCode;
+ }
+ if (mEventType == ContextHubManager.EVENT_NANOAPP_MESSAGE) {
+ out += ", nanoAppMessage = " + mNanoAppMessage;
+ }
+
+ return out + "]";
+ }
+
+ private static void hasExtraOrThrow(Intent intent, String extra) {
+ if (!intent.hasExtra(extra)) {
+ throw new IllegalArgumentException("Intent did not have extra: " + extra);
+ }
+ }
+
+ private static int getIntExtraOrThrow(Intent intent, String extra) {
+ hasExtraOrThrow(intent, extra);
+ return intent.getIntExtra(extra, -1 /* defaultValue */);
+ }
+
+ private static long getLongExtraOrThrow(Intent intent, String extra) {
+ hasExtraOrThrow(intent, extra);
+ return intent.getLongExtra(extra, -1 /* defaultValue */);
+ }
+}
diff --git a/core/java/android/hardware/location/IContextHubClient.aidl b/core/java/android/hardware/location/IContextHubClient.aidl
index 7559cd597736..b53941491c24 100644
--- a/core/java/android/hardware/location/IContextHubClient.aidl
+++ b/core/java/android/hardware/location/IContextHubClient.aidl
@@ -31,8 +31,8 @@ interface IContextHubClient {
void close();
// Registers a PendingIntent with the client
- boolean registerIntent(in PendingIntent intent, long nanoAppId);
+ boolean registerIntent(in PendingIntent pendingIntent, long nanoAppId);
// Unregisters a PendingIntent from the client
- boolean unregisterIntent(in PendingIntent intent);
+ boolean unregisterIntent(in PendingIntent pendingIntent);
}
diff --git a/core/java/android/hardware/location/NanoApp.java b/core/java/android/hardware/location/NanoApp.java
index ded1bb8c4c44..62e7182a7ccd 100644
--- a/core/java/android/hardware/location/NanoApp.java
+++ b/core/java/android/hardware/location/NanoApp.java
@@ -20,6 +20,8 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import com.android.internal.util.Preconditions;
+
/** A class describing nano apps.
* A nano app is a piece of executable code that can be
* downloaded onto a specific architecture. These are targtted
@@ -195,10 +197,12 @@ public class NanoApp implements Parcelable {
* needed Sensors
*/
public void setNeededSensors(int[] neededSensors) {
+ Preconditions.checkNotNull(neededSensors, "neededSensors must not be null");
mNeededSensors = neededSensors;
}
public void setOutputEvents(int[] outputEvents) {
+ Preconditions.checkNotNull(outputEvents, "outputEvents must not be null");
mOutputEvents = outputEvents;
}
@@ -208,10 +212,10 @@ public class NanoApp implements Parcelable {
* @param appBinary generated events
*/
public void setAppBinary(byte[] appBinary) {
+ Preconditions.checkNotNull(appBinary, "appBinary must not be null");
mAppBinary = appBinary;
}
-
/**
* get the publisher name
*
diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl
index 6d9c913dfab7..f4e776cdb4b9 100644
--- a/core/java/android/hardware/usb/IUsbManager.aidl
+++ b/core/java/android/hardware/usb/IUsbManager.aidl
@@ -111,17 +111,6 @@ interface IUsbManager
*/
ParcelFileDescriptor getControlFd(long function);
- /* Allow USB debugging from the attached host. If alwaysAllow is true, add the
- * the public key to list of host keys that the user has approved.
- */
- void allowUsbDebugging(boolean alwaysAllow, String publicKey);
-
- /* Deny USB debugging from the attached host */
- void denyUsbDebugging();
-
- /* Clear public keys installed for secure USB debugging */
- void clearUsbDebuggingKeys();
-
/* Gets the list of USB ports. */
UsbPort[] getPorts();
diff --git a/core/java/android/net/InterfaceConfiguration.java b/core/java/android/net/InterfaceConfiguration.java
index b27415566368..62cf7d7ceb25 100644
--- a/core/java/android/net/InterfaceConfiguration.java
+++ b/core/java/android/net/InterfaceConfiguration.java
@@ -19,9 +19,11 @@ package android.net;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import com.google.android.collect.Sets;
+import java.net.InetAddress;
import java.util.HashSet;
/**
@@ -34,8 +36,10 @@ public class InterfaceConfiguration implements Parcelable {
private LinkAddress mAddr;
private HashSet<String> mFlags = Sets.newHashSet();
- private static final String FLAG_UP = "up";
- private static final String FLAG_DOWN = "down";
+ private static final String FLAG_UP = INetd.IF_STATE_UP;
+ private static final String FLAG_DOWN = INetd.IF_STATE_DOWN;
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
@Override
public String toString() {
@@ -112,6 +116,40 @@ public class InterfaceConfiguration implements Parcelable {
}
/**
+ * Construct InterfaceConfiguration from InterfaceConfigurationParcel.
+ */
+ public static InterfaceConfiguration fromParcel(InterfaceConfigurationParcel p) {
+ InterfaceConfiguration cfg = new InterfaceConfiguration();
+ cfg.setHardwareAddress(p.hwAddr);
+
+ final InetAddress addr = NetworkUtils.numericToInetAddress(p.ipv4Addr);
+ cfg.setLinkAddress(new LinkAddress(addr, p.prefixLength));
+ for (String flag : p.flags) {
+ cfg.setFlag(flag);
+ }
+
+ return cfg;
+ }
+
+ /**
+ * Convert InterfaceConfiguration to InterfaceConfigurationParcel with given ifname.
+ */
+ public InterfaceConfigurationParcel toParcel(String iface) {
+ InterfaceConfigurationParcel cfgParcel = new InterfaceConfigurationParcel();
+ cfgParcel.ifName = iface;
+ if (!TextUtils.isEmpty(mHwAddr)) {
+ cfgParcel.hwAddr = mHwAddr;
+ } else {
+ cfgParcel.hwAddr = "";
+ }
+ cfgParcel.ipv4Addr = mAddr.getAddress().getHostAddress();
+ cfgParcel.prefixLength = mAddr.getPrefixLength();
+ cfgParcel.flags = mFlags.toArray(EMPTY_STRING_ARRAY);
+
+ return cfgParcel;
+ }
+
+ /**
* This function determines if the interface is up and has a valid IP
* configuration (IP address has a non zero octet).
*
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index e270fc2e3923..5447f595cad6 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -811,14 +811,19 @@ public class NetworkStats implements Parcelable {
* packet needs to be subtracted from the root UID on the base interface both for tx
* and rx traffic (http://b/12249687, http:/b/33681750).
*
+ * As for eBPF, the per uid stats is collected by different hook, the rx packets on base
+ * interface will not be counted. Thus, the adjustment on root uid is only needed in tx
+ * direction.
+ *
* <p>This method will behave fine if {@code stackedIfaces} is an non-synchronized but add-only
* {@code ConcurrentHashMap}
* @param baseTraffic Traffic on the base interfaces. Will be mutated.
* @param stackedTraffic Stats with traffic stacked on top of our ifaces. Will also be mutated.
* @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
+ * @param useBpfStats True if eBPF is in use.
*/
public static void apply464xlatAdjustments(NetworkStats baseTraffic,
- NetworkStats stackedTraffic, Map<String, String> stackedIfaces) {
+ NetworkStats stackedTraffic, Map<String, String> stackedIfaces, boolean useBpfStats) {
// Total 464xlat traffic to subtract from uid 0 on all base interfaces.
// stackedIfaces may grow afterwards, but NetworkStats will just be resized automatically.
final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size());
@@ -837,15 +842,20 @@ public class NetworkStats implements Parcelable {
continue;
}
// Subtract any 464lat traffic seen for the root UID on the current base interface.
+ // However, for eBPF, the per uid stats is collected by different hook, the rx packets
+ // on base interface will not be counted. Thus, the adjustment on root uid is only
+ // needed in tx direction.
adjust.iface = baseIface;
- adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
+ if (!useBpfStats) {
+ adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
+ adjust.rxPackets = -entry.rxPackets;
+ }
adjust.txBytes = -(entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
- adjust.rxPackets = -entry.rxPackets;
adjust.txPackets = -entry.txPackets;
adjustments.combineValues(adjust);
- // For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent
- // on the stacked interface with prefix "v4-" and drops the IPv6 header size after
+ // For 464xlat traffic, per uid stats only counts the bytes of the native IPv4 packet
+ // sent on the stacked interface with prefix "v4-" and drops the IPv6 header size after
// unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
// difference for all packets (http://b/12249687, http:/b/33681750).
entry.rxBytes += entry.rxPackets * IPV4V6_HEADER_DELTA;
@@ -864,8 +874,8 @@ public class NetworkStats implements Parcelable {
* base and stacked traffic.
* @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
*/
- public void apply464xlatAdjustments(Map<String, String> stackedIfaces) {
- apply464xlatAdjustments(this, this, stackedIfaces);
+ public void apply464xlatAdjustments(Map<String, String> stackedIfaces, boolean useBpfStats) {
+ apply464xlatAdjustments(this, this, stackedIfaces, useBpfStats);
}
/**
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index e4f0358173e0..da4b82308313 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -249,6 +249,7 @@ public class Binder implements IBinder {
* If the current thread is not currently executing an incoming transaction,
* then its own pid is returned.
*/
+ @CriticalNative
public static final native int getCallingPid();
/**
@@ -258,6 +259,7 @@ public class Binder implements IBinder {
* permissions. If the current thread is not currently executing an
* incoming transaction, then its own uid is returned.
*/
+ @CriticalNative
public static final native int getCallingUid();
/**
@@ -288,6 +290,7 @@ public class Binder implements IBinder {
* @see #getCallingUid()
* @see #restoreCallingIdentity(long)
*/
+ @CriticalNative
public static final native long clearCallingIdentity();
/**
@@ -364,6 +367,7 @@ public class Binder implements IBinder {
* @see StrictMode
* @hide
*/
+ @CriticalNative
public static final native void setThreadStrictModePolicy(int policyMask);
/**
@@ -372,6 +376,7 @@ public class Binder implements IBinder {
* @see #setThreadStrictModePolicy
* @hide
*/
+ @CriticalNative
public static final native int getThreadStrictModePolicy();
/**
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index bbb8a7b5d5f6..be8f7847f6a8 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -419,9 +419,11 @@ public class RemoteCallbackList<E extends IInterface> {
/** @hide */
public void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.print("callbacks: "); pw.println(mCallbacks.size());
- pw.print(prefix); pw.print("killed: "); pw.println(mKilled);
- pw.print(prefix); pw.print("broadcasts count: "); pw.println(mBroadcastCount);
+ synchronized (mCallbacks) {
+ pw.print(prefix); pw.print("callbacks: "); pw.println(mCallbacks.size());
+ pw.print(prefix); pw.print("killed: "); pw.println(mKilled);
+ pw.print(prefix); pw.print("broadcasts count: "); pw.println(mBroadcastCount);
+ }
}
private void logExcessiveCallbacks() {
diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java
index 816a730716e1..f521c683896e 100644
--- a/core/java/android/os/storage/StorageManagerInternal.java
+++ b/core/java/android/os/storage/StorageManagerInternal.java
@@ -18,6 +18,7 @@ package android.os.storage;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.IVold;
/**
* Mount service local interface.
@@ -111,4 +112,24 @@ public abstract class StorageManagerInternal {
* @return Labels of storage volumes that are visible to the given userId.
*/
public abstract String[] getVisibleVolumesForUser(int userId);
+
+ /**
+ * A listener for reset events in the StorageManagerService.
+ */
+ public interface ResetListener {
+ /**
+ * A method that should be triggered internally by StorageManagerInternal
+ * when StorageManagerService reset happens.
+ *
+ * @param vold The binder object to vold.
+ */
+ void onReset(IVold vold);
+ }
+
+ /**
+ * Add a listener to listen to reset event in StorageManagerService.
+ *
+ * @param listener The listener that will be notified on reset events.
+ */
+ public abstract void addResetListener(ResetListener listener);
}
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 7ffb22f189b8..fc30eed10983 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -16,16 +16,15 @@
package android.permission;
-import android.Manifest;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
import com.android.internal.annotations.Immutable;
+import com.android.server.SystemConfig;
-import java.util.Arrays;
-import java.util.Collections;
+import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -42,28 +41,8 @@ public final class PermissionManager {
*
* @hide
*/
- public static final List<SplitPermissionInfo> SPLIT_PERMISSIONS = Arrays.asList(
- // READ_EXTERNAL_STORAGE is always required when an app requests
- // WRITE_EXTERNAL_STORAGE, because we can't have an app that has
- // write access without read access. The hack here with the target
- // target SDK version ensures that this grant is always done.
- new SplitPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
- Collections.singletonList(android.Manifest.permission.READ_EXTERNAL_STORAGE),
- android.os.Build.VERSION_CODES.CUR_DEVELOPMENT + 1),
- new SplitPermissionInfo(android.Manifest.permission.READ_CONTACTS,
- Collections.singletonList(android.Manifest.permission.READ_CALL_LOG),
- android.os.Build.VERSION_CODES.JELLY_BEAN),
- new SplitPermissionInfo(android.Manifest.permission.WRITE_CONTACTS,
- Collections.singletonList(android.Manifest.permission.WRITE_CALL_LOG),
- android.os.Build.VERSION_CODES.JELLY_BEAN),
- new SplitPermissionInfo(Manifest.permission.ACCESS_FINE_LOCATION,
- Collections.singletonList(
- android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
- android.os.Build.VERSION_CODES.P0),
- new SplitPermissionInfo(Manifest.permission.ACCESS_COARSE_LOCATION,
- Collections.singletonList(
- android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
- android.os.Build.VERSION_CODES.P0));
+ public static final ArrayList<SplitPermissionInfo> SPLIT_PERMISSIONS =
+ SystemConfig.getInstance().getSplitPermissions();
private final @NonNull Context mContext;
@@ -145,9 +124,18 @@ public final class PermissionManager {
return mTargetSdk;
}
- private SplitPermissionInfo(@NonNull String rootPerm, @NonNull List<String> newPerms,
+ /**
+ * Constructs a split permission.
+ *
+ * @param splitPerm old permission that will be split
+ * @param newPerms list of new permissions that {@code rootPerm} will be split into
+ * @param targetSdk apps targetting SDK versions below this will have {@code rootPerm}
+ * split into {@code newPerms}
+ * @hide
+ */
+ public SplitPermissionInfo(@NonNull String splitPerm, @NonNull List<String> newPerms,
int targetSdk) {
- mSplitPerm = rootPerm;
+ mSplitPerm = splitPerm;
mNewPerms = newPerms;
mTargetSdk = targetSdk;
}
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 0e782d752815..68f8acd8a586 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -461,6 +461,41 @@ public abstract class DocumentsProvider extends ContentProvider {
}
/**
+ * Return recently modified documents under the requested root. This will
+ * only be called for roots that advertise
+ * {@link Root#FLAG_SUPPORTS_RECENTS}. The returned documents should be
+ * sorted by {@link Document#COLUMN_LAST_MODIFIED} in descending order of
+ * the most recently modified documents.
+ * <p>
+ * If this method is overriden by the concrete DocumentsProvider and
+ * QUERY_ARGS_LIMIT is specified with a nonnegative int under queryArgs, the
+ * result will be limited by that number and QUERY_ARG_LIMIT will be
+ * specified under EXTRA_HONORED_ARGS. Otherwise, a default 64 limit will
+ * be used and no QUERY_ARG* will be specified under EXTRA_HONORED_ARGS.
+ * <p>
+ * Recent documents do not support change notifications.
+ *
+ * @param projection list of {@link Document} columns to put into the
+ * cursor. If {@code null} all supported columns should be
+ * included.
+ * @param queryArgs the extra query arguments.
+ * @param signal used by the caller to signal if the request should be
+ * cancelled. May be null.
+ * @see DocumentsContract#EXTRA_LOADING
+ */
+ @SuppressWarnings("unused")
+ public Cursor queryRecentDocuments(
+ String rootId, String[] projection, @Nullable Bundle queryArgs,
+ @Nullable CancellationSignal signal)
+ throws FileNotFoundException {
+ Cursor c = queryRecentDocuments(rootId, projection);
+ Bundle extras = new Bundle();
+ c.setExtras(extras);
+ extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[0]);
+ return c;
+ }
+
+ /**
* Return metadata for the single requested document. You should avoid
* making network requests to keep this request fast.
*
@@ -774,7 +809,7 @@ public abstract class DocumentsProvider extends ContentProvider {
* Implementation is provided by the parent class. Cannot be overridden.
*
* @see #queryRoots(String[])
- * @see #queryRecentDocuments(String, String[])
+ * @see #queryRecentDocuments(String, String[], Bundle, CancellationSignal)
* @see #queryDocument(String, String[])
* @see #queryChildDocuments(String, String[], String)
* @see #querySearchDocuments(String, String, String[])
@@ -787,7 +822,8 @@ public abstract class DocumentsProvider extends ContentProvider {
case MATCH_ROOTS:
return queryRoots(projection);
case MATCH_RECENT:
- return queryRecentDocuments(getRootId(uri), projection);
+ return queryRecentDocuments(
+ getRootId(uri), projection, queryArgs, cancellationSignal);
case MATCH_SEARCH:
return querySearchDocuments(
getRootId(uri), getSearchDocumentsQuery(uri), projection);
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 1fce8e6c9ac2..19b84f19306e 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -21,6 +21,8 @@ import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.UnsupportedAppUsage;
+import android.app.Activity;
+import android.app.AppGlobals;
import android.content.ClipData;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
@@ -37,21 +39,27 @@ import android.graphics.Point;
import android.net.Uri;
import android.os.Bundle;
import android.os.CancellationSignal;
-import android.os.Environment;
import android.os.OperationCanceledException;
import android.os.RemoteException;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
+import android.os.storage.VolumeInfo;
import android.service.media.CameraPrewarmService;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
/**
* The Media provider contains meta data for all available media on both internal
@@ -65,7 +73,8 @@ public final class MediaStore {
/** A content:// style uri to the authority for the media provider */
public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
- private static final String CONTENT_AUTHORITY_SLASH = "content://" + AUTHORITY + "/";
+ private static final String VOLUME_INTERNAL = "internal";
+ private static final String VOLUME_EXTERNAL = "external";
/**
* The method name used by the media scanner and mtp to tell the media provider to
@@ -266,7 +275,7 @@ public final class MediaStore {
* any personal content like existing photos or videos on the device. The
* applications should be careful not to share any photo or video with other
* applications or internet. The activity should use {@link
- * android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} to display
+ * Activity#setShowWhenLocked} to display
* on top of the lock screen while secured. There is no activity stack when
* this flag is used, so launching more than one activity is strongly
* discouraged.
@@ -311,8 +320,8 @@ public final class MediaStore {
* it when the device is secured (e.g. with a pin, password, pattern, or face unlock).
* Applications responding to this intent must not expose any personal content like existing
* photos or videos on the device. The applications should be careful not to share any photo
- * or video with other applications or internet. The activity should use {@link
- * android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} to display on top of the
+ * or video with other applications or Internet. The activity should use {@link
+ * Activity#setShowWhenLocked} to display on top of the
* lock screen while secured. There is no activity stack when this flag is used, so
* launching more than one activity is strongly discouraged.
* <p>
@@ -364,6 +373,55 @@ public final class MediaStore {
public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
/**
+ * Standard action that can be sent to review the given media file.
+ * <p>
+ * The launched application is expected to provide a large-scale view of the
+ * given media file, while allowing the user to quickly access other
+ * recently captured media files.
+ * <p>
+ * Input: {@link Intent#getData} is URI of the primary media item to
+ * initially display.
+ *
+ * @see #ACTION_REVIEW_SECURE
+ * @see #EXTRA_BRIGHTNESS
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public final static String ACTION_REVIEW = "android.provider.action.REVIEW";
+
+ /**
+ * Standard action that can be sent to review the given media file when the
+ * device is secured (e.g. with a pin, password, pattern, or face unlock).
+ * The applications should be careful not to share any media with other
+ * applications or Internet. The activity should use
+ * {@link Activity#setShowWhenLocked} to display on top of the lock screen
+ * while secured. There is no activity stack when this flag is used, so
+ * launching more than one activity is strongly discouraged.
+ * <p>
+ * The launched application is expected to provide a large-scale view of the
+ * given primary media file, while only allowing the user to quickly access
+ * other media from an explicit secondary list.
+ * <p>
+ * Input: {@link Intent#getData} is URI of the primary media item to
+ * initially display. {@link Intent#getClipData} is the limited list of
+ * secondary media items that the user is allowed to review. If
+ * {@link Intent#getClipData} is undefined, then no other media access
+ * should be allowed.
+ *
+ * @see #EXTRA_BRIGHTNESS
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public final static String ACTION_REVIEW_SECURE = "android.provider.action.REVIEW_SECURE";
+
+ /**
+ * When defined, the launched application is requested to set the given
+ * brightness value via
+ * {@link android.view.WindowManager.LayoutParams#screenBrightness} to help
+ * ensure a smooth transition when launching {@link #ACTION_REVIEW} or
+ * {@link #ACTION_REVIEW_SECURE} intents.
+ */
+ public final static String EXTRA_BRIGHTNESS = "android.provider.extra.BRIGHTNESS";
+
+ /**
* The name of the Intent-extra used to control the quality of a recorded video. This is an
* integer property. Currently value 0 means low quality, suitable for MMS messages, and
* value 1 means high quality. In the future other quality levels may be added.
@@ -420,6 +478,23 @@ public final class MediaStore {
public static final String DATA = "_data";
/**
+ * Hash of the file on disk.
+ * <p>
+ * Contains a 20-byte binary blob which is the SHA-1 hash of the file as
+ * persisted on disk. For performance reasons, the hash may not be
+ * immediately available, in which case a {@code NULL} value will be
+ * returned. If the underlying file is modified, this value will be
+ * cleared and recalculated.
+ * <p>
+ * If you require the hash of a specific item, you can call
+ * {@link ContentResolver#canonicalize(Uri)}, which will block until the
+ * hash is calculated.
+ * <p>
+ * Type: BLOB
+ */
+ public static final String HASH = "_hash";
+
+ /**
* The size of the file in bytes
* <P>Type: INTEGER (long)</P>
*/
@@ -509,8 +584,7 @@ public final class MediaStore {
* @return the URI to the files table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/file");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("file").build();
}
/**
@@ -523,8 +597,7 @@ public final class MediaStore {
*/
public static final Uri getContentUri(String volumeName,
long rowId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/file/" + rowId);
+ return ContentUris.withAppendedId(getContentUri(volumeName), rowId);
}
/**
@@ -533,8 +606,7 @@ public final class MediaStore {
*/
@UnsupportedAppUsage
public static Uri getMtpObjectsUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/object");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("object").build();
}
/**
@@ -544,8 +616,7 @@ public final class MediaStore {
@UnsupportedAppUsage
public static final Uri getMtpObjectsUri(String volumeName,
long fileId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/object/" + fileId);
+ return ContentUris.withAppendedId(getMtpObjectsUri(volumeName), fileId);
}
/**
@@ -555,8 +626,8 @@ public final class MediaStore {
@UnsupportedAppUsage
public static final Uri getMtpReferencesUri(String volumeName,
long fileId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/object/" + fileId + "/references");
+ return getMtpObjectsUri(volumeName, fileId).buildUpon().appendPath("references")
+ .build();
}
/**
@@ -564,7 +635,7 @@ public final class MediaStore {
* @hide
*/
public static final Uri getDirectoryUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + "/dir");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("dir").build();
}
/**
@@ -777,7 +848,7 @@ public final class MediaStore {
* <P>Type: INTEGER</P>
*
* @deprecated all thumbnails should be obtained via
- * {@link Images.Thumbnails#getThumbnail}, as this
+ * {@link MediaStore.Images.Thumbnails#getThumbnail}, as this
* value is no longer supported.
*/
@Deprecated
@@ -921,8 +992,8 @@ public final class MediaStore {
* @return the URI to the image media table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/images/media");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("images")
+ .appendPath("media").build();
}
/**
@@ -1063,8 +1134,8 @@ public final class MediaStore {
* @return the URI to the image media table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/images/thumbnails");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("images")
+ .appendPath("thumbnails").build();
}
/**
@@ -1371,14 +1442,29 @@ public final class MediaStore {
* @return the URI to the audio media table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/media");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("audio")
+ .appendPath("media").build();
}
- public static Uri getContentUriForPath(String path) {
- return (path.startsWith(
- Environment.getStorageDirectory().getAbsolutePath() + "/")
- ? EXTERNAL_CONTENT_URI : INTERNAL_CONTENT_URI);
+ /**
+ * Get the content:// style URI for the given audio media file.
+ *
+ * @deprecated Apps may not have filesystem permissions to directly
+ * access this path.
+ */
+ public static @Nullable Uri getContentUriForPath(@NonNull String path) {
+ final StorageManager sm = AppGlobals.getInitialApplication()
+ .getSystemService(StorageManager.class);
+ final StorageVolume sv = sm.getStorageVolume(new File(path));
+ if (sv != null) {
+ if (sv.isPrimary()) {
+ return EXTERNAL_CONTENT_URI;
+ } else {
+ return getContentUri(sv.getUuid());
+ }
+ } else {
+ return INTERNAL_CONTENT_URI;
+ }
}
/**
@@ -1454,8 +1540,8 @@ public final class MediaStore {
* @return the URI to the audio genres table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/genres");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("audio")
+ .appendPath("genres").build();
}
/**
@@ -1467,8 +1553,8 @@ public final class MediaStore {
* with the given the volume and audioID
*/
public static Uri getContentUriForAudioId(String volumeName, int audioId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/media/" + audioId + "/genres");
+ return ContentUris.withAppendedId(Audio.Media.getContentUri(volumeName), audioId)
+ .buildUpon().appendPath("genres").build();
}
/**
@@ -1504,10 +1590,10 @@ public final class MediaStore {
*/
public static final class Members implements AudioColumns {
- public static final Uri getContentUri(String volumeName,
- long genreId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/audio/genres/" + genreId + "/members");
+ public static final Uri getContentUri(String volumeName, long genreId) {
+ return ContentUris
+ .withAppendedId(Audio.Genres.getContentUri(volumeName), genreId)
+ .buildUpon().appendPath("members").build();
}
/**
@@ -1595,8 +1681,8 @@ public final class MediaStore {
* @return the URI to the audio playlists table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/playlists");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("audio")
+ .appendPath("playlists").build();
}
/**
@@ -1631,10 +1717,10 @@ public final class MediaStore {
* Sub-directory of each playlist containing all members.
*/
public static final class Members implements AudioColumns {
- public static final Uri getContentUri(String volumeName,
- long playlistId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/audio/playlists/" + playlistId + "/members");
+ public static final Uri getContentUri(String volumeName, long playlistId) {
+ return ContentUris
+ .withAppendedId(Audio.Playlists.getContentUri(volumeName), playlistId)
+ .buildUpon().appendPath("members").build();
}
/**
@@ -1734,8 +1820,8 @@ public final class MediaStore {
* @return the URI to the audio artists table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/artists");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("audio")
+ .appendPath("artists").build();
}
/**
@@ -1771,10 +1857,10 @@ public final class MediaStore {
* a song by the artist appears.
*/
public static final class Albums implements AlbumColumns {
- public static final Uri getContentUri(String volumeName,
- long artistId) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
- + "/audio/artists/" + artistId + "/albums");
+ public static final Uri getContentUri(String volumeName,long artistId) {
+ return ContentUris
+ .withAppendedId(Audio.Artists.getContentUri(volumeName), artistId)
+ .buildUpon().appendPath("albums").build();
}
}
}
@@ -1869,8 +1955,8 @@ public final class MediaStore {
* @return the URI to the audio albums table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/audio/albums");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("audio")
+ .appendPath("albums").build();
}
/**
@@ -2004,7 +2090,7 @@ public final class MediaStore {
* <P>Type: INTEGER</P>
*
* @deprecated all thumbnails should be obtained via
- * {@link Images.Thumbnails#getThumbnail}, as this
+ * {@link MediaStore.Images.Thumbnails#getThumbnail}, as this
* value is no longer supported.
*/
@Deprecated
@@ -2064,8 +2150,8 @@ public final class MediaStore {
* @return the URI to the video media table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/video/media");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("video")
+ .appendPath("media").build();
}
/**
@@ -2188,8 +2274,8 @@ public final class MediaStore {
* @return the URI to the image media table on the given volume
*/
public static Uri getContentUri(String volumeName) {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
- "/video/thumbnails");
+ return AUTHORITY_URI.buildUpon().appendPath(volumeName).appendPath("video")
+ .appendPath("thumbnails").build();
}
/**
@@ -2257,6 +2343,30 @@ public final class MediaStore {
}
/**
+ * Return list of all volume names currently available. This includes a
+ * unique name for each shared storage device that is currently mounted.
+ * <p>
+ * Each name can be passed to APIs like
+ * {@link MediaStore.Images.Media#getContentUri(String)} to query media at
+ * that location.
+ */
+ public static @NonNull Set<String> getAllVolumeNames(Context context) {
+ final StorageManager sm = context.getSystemService(StorageManager.class);
+ final Set<String> volumeNames = new ArraySet<>();
+ volumeNames.add(VOLUME_INTERNAL);
+ for (VolumeInfo vi : sm.getVolumes()) {
+ if (vi.isMountedReadable()) {
+ if (vi.isPrimary()) {
+ volumeNames.add(VOLUME_EXTERNAL);
+ } else {
+ volumeNames.add(vi.getFsUuid());
+ }
+ }
+ }
+ return volumeNames;
+ }
+
+ /**
* Return the volume name that the given {@link Uri} references.
*/
public static @NonNull String getVolumeName(@NonNull Uri uri) {
@@ -2272,7 +2382,7 @@ public final class MediaStore {
* Uri for querying the state of the media scanner.
*/
public static Uri getMediaScannerUri() {
- return Uri.parse(CONTENT_AUTHORITY_SLASH + "none/media_scanner");
+ return AUTHORITY_URI.buildUpon().appendPath("none").appendPath("media_scanner").build();
}
/**
@@ -2297,16 +2407,10 @@ public final class MediaStore {
* @return A version string, or null if the version could not be determined.
*/
public static String getVersion(Context context) {
- Cursor c = context.getContentResolver().query(
- Uri.parse(CONTENT_AUTHORITY_SLASH + "none/version"),
- null, null, null, null);
- if (c != null) {
- try {
- if (c.moveToFirst()) {
- return c.getString(0);
- }
- } finally {
- c.close();
+ final Uri uri = AUTHORITY_URI.buildUpon().appendPath("none").appendPath("version").build();
+ try (Cursor c = context.getContentResolver().query(uri, null, null, null, null)) {
+ if (c.moveToFirst()) {
+ return c.getString(0);
}
}
return null;
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 45e634385104..0ef56b0c5d2d 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1815,27 +1815,39 @@ public final class Settings {
/**
- * User has not started setup personalization.
+ * Indicates that the user has not started setup personalization.
+ * One of the possible states for {@link Secure#USER_SETUP_PERSONALIZATION_STATE}.
+ *
* @hide
*/
+ @SystemApi
public static final int USER_SETUP_PERSONALIZATION_NOT_STARTED = 0;
/**
- * User has not yet completed setup personalization.
+ * Indicates that the user has not yet completed setup personalization.
+ * One of the possible states for {@link Secure#USER_SETUP_PERSONALIZATION_STATE}.
+ *
* @hide
*/
+ @SystemApi
public static final int USER_SETUP_PERSONALIZATION_STARTED = 1;
/**
- * User has snoozed personalization and will complete it later.
+ * Indicates that the user has snoozed personalization and will complete it later.
+ * One of the possible states for {@link Secure#USER_SETUP_PERSONALIZATION_STATE}.
+ *
* @hide
*/
+ @SystemApi
public static final int USER_SETUP_PERSONALIZATION_PAUSED = 2;
/**
- * User has completed setup personalization.
+ * Indicates that the user has completed setup personalization.
+ * One of the possible states for {@link Secure#USER_SETUP_PERSONALIZATION_STATE}.
+ *
* @hide
*/
+ @SystemApi
public static final int USER_SETUP_PERSONALIZATION_COMPLETE = 10;
/** @hide */
@@ -5614,18 +5626,23 @@ public final class Settings {
public static final String DEVICE_PROVISIONED = Global.DEVICE_PROVISIONED;
/**
- * Whether the current user has been set up via setup wizard (0 = false, 1 = true)
+ * Indicates whether the current user has completed setup via the setup wizard.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
* @hide
*/
+ @SystemApi
@TestApi
public static final String USER_SETUP_COMPLETE = "user_setup_complete";
/**
- * The current state of device personalization.
+ * Defines the user's current state of device personalization.
+ * The possible states are defined in {@link UserSetupPersonalization}.
*
* @hide
- * @see UserSetupPersonalization
*/
+ @SystemApi
public static final String USER_SETUP_PERSONALIZATION_STATE =
"user_setup_personalization_state";
@@ -5639,10 +5656,14 @@ public final class Settings {
public static final String TV_USER_SETUP_COMPLETE = "tv_user_setup_complete";
/**
- * Prefix for category name that marks whether a suggested action from that category was
- * completed.
+ * The prefix for a category name that indicates whether a suggested action from that
+ * category was marked as completed.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
* @hide
*/
+ @SystemApi
public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
/**
@@ -5914,11 +5935,14 @@ public final class Settings {
"lock_screen_owner_info_enabled";
/**
- * When set by a user, allows notifications to be shown atop a securely locked screen
- * in their full "private" form (same as when the device is unlocked).
+ * Indicates whether the user has allowed notifications to be shown atop a securely locked
+ * screen in their full "private" form (same as when the device is unlocked).
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS =
"lock_screen_allow_private_notifications";
@@ -6038,6 +6062,7 @@ public final class Settings {
* shortcut. Must be its flattened {@link ComponentName}.
* @hide
*/
+ @TestApi
public static final String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE =
"accessibility_shortcut_target_service";
@@ -6943,8 +6968,9 @@ public final class Settings {
public static final String BACKUP_TRANSPORT = "backup_transport";
/**
- * Version for which the setup wizard was last shown. Bumped for
- * each release when there is new setup information to show.
+ * Indicates the version for which the setup wizard was last shown. The version gets
+ * bumped for each release when there is new setup information to show.
+ *
* @hide
*/
@SystemApi
@@ -7260,9 +7286,13 @@ public final class Settings {
private static final Validator DOZE_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR;
/**
- * Whether doze should be always on.
+ * Indicates whether doze should be always on.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
* @hide
*/
+ @SystemApi
public static final String DOZE_ALWAYS_ON = "doze_always_on";
private static final Validator DOZE_ALWAYS_ON_VALIDATOR = BOOLEAN_VALIDATOR;
@@ -7396,8 +7426,8 @@ public final class Settings {
"call_screening_default_component";
/**
- * Specifies the package name currently configured to be the default application to perform
- * the user-defined call redirection service with Telecom.
+ * Specifies the component name currently configured to be the default application to
+ * perform the user-defined call redirection service with Telecom.
* @hide
*/
@UnsupportedAppUsage
@@ -7580,10 +7610,13 @@ public final class Settings {
public static final String UNSAFE_VOLUME_MUSIC_ACTIVE_MS = "unsafe_volume_music_active_ms";
/**
- * This preference enables notification display on the lockscreen.
+ * Indicates whether notification display on the lock screen is enabled.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS =
"lock_screen_show_notifications";
@@ -7777,10 +7810,13 @@ public final class Settings {
BOOLEAN_VALIDATOR;
/**
- * Whether Assist Gesture Deferred Setup has been completed
+ * Indicates whether the Assist Gesture Deferred Setup has been completed.
+ * <p>
+ * Type: int (0 for false, 1 for true)
*
* @hide
*/
+ @SystemApi
public static final String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
/**
@@ -8423,6 +8459,8 @@ public final class Settings {
VALIDATORS.put(CHARGING_VIBRATION_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(ACCESSIBILITY_MINIMUM_UI_TIMEOUT_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(ACCESSIBILITY_MINIMUM_UI_TIMEOUT_MS, NON_NEGATIVE_INTEGER_VALIDATOR);
+ VALIDATORS.put(USER_SETUP_COMPLETE, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(ASSIST_GESTURE_SETUP_COMPLETE, BOOLEAN_VALIDATOR);
}
/**
@@ -9128,16 +9166,19 @@ public final class Settings {
*/
public static final String DEVICE_PROVISIONED = "device_provisioned";
- /**
- * Whether mobile data should be allowed while the device is being provisioned.
- * This allows the provisioning process to turn off mobile data before the user
- * has an opportunity to set things up, preventing other processes from burning
- * precious bytes before wifi is setup.
- * (0 = false, 1 = true)
- * @hide
- */
- public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED =
- "device_provisioning_mobile_data";
+ /**
+ * Indicates whether mobile data should be allowed while the device is being provisioned.
+ * This allows the provisioning process to turn off mobile data before the user
+ * has an opportunity to set things up, preventing other processes from burning
+ * precious bytes before wifi is setup.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED =
+ "device_provisioning_mobile_data";
/**
* The saved value for WindowManagerService.setForcedDisplaySize().
@@ -12112,13 +12153,14 @@ public final class Settings {
public static final String NETWORK_SCORING_PROVISIONED = "network_scoring_provisioned";
/**
- * Whether the user wants to be prompted for password to decrypt the device on boot.
- * This only matters if the storage is encrypted.
+ * Indicates whether the user wants to be prompted for password to decrypt the device on
+ * boot. This only matters if the storage is encrypted.
* <p>
* Type: int (0 for false, 1 for true)
+ *
* @hide
*/
- @UnsupportedAppUsage
+ @SystemApi
public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
/**
@@ -12302,12 +12344,14 @@ public final class Settings {
public static final String SAFE_BOOT_DISALLOWED = "safe_boot_disallowed";
/**
- * Whether this device is currently in retail demo mode. If true, device
+ * Indicates whether this device is currently in retail demo mode. If true, the device
* usage is severely limited.
* <p>
* Type: int (0 for false, 1 for true)
+ *
* @hide
*/
+ @SystemApi
public static final String DEVICE_DEMO_MODE = "device_demo_mode";
/**
@@ -12629,6 +12673,9 @@ public final class Settings {
VALIDATORS.put(APP_AUTO_RESTRICTION_ENABLED, APP_AUTO_RESTRICTION_ENABLED_VALIDATOR);
VALIDATORS.put(ZEN_DURATION, ZEN_DURATION_VALIDATOR);
VALIDATORS.put(CHARGING_VIBRATION_ENABLED, CHARGING_VIBRATION_ENABLED_VALIDATOR);
+ VALIDATORS.put(DEVICE_PROVISIONING_MOBILE_DATA_ENABLED, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(REQUIRE_PASSWORD_TO_DECRYPT, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(DEVICE_DEMO_MODE, BOOLEAN_VALIDATOR);
}
/**
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 37a9b10aeb6d..8371c31b5ac5 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -69,9 +69,9 @@ import java.util.UUID;
public class ZenModeConfig implements Parcelable {
private static String TAG = "ZenModeConfig";
- public static final int SOURCE_ANYONE = 0;
- public static final int SOURCE_CONTACT = 1;
- public static final int SOURCE_STAR = 2;
+ public static final int SOURCE_ANYONE = Policy.PRIORITY_SENDERS_ANY;
+ public static final int SOURCE_CONTACT = Policy.PRIORITY_SENDERS_CONTACTS;
+ public static final int SOURCE_STAR = Policy.PRIORITY_SENDERS_STARRED;
public static final int MAX_SOURCE = SOURCE_STAR;
private static final int DEFAULT_SOURCE = SOURCE_CONTACT;
private static final int DEFAULT_CALLS_SOURCE = SOURCE_STAR;
@@ -777,24 +777,6 @@ public class ZenModeConfig implements Parcelable {
};
/**
- * @return notification policy based on manual and automatic rules
- */
- public Policy getConsolidatedNotificationPolicy() {
- ZenPolicy policy = new ZenPolicy();
-
- // assumption: manual rule always uses the default policy
- for (ZenRule rule : automaticRules.values()) {
- if (rule.isAutomaticActive()) {
- if (rule.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
- policy.apply(rule.zenPolicy);
- }
- }
- }
-
- return toNotificationPolicy(policy);
- }
-
- /**
* Converts a zenPolicy to a notificationPolicy using this ZenModeConfig's values as its
* defaults for all unset values in zenPolicy
*/
@@ -891,7 +873,7 @@ public class ZenModeConfig implements Parcelable {
}
return new NotificationManager.Policy(priorityCategories, callSenders,
- messageSenders, suppressedVisualEffects);
+ messageSenders, suppressedVisualEffects, defaultPolicy.state);
}
private boolean isPriorityCategoryEnabled(int categoryType, Policy policy) {
@@ -945,6 +927,7 @@ public class ZenModeConfig implements Parcelable {
}
priorityCallSenders = sourceToPrioritySenders(allowCallsFrom, priorityCallSenders);
priorityMessageSenders = sourceToPrioritySenders(allowMessagesFrom, priorityMessageSenders);
+
return new Policy(priorityCategories, priorityCallSenders, priorityMessageSenders,
suppressedVisualEffects, areChannelsBypassingDnd
? Policy.STATE_CHANNELS_BYPASSING_DND : 0);
@@ -1732,13 +1715,25 @@ public class ZenModeConfig implements Parcelable {
}
/**
+ * Determines whether dnd behavior should mute all sounds controlled by ringer
+ */
+ public static boolean areAllZenBehaviorSoundsMuted(NotificationManager.Policy
+ policy) {
+ boolean allowAlarms = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_ALARMS) != 0;
+ boolean allowMedia = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_MEDIA) != 0;
+ boolean allowSystem = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_SYSTEM) != 0;
+ return !allowAlarms && !allowMedia && !allowSystem
+ && areAllPriorityOnlyNotificationZenSoundsMuted(policy);
+ }
+
+ /**
* Determines if DND is currently overriding the ringer
*/
- public static boolean isZenOverridingRinger(int zen, ZenModeConfig zenConfig) {
+ public static boolean isZenOverridingRinger(int zen, Policy consolidatedPolicy) {
return zen == Global.ZEN_MODE_NO_INTERRUPTIONS
|| zen == Global.ZEN_MODE_ALARMS
|| (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
- && ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(zenConfig));
+ && ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(consolidatedPolicy));
}
/**
diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java
index 1ccf529d3009..43ab8dc07000 100644
--- a/core/java/android/service/notification/ZenPolicy.java
+++ b/core/java/android/service/notification/ZenPolicy.java
@@ -818,6 +818,10 @@ public final class ZenPolicy implements Parcelable {
* @hide
*/
public void apply(ZenPolicy policyToApply) {
+ if (policyToApply == null) {
+ return;
+ }
+
// apply priority categories
for (int category = 0; category < mPriorityCategories.size(); category++) {
if (mPriorityCategories.get(category) == STATE_DISALLOW) {
diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java
index 7af9db8ebf32..7f1082d4dcc6 100644
--- a/core/java/android/service/textclassifier/TextClassifierService.java
+++ b/core/java/android/service/textclassifier/TextClassifierService.java
@@ -17,7 +17,6 @@
package android.service.textclassifier;
import android.Manifest;
-import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
@@ -98,8 +97,7 @@ public abstract class TextClassifierService extends Service {
Preconditions.checkNotNull(request);
Preconditions.checkNotNull(callback);
TextClassifierService.this.onSuggestSelection(
- request.getText(), request.getStartIndex(), request.getEndIndex(),
- TextSelection.Options.from(sessionId, request), mCancellationSignal,
+ sessionId, request, mCancellationSignal,
new Callback<TextSelection>() {
@Override
public void onSuccess(TextSelection result) {
@@ -132,8 +130,7 @@ public abstract class TextClassifierService extends Service {
Preconditions.checkNotNull(request);
Preconditions.checkNotNull(callback);
TextClassifierService.this.onClassifyText(
- request.getText(), request.getStartIndex(), request.getEndIndex(),
- TextClassification.Options.from(sessionId, request), mCancellationSignal,
+ sessionId, request, mCancellationSignal,
new Callback<TextClassification>() {
@Override
public void onSuccess(TextClassification result) {
@@ -164,7 +161,7 @@ public abstract class TextClassifierService extends Service {
Preconditions.checkNotNull(request);
Preconditions.checkNotNull(callback);
TextClassifierService.this.onGenerateLinks(
- request.getText(), TextLinks.Options.from(sessionId, request),
+ sessionId, request,
mCancellationSignal,
new Callback<TextLinks>() {
@Override
@@ -238,25 +235,6 @@ public abstract class TextClassifierService extends Service {
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextSelection> callback);
- // TODO: Remove once apps can build against the latest sdk.
- /** @hide */
- public void onSuggestSelection(
- @NonNull CharSequence text,
- @IntRange(from = 0) int selectionStartIndex,
- @IntRange(from = 0) int selectionEndIndex,
- @Nullable TextSelection.Options options,
- @NonNull CancellationSignal cancellationSignal,
- @NonNull Callback<TextSelection> callback) {
- final TextClassificationSessionId sessionId = options.getSessionId();
- final TextSelection.Request request = options.getRequest() != null
- ? options.getRequest()
- : new TextSelection.Request.Builder(
- text, selectionStartIndex, selectionEndIndex)
- .setDefaultLocales(options.getDefaultLocales())
- .build();
- onSuggestSelection(sessionId, request, cancellationSignal, callback);
- }
-
/**
* Classifies the specified text and returns a {@link TextClassification} object that can be
* used to generate a widget for handling the classified text.
@@ -272,26 +250,6 @@ public abstract class TextClassifierService extends Service {
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextClassification> callback);
- // TODO: Remove once apps can build against the latest sdk.
- /** @hide */
- public void onClassifyText(
- @NonNull CharSequence text,
- @IntRange(from = 0) int startIndex,
- @IntRange(from = 0) int endIndex,
- @Nullable TextClassification.Options options,
- @NonNull CancellationSignal cancellationSignal,
- @NonNull Callback<TextClassification> callback) {
- final TextClassificationSessionId sessionId = options.getSessionId();
- final TextClassification.Request request = options.getRequest() != null
- ? options.getRequest()
- : new TextClassification.Request.Builder(
- text, startIndex, endIndex)
- .setDefaultLocales(options.getDefaultLocales())
- .setReferenceTime(options.getReferenceTime())
- .build();
- onClassifyText(sessionId, request, cancellationSignal, callback);
- }
-
/**
* Generates and returns a {@link TextLinks} that may be applied to the text to annotate it with
* links information.
@@ -307,23 +265,6 @@ public abstract class TextClassifierService extends Service {
@NonNull CancellationSignal cancellationSignal,
@NonNull Callback<TextLinks> callback);
- // TODO: Remove once apps can build against the latest sdk.
- /** @hide */
- public void onGenerateLinks(
- @NonNull CharSequence text,
- @Nullable TextLinks.Options options,
- @NonNull CancellationSignal cancellationSignal,
- @NonNull Callback<TextLinks> callback) {
- final TextClassificationSessionId sessionId = options.getSessionId();
- final TextLinks.Request request = options.getRequest() != null
- ? options.getRequest()
- : new TextLinks.Request.Builder(text)
- .setDefaultLocales(options.getDefaultLocales())
- .setEntityConfig(options.getEntityConfig())
- .build();
- onGenerateLinks(sessionId, request, cancellationSignal, callback);
- }
-
/**
* Writes the selection event.
* This is called when a selection event occurs. e.g. user changed selection; or smart selection
diff --git a/core/java/android/transition/Scene.java b/core/java/android/transition/Scene.java
index 1bdcff98ff17..7e499f29122a 100644
--- a/core/java/android/transition/Scene.java
+++ b/core/java/android/transition/Scene.java
@@ -16,6 +16,8 @@
package android.transition;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.util.SparseArray;
@@ -196,22 +198,24 @@ public final class Scene {
* information is used by Scene to determine whether there is a previous
* scene which should be exited before the new scene is entered.
*
- * @param view The view on which the current scene is being set
+ * @param sceneRoot The view on which the current scene is being set
*/
@UnsupportedAppUsage
- static void setCurrentScene(View view, Scene scene) {
- view.setTagInternal(com.android.internal.R.id.current_scene, scene);
+ static void setCurrentScene(@NonNull View sceneRoot, @Nullable Scene scene) {
+ sceneRoot.setTagInternal(com.android.internal.R.id.current_scene, scene);
}
/**
* Gets the current {@link Scene} set on the given view. A scene is set on a view
* only if that view is the scene root.
*
+ * @param sceneRoot The view on which the current scene will be returned
* @return The current Scene set on this view. A value of null indicates that
* no Scene is currently set.
*/
- static Scene getCurrentScene(View view) {
- return (Scene) view.getTag(com.android.internal.R.id.current_scene);
+ @Nullable
+ public static Scene getCurrentScene(@NonNull View sceneRoot) {
+ return (Scene) sceneRoot.getTag(com.android.internal.R.id.current_scene);
}
/**
diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java
index 589ad574dd9b..b9b2a70d32b1 100644
--- a/core/java/android/transition/TransitionSet.java
+++ b/core/java/android/transition/TransitionSet.java
@@ -163,8 +163,7 @@ public class TransitionSet extends Transition {
*/
public TransitionSet addTransition(Transition transition) {
if (transition != null) {
- mTransitions.add(transition);
- transition.mParent = this;
+ addTransitionInternal(transition);
if (mDuration >= 0) {
transition.setDuration(mDuration);
}
@@ -184,6 +183,11 @@ public class TransitionSet extends Transition {
return this;
}
+ private void addTransitionInternal(Transition transition) {
+ mTransitions.add(transition);
+ transition.mParent = this;
+ }
+
/**
* Returns the number of child transitions in the TransitionSet.
*
@@ -355,8 +359,10 @@ public class TransitionSet extends Transition {
public void setPathMotion(PathMotion pathMotion) {
super.setPathMotion(pathMotion);
mChangeFlags |= FLAG_CHANGE_PATH_MOTION;
- for (int i = 0; i < mTransitions.size(); i++) {
- mTransitions.get(i).setPathMotion(pathMotion);
+ if (mTransitions != null) {
+ for (int i = 0; i < mTransitions.size(); i++) {
+ mTransitions.get(i).setPathMotion(pathMotion);
+ }
}
}
@@ -604,7 +610,7 @@ public class TransitionSet extends Transition {
clone.mTransitions = new ArrayList<Transition>();
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
- clone.addTransition((Transition) mTransitions.get(i).clone());
+ clone.addTransitionInternal((Transition) mTransitions.get(i).clone());
}
return clone;
}
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java
index d74a0fe8d2c1..4bd43d05ae61 100644
--- a/core/java/android/util/ArraySet.java
+++ b/core/java/android/util/ArraySet.java
@@ -16,14 +16,17 @@
package android.util;
+import android.annotation.TestApi;
+import android.annotation.UnsupportedAppUsage;
+
import libcore.util.EmptyArray;
-import android.annotation.UnsupportedAppUsage;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import java.util.function.Predicate;
/**
* ArraySet is a generic set data structure that is designed to be more memory efficient than a
@@ -357,6 +360,22 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
* @return Returns the value stored at the given index.
*/
public E valueAt(int index) {
+ if (index >= mSize) {
+ // The array might be slightly bigger than mSize, in which case, indexing won't fail.
+ throw new ArrayIndexOutOfBoundsException(index);
+ }
+ return valueAtUnchecked(index);
+ }
+
+ /**
+ * Returns the value at the given index in the array without checking that the index is within
+ * bounds. This allows testing values at the end of the internal array, outside of the
+ * [0, mSize) bounds.
+ *
+ * @hide
+ */
+ @TestApi
+ public E valueAtUnchecked(int index) {
return (E) mArray[index];
}
@@ -491,26 +510,40 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
return false;
}
+ /** Returns true if the array size should be decreased. */
+ private boolean shouldShrink() {
+ return mHashes.length > (BASE_SIZE * 2) && mSize < mHashes.length / 3;
+ }
+
+ /**
+ * Returns the new size the array should have. Is only valid if {@link #shouldShrink} returns
+ * true.
+ */
+ private int getNewShrunkenSize() {
+ // We don't allow it to shrink smaller than (BASE_SIZE*2) to avoid flapping between that
+ // and BASE_SIZE.
+ return mSize > (BASE_SIZE * 2) ? (mSize + (mSize >> 1)) : (BASE_SIZE * 2);
+ }
+
/**
* Remove the key/value mapping at the given index.
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value that was stored at this index.
*/
public E removeAt(int index) {
+ if (index >= mSize) {
+ // The array might be slightly bigger than mSize, in which case, indexing won't fail.
+ throw new ArrayIndexOutOfBoundsException(index);
+ }
final Object old = mArray[index];
if (mSize <= 1) {
// Now empty.
if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
- freeArrays(mHashes, mArray, mSize);
- mHashes = EmptyArray.INT;
- mArray = EmptyArray.OBJECT;
- mSize = 0;
+ clear();
} else {
- if (mHashes.length > (BASE_SIZE * 2) && mSize < mHashes.length / 3) {
- // Shrunk enough to reduce size of arrays. We don't allow it to
- // shrink smaller than (BASE_SIZE*2) to avoid flapping between
- // that and BASE_SIZE.
- final int n = mSize > (BASE_SIZE * 2) ? (mSize + (mSize >> 1)) : (BASE_SIZE * 2);
+ if (shouldShrink()) {
+ // Shrunk enough to reduce size of arrays.
+ final int n = getNewShrunkenSize();
if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to " + n);
@@ -568,6 +601,62 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
}
/**
+ * Removes all values that satisfy the predicate. This implementation avoids using the
+ * {@link #iterator()}.
+ *
+ * @param filter A predicate which returns true for elements to be removed
+ */
+ @Override
+ public boolean removeIf(Predicate<? super E> filter) {
+ if (mSize == 0) {
+ return false;
+ }
+
+ // Intentionally not using removeAt() to avoid unnecessary intermediate resizing.
+
+ int replaceIndex = 0;
+ int numRemoved = 0;
+ for (int i = 0; i < mSize; ++i) {
+ if (filter.test((E) mArray[i])) {
+ numRemoved++;
+ } else {
+ if (replaceIndex != i) {
+ mArray[replaceIndex] = mArray[i];
+ mHashes[replaceIndex] = mHashes[i];
+ }
+ replaceIndex++;
+ }
+ }
+
+ if (numRemoved == 0) {
+ return false;
+ } else if (numRemoved == mSize) {
+ clear();
+ return true;
+ }
+
+ mSize -= numRemoved;
+ if (shouldShrink()) {
+ // Shrunk enough to reduce size of arrays.
+ final int n = getNewShrunkenSize();
+ final int[] ohashes = mHashes;
+ final Object[] oarray = mArray;
+ allocArrays(n);
+
+ System.arraycopy(ohashes, 0, mHashes, 0, mSize);
+ System.arraycopy(oarray, 0, mArray, 0, mSize);
+ } else {
+ // Null out values at the end of the array. Not doing it in the loop above to avoid
+ // writing twice to the same index or writing unnecessarily if the array would have been
+ // discarded anyway.
+ for (int i = mSize; i < mArray.length; ++i) {
+ mArray[i] = null;
+ }
+ }
+ return true;
+ }
+
+ /**
* Return the number of items in this array map.
*/
@Override
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index fb44eda5bc73..2d67d79062b9 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -36,6 +36,7 @@ public class FeatureFlagUtils {
public static final String PERSIST_PREFIX = "persist." + FFLAG_OVERRIDE_PREFIX;
public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
public static final String EMERGENCY_DIAL_SHORTCUTS = "settings_emergency_dial_shortcuts";
+ public static final String SCREENRECORD_LONG_PRESS = "settings_screenrecord_long_press";
private static final Map<String, String> DEFAULT_FLAGS;
static {
@@ -50,6 +51,7 @@ public class FeatureFlagUtils {
DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
DEFAULT_FLAGS.put(EMERGENCY_DIAL_SHORTCUTS, "true");
DEFAULT_FLAGS.put("settings_network_and_internet_v2", "false");
+ DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false");
}
/**
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 0c3a2957e1bc..f8bdfe214233 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -88,29 +88,6 @@ interface IWindowManager
void addWindowToken(IBinder token, int type, int displayId);
void removeWindowToken(IBinder token, int displayId);
void prepareAppTransition(int transit, boolean alwaysKeepCurrent);
- int getPendingAppTransition();
- void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim,
- IRemoteCallback startedCallback);
- void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
- int startHeight);
- void overridePendingAppTransitionClipReveal(int startX, int startY,
- int startWidth, int startHeight);
- void overridePendingAppTransitionThumb(in GraphicBuffer srcThumb, int startX, int startY,
- IRemoteCallback startedCallback, boolean scaleUp);
- void overridePendingAppTransitionAspectScaledThumb(in GraphicBuffer srcThumb, int startX,
- int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
- boolean scaleUp);
- /**
- * Overrides animation for app transition that exits from an application to a multi-window
- * environment and allows specifying transition animation parameters for each window.
- *
- * @param specs Array of transition animation descriptions for entering windows.
- *
- * @hide
- */
- void overridePendingAppTransitionMultiThumb(in AppTransitionAnimationSpec[] specs,
- IRemoteCallback startedCallback, IRemoteCallback finishedCallback, boolean scaleUp);
- void overridePendingAppTransitionInPlace(String packageName, int anim);
/**
* Like overridePendingAppTransitionMultiThumb, but uses a future to supply the specs. This is
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index e88682ea6287..a7d0cfbde1d5 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -23,8 +23,11 @@ import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
@@ -204,6 +207,7 @@ public final class AccessibilityManager {
*
* @hide
*/
+ @TestApi
public interface AccessibilityServicesStateChangeListener {
/**
@@ -778,6 +782,7 @@ public final class AccessibilityManager {
* for a callback on the process's main handler.
* @hide
*/
+ @TestApi
public void addAccessibilityServicesStateChangeListener(
@NonNull AccessibilityServicesStateChangeListener listener, @Nullable Handler handler) {
synchronized (mLock) {
@@ -793,6 +798,7 @@ public final class AccessibilityManager {
*
* @hide
*/
+ @TestApi
public void removeAccessibilityServicesStateChangeListener(
@NonNull AccessibilityServicesStateChangeListener listener) {
synchronized (mLock) {
@@ -1056,6 +1062,9 @@ public final class AccessibilityManager {
*
* @hide
*/
+ @SystemApi
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
public void performAccessibilityShortcut() {
final IAccessibilityManager service;
synchronized (mLock) {
@@ -1139,6 +1148,30 @@ public final class AccessibilityManager {
}
}
+ /**
+ * Get the component name of the service currently assigned to the accessibility shortcut.
+ *
+ * @return The flattened component name
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
+ @Nullable
+ public String getAccessibilityShortcutService() {
+ final IAccessibilityManager service;
+ synchronized (mLock) {
+ service = getServiceLocked();
+ }
+ if (service != null) {
+ try {
+ return service.getAccessibilityShortcutService();
+ } catch (RemoteException re) {
+ re.rethrowFromSystemServer();
+ }
+ }
+ return null;
+ }
+
private IAccessibilityManager getServiceLocked() {
if (mService == null) {
tryConnectToServiceLocked(null);
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index 3e2ef186f793..61a8a1da2b42 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -67,9 +67,12 @@ interface IAccessibilityManager {
void notifyAccessibilityButtonVisibilityChanged(boolean available);
- // Requires WRITE_SECURE_SETTINGS
+ // Requires Manifest.permission.MANAGE_ACCESSIBILITY
void performAccessibilityShortcut();
+ // Requires Manifest.permission.MANAGE_ACCESSIBILITY
+ String getAccessibilityShortcutService();
+
// System process only
boolean sendFingerprintGesture(int gestureKeyCode);
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 4cbb097580d6..13409554da28 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -62,6 +62,7 @@ import android.view.autofill.AutofillManager;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.inputmethod.InputMethodDebug;
import com.android.internal.inputmethod.InputMethodPrivilegedOperationsRegistry;
+import com.android.internal.inputmethod.StartInputFlags;
import com.android.internal.inputmethod.StartInputReason;
import com.android.internal.inputmethod.UnbindReason;
import com.android.internal.os.SomeArgs;
@@ -294,30 +295,6 @@ public final class InputMethodManager {
private static final SparseArray<InputMethodManager> sInstanceMap = new SparseArray<>();
/**
- * @hide Flag for IInputMethodManager.windowGainedFocus: a view in
- * the window has input focus.
- */
- public static final int CONTROL_WINDOW_VIEW_HAS_FOCUS = 1<<0;
-
- /**
- * @hide Flag for IInputMethodManager.windowGainedFocus: the focus
- * is a text editor.
- */
- public static final int CONTROL_WINDOW_IS_TEXT_EDITOR = 1<<1;
-
- /**
- * @hide Flag for IInputMethodManager.windowGainedFocus: this is the first
- * time the window has gotten focus.
- */
- public static final int CONTROL_WINDOW_FIRST = 1<<2;
-
- /**
- * @hide Flag for IInputMethodManager.startInput: this is the first
- * time the window has gotten focus.
- */
- public static final int CONTROL_START_INITIAL = 1<<8;
-
- /**
* Timeout in milliseconds for delivering a key to an IME.
*/
static final long INPUT_METHOD_NOT_RESPONDING_TIMEOUT = 2500;
@@ -1446,8 +1423,8 @@ public final class InputMethodManager {
}
boolean startInputInner(@StartInputReason int startInputReason,
- @Nullable IBinder windowGainingFocus, int controlFlags, int softInputMode,
- int windowFlags) {
+ @Nullable IBinder windowGainingFocus, @StartInputFlags int startInputFlags,
+ @SoftInputModeFlags int softInputMode, int windowFlags) {
final View view;
synchronized (mH) {
view = mServedView;
@@ -1469,9 +1446,9 @@ public final class InputMethodManager {
Log.e(TAG, "ABORT input: ServedView must be attached to a Window");
return false;
}
- controlFlags |= CONTROL_WINDOW_VIEW_HAS_FOCUS;
+ startInputFlags |= StartInputFlags.VIEW_HAS_FOCUS;
if (view.onCheckIsTextEditor()) {
- controlFlags |= CONTROL_WINDOW_IS_TEXT_EDITOR;
+ startInputFlags |= StartInputFlags.IS_TEXT_EDITOR;
}
softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode;
windowFlags = view.getViewRootImpl().mWindowAttributes.flags;
@@ -1526,7 +1503,7 @@ public final class InputMethodManager {
// If we already have a text box, then this view is already
// connected so we want to restart it.
if (mCurrentTextBoxAttribute == null) {
- controlFlags |= CONTROL_START_INITIAL;
+ startInputFlags |= StartInputFlags.INITIAL_CONNECTION;
}
// Hook 'em up and let 'er rip.
@@ -1564,11 +1541,11 @@ public final class InputMethodManager {
try {
if (DEBUG) Log.v(TAG, "START INPUT: view=" + dumpViewInfo(view) + " ic="
- + ic + " tba=" + tba + " controlFlags=#"
- + Integer.toHexString(controlFlags));
+ + ic + " tba=" + tba + " startInputFlags="
+ + InputMethodDebug.startInputFlagsToString(startInputFlags));
final InputBindResult res = mService.startInputOrWindowGainedFocus(
- startInputReason, mClient, windowGainingFocus, controlFlags, softInputMode,
- windowFlags, tba, servedContext, missingMethodFlags,
+ startInputReason, mClient, windowGainingFocus, startInputFlags,
+ softInputMode, windowFlags, tba, servedContext, missingMethodFlags,
view.getContext().getApplicationInfo().targetSdkVersion);
if (DEBUG) Log.v(TAG, "Starting input: Bind result=" + res);
if (res == null) {
@@ -1576,7 +1553,8 @@ public final class InputMethodManager {
+ " null. startInputReason="
+ InputMethodDebug.startInputReasonToString(startInputReason)
+ " editorInfo=" + tba
- + " controlFlags=#" + Integer.toHexString(controlFlags));
+ + " startInputFlags="
+ + InputMethodDebug.startInputFlagsToString(startInputFlags));
return false;
}
if (res.id != null) {
@@ -1783,15 +1761,15 @@ public final class InputMethodManager {
focusInLocked(focusedView != null ? focusedView : rootView);
}
- int controlFlags = 0;
+ int startInputFlags = 0;
if (focusedView != null) {
- controlFlags |= CONTROL_WINDOW_VIEW_HAS_FOCUS;
+ startInputFlags |= StartInputFlags.VIEW_HAS_FOCUS;
if (focusedView.onCheckIsTextEditor()) {
- controlFlags |= CONTROL_WINDOW_IS_TEXT_EDITOR;
+ startInputFlags |= StartInputFlags.IS_TEXT_EDITOR;
}
}
if (first) {
- controlFlags |= CONTROL_WINDOW_FIRST;
+ startInputFlags |= StartInputFlags.FIRST_WINDOW_FOCUS_GAIN;
}
if (checkFocusNoStartInput(forceNewFocus)) {
@@ -1800,7 +1778,7 @@ public final class InputMethodManager {
// about the window gaining focus, to help make the transition
// smooth.
if (startInputInner(StartInputReason.WINDOW_FOCUS_GAIN, rootView.getWindowToken(),
- controlFlags, softInputMode, windowFlags)) {
+ startInputFlags, softInputMode, windowFlags)) {
return;
}
}
@@ -1812,8 +1790,8 @@ public final class InputMethodManager {
if (DEBUG) Log.v(TAG, "Reporting focus gain, without startInput");
mService.startInputOrWindowGainedFocus(
StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
- rootView.getWindowToken(), controlFlags, softInputMode, windowFlags, null,
- null, 0 /* missingMethodFlags */,
+ rootView.getWindowToken(), startInputFlags, softInputMode, windowFlags,
+ null, null, 0 /* missingMethodFlags */,
rootView.getContext().getApplicationInfo().targetSdkVersion);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/view/textclassifier/ConversationActions.java b/core/java/android/view/textclassifier/ConversationActions.java
new file mode 100644
index 000000000000..5fcf22771ec1
--- /dev/null
+++ b/core/java/android/view/textclassifier/ConversationActions.java
@@ -0,0 +1,779 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.StringDef;
+import android.app.Person;
+import android.app.RemoteAction;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.SpannedString;
+import android.util.ArraySet;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Represents a list of actions suggested by a {@link TextClassifier} on a given conversation.
+ *
+ * @see TextClassifier#suggestConversationActions(Request)
+ */
+public final class ConversationActions implements Parcelable {
+
+ public static final Creator<ConversationActions> CREATOR =
+ new Creator<ConversationActions>() {
+ @Override
+ public ConversationActions createFromParcel(Parcel in) {
+ return new ConversationActions(in);
+ }
+
+ @Override
+ public ConversationActions[] newArray(int size) {
+ return new ConversationActions[size];
+ }
+ };
+
+ /** @hide */
+ @Retention(SOURCE)
+ @StringDef(
+ value = {
+ TYPE_VIEW_CALENDAR,
+ TYPE_VIEW_MAP,
+ TYPE_TRACK_FLIGHT,
+ TYPE_OPEN_URL,
+ TYPE_SEND_SMS,
+ TYPE_CALL_PHONE,
+ TYPE_SEND_EMAIL,
+ TYPE_TEXT_REPLY,
+ TYPE_CREATE_REMINDER,
+ TYPE_SHARE_LOCATION
+ },
+ prefix = "TYPE_")
+ public @interface ActionType {}
+
+ /**
+ * Indicates an action to view a calendar at a specified time.
+ */
+ public static final String TYPE_VIEW_CALENDAR = "view_calendar";
+ /**
+ * Indicates an action to view the map at a specified location.
+ */
+ public static final String TYPE_VIEW_MAP = "view_map";
+ /**
+ * Indicates an action to track a flight.
+ */
+ public static final String TYPE_TRACK_FLIGHT = "track_flight";
+ /**
+ * Indicates an action to open an URL.
+ */
+ public static final String TYPE_OPEN_URL = "open_url";
+ /**
+ * Indicates an action to send a SMS.
+ */
+ public static final String TYPE_SEND_SMS = "send_sms";
+ /**
+ * Indicates an action to call a phone number.
+ */
+ public static final String TYPE_CALL_PHONE = "call_phone";
+ /**
+ * Indicates an action to send an email.
+ */
+ public static final String TYPE_SEND_EMAIL = "send_email";
+ /**
+ * Indicates an action to reply with a text message.
+ */
+ public static final String TYPE_TEXT_REPLY = "text_reply";
+ /**
+ * Indicates an action to create a reminder.
+ */
+ public static final String TYPE_CREATE_REMINDER = "create_reminder";
+ /**
+ * Indicates an action to reply with a location.
+ */
+ public static final String TYPE_SHARE_LOCATION = "share_location";
+
+ /** @hide */
+ @Retention(SOURCE)
+ @StringDef(
+ value = {
+ HINT_FOR_NOTIFICATION,
+ HINT_FOR_IN_APP,
+ },
+ prefix = "HINT_")
+ public @interface Hint {}
+ /**
+ * To indicate the generated actions will be used within the app.
+ */
+ public static final String HINT_FOR_IN_APP = "in_app";
+ /**
+ * To indicate the generated actions will be used for notification.
+ */
+ public static final String HINT_FOR_NOTIFICATION = "notification";
+
+ private List<ConversationAction> mConversationActions;
+
+ /** Constructs a {@link ConversationActions} object. */
+ public ConversationActions(@NonNull List<ConversationAction> conversationActions) {
+ mConversationActions =
+ Collections.unmodifiableList(Preconditions.checkNotNull(conversationActions));
+ }
+
+ private ConversationActions(Parcel in) {
+ mConversationActions =
+ Collections.unmodifiableList(in.createTypedArrayList(ConversationAction.CREATOR));
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeTypedList(mConversationActions);
+ }
+
+ /** Returns an immutable list of {@link ConversationAction} objects. */
+ @NonNull
+ public List<ConversationAction> getConversationActions() {
+ return mConversationActions;
+ }
+
+ /** Represents the action suggested by a {@link TextClassifier} on a given conversation. */
+ public static final class ConversationAction implements Parcelable {
+
+ public static final Creator<ConversationAction> CREATOR =
+ new Creator<ConversationAction>() {
+ @Override
+ public ConversationAction createFromParcel(Parcel in) {
+ return new ConversationAction(in);
+ }
+
+ @Override
+ public ConversationAction[] newArray(int size) {
+ return new ConversationAction[size];
+ }
+ };
+
+ @NonNull
+ @ActionType
+ private final String mType;
+ @NonNull
+ private final CharSequence mTextReply;
+ @Nullable
+ private final RemoteAction mAction;
+
+ @FloatRange(from = 0, to = 1)
+ private final float mScore;
+
+ @NonNull
+ private final Bundle mExtras;
+
+ private ConversationAction(
+ @NonNull String type,
+ @Nullable RemoteAction action,
+ @Nullable CharSequence textReply,
+ float score,
+ @NonNull Bundle extras) {
+ mType = Preconditions.checkNotNull(type);
+ mAction = action;
+ mTextReply = textReply;
+ mScore = score;
+ mExtras = Preconditions.checkNotNull(extras);
+ }
+
+ private ConversationAction(Parcel in) {
+ mType = in.readString();
+ mAction = in.readParcelable(null);
+ mTextReply = in.readCharSequence();
+ mScore = in.readFloat();
+ mExtras = in.readBundle();
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeString(mType);
+ parcel.writeParcelable(mAction, flags);
+ parcel.writeCharSequence(mTextReply);
+ parcel.writeFloat(mScore);
+ parcel.writeBundle(mExtras);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @NonNull
+ @ActionType
+ /** Returns the type of this action, for example, {@link #TYPE_VIEW_CALENDAR}. */
+ public String getType() {
+ return mType;
+ }
+
+ @Nullable
+ /**
+ * Returns a RemoteAction object, which contains the icon, label and a PendingIntent, for
+ * the specified action type.
+ */
+ public RemoteAction getAction() {
+ return mAction;
+ }
+
+ /**
+ * Returns the confidence score for the specified action. The value ranges from 0 (low
+ * confidence) to 1 (high confidence).
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getConfidenceScore() {
+ return mScore;
+ }
+
+ /**
+ * Returns the text reply that could be sent as a reply to the given conversation.
+ * <p>
+ * This is only available when the type of the action is {@link #TYPE_TEXT_REPLY}.
+ */
+ @Nullable
+ public CharSequence getTextReply() {
+ return mTextReply;
+ }
+
+ /**
+ * Returns the extended data related to this conversation action.
+ *
+ * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
+ * prefer to hold a reference to the returned bundle rather than frequently calling this
+ * method.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras.deepCopy();
+ }
+
+ /** Builder class to construct {@link ConversationAction}. */
+ public static final class Builder {
+ @Nullable
+ @ActionType
+ private String mType;
+ @Nullable
+ private RemoteAction mAction;
+ @Nullable
+ private CharSequence mTextReply;
+ private float mScore;
+ @Nullable
+ private Bundle mExtras;
+
+ public Builder(@NonNull @ActionType String actionType) {
+ mType = Preconditions.checkNotNull(actionType);
+ }
+
+ /**
+ * Sets an action that may be performed on the given conversation.
+ */
+ @NonNull
+ public Builder setAction(@Nullable RemoteAction action) {
+ mAction = action;
+ return this;
+ }
+
+ /**
+ * Sets a text reply that may be performed on the given conversation.
+ */
+ @NonNull
+ public Builder setTextReply(@Nullable CharSequence textReply) {
+ mTextReply = textReply;
+ return this;
+ }
+
+ /** Sets the confident score. */
+ @NonNull
+ public Builder setConfidenceScore(@FloatRange(from = 0, to = 1) float score) {
+ mScore = score;
+ return this;
+ }
+
+ /**
+ * Sets the extended data for the conversation action object.
+ */
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /** Builds the {@link ConversationAction} object. */
+ @NonNull
+ public ConversationAction build() {
+ return new ConversationAction(
+ mType,
+ mAction,
+ mTextReply,
+ mScore,
+ mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
+ }
+ }
+ }
+
+ /** Represents a message in the conversation. */
+ public static final class Message implements Parcelable {
+ @Nullable
+ private final Person mAuthor;
+ @Nullable
+ private final ZonedDateTime mComposeTime;
+ @Nullable
+ private final CharSequence mText;
+ @NonNull
+ private final Bundle mExtras;
+
+ private Message(
+ @Nullable Person author,
+ @Nullable ZonedDateTime composeTime,
+ @Nullable CharSequence text,
+ @NonNull Bundle bundle) {
+ mAuthor = author;
+ mComposeTime = composeTime;
+ mText = text;
+ mExtras = Preconditions.checkNotNull(bundle);
+ }
+
+ private Message(Parcel in) {
+ mAuthor = in.readParcelable(null);
+ mComposeTime =
+ in.readInt() == 0
+ ? null
+ : ZonedDateTime.parse(
+ in.readString(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
+ mText = in.readCharSequence();
+ mExtras = in.readBundle();
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelable(mAuthor, flags);
+ parcel.writeInt(mComposeTime != null ? 1 : 0);
+ if (mComposeTime != null) {
+ parcel.writeString(mComposeTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
+ }
+ parcel.writeCharSequence(mText);
+ parcel.writeBundle(mExtras);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<Message> CREATOR =
+ new Creator<Message>() {
+ @Override
+ public Message createFromParcel(Parcel in) {
+ return new Message(in);
+ }
+
+ @Override
+ public Message[] newArray(int size) {
+ return new Message[size];
+ }
+ };
+
+ /** Returns the person that composed the message. */
+ @Nullable
+ public Person getAuthor() {
+ return mAuthor;
+ }
+
+ /** Returns the compose time of the message. */
+ @Nullable
+ public ZonedDateTime getTime() {
+ return mComposeTime;
+ }
+
+ /** Returns the text of the message. */
+ @Nullable
+ public CharSequence getText() {
+ return mText;
+ }
+
+ /**
+ * Returns the extended data related to this conversation action.
+ *
+ * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
+ * prefer to hold a reference to the returned bundle rather than frequently calling this
+ * method.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras.deepCopy();
+ }
+
+ /** Builder class to construct a {@link Message} */
+ public static final class Builder {
+ @Nullable
+ private Person mAuthor;
+ @Nullable
+ private ZonedDateTime mComposeTime;
+ @Nullable
+ private CharSequence mText;
+ @Nullable
+ private Bundle mExtras;
+
+ /** Sets the person who composed this message. */
+ @NonNull
+ public Builder setAuthor(@Nullable Person author) {
+ mAuthor = author;
+ return this;
+ }
+
+ /** Sets the text of this message */
+ @NonNull
+ public Builder setText(@Nullable CharSequence text) {
+ mText = text;
+ return this;
+ }
+
+ /** Sets the compose time of this message */
+ @NonNull
+ public Builder setComposeTime(@Nullable ZonedDateTime composeTime) {
+ mComposeTime = composeTime;
+ return this;
+ }
+
+ /** Sets a set of extended data to the message. */
+ @NonNull
+ public Builder setExtras(@Nullable Bundle bundle) {
+ this.mExtras = bundle;
+ return this;
+ }
+
+ /** Builds the {@link Message} object. */
+ @NonNull
+ public Message build() {
+ return new Message(
+ mAuthor,
+ mComposeTime,
+ mText == null ? null : new SpannedString(mText),
+ mExtras == null ? new Bundle() : mExtras.deepCopy());
+ }
+ }
+ }
+
+ /** Configuration object for specifying what action types to identify. */
+ public static final class TypeConfig implements Parcelable {
+ @NonNull
+ @ActionType
+ private final Set<String> mExcludedTypes;
+ @NonNull
+ @ActionType
+ private final Set<String> mIncludedTypes;
+ private final boolean mIncludeTypesFromTextClassifier;
+
+ private TypeConfig(
+ @NonNull Set<String> includedTypes,
+ @NonNull Set<String> excludedTypes,
+ boolean includeTypesFromTextClassifier) {
+ mIncludedTypes = Preconditions.checkNotNull(includedTypes);
+ mExcludedTypes = Preconditions.checkNotNull(excludedTypes);
+ mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
+ }
+
+ private TypeConfig(Parcel in) {
+ mIncludedTypes = new ArraySet<>(in.createStringArrayList());
+ mExcludedTypes = new ArraySet<>(in.createStringArrayList());
+ mIncludeTypesFromTextClassifier = in.readByte() != 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeStringList(new ArrayList<>(mIncludedTypes));
+ parcel.writeStringList(new ArrayList<>(mExcludedTypes));
+ parcel.writeByte((byte) (mIncludeTypesFromTextClassifier ? 1 : 0));
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<TypeConfig> CREATOR =
+ new Creator<TypeConfig>() {
+ @Override
+ public TypeConfig createFromParcel(Parcel in) {
+ return new TypeConfig(in);
+ }
+
+ @Override
+ public TypeConfig[] newArray(int size) {
+ return new TypeConfig[size];
+ }
+ };
+
+ /**
+ * Returns a final list of types that the text classifier should look for.
+ *
+ * <p>NOTE: This method is intended for use by a text classifier.
+ *
+ * @param defaultTypes types the text classifier thinks should be included before factoring
+ * in the included/excluded types given by the client.
+ */
+ @NonNull
+ public Collection<String> resolveTypes(@Nullable Collection<String> defaultTypes) {
+ Set<String> types = new ArraySet<>();
+ if (mIncludeTypesFromTextClassifier && defaultTypes != null) {
+ types.addAll(defaultTypes);
+ }
+ types.addAll(mIncludedTypes);
+ types.removeAll(mExcludedTypes);
+ return Collections.unmodifiableCollection(types);
+ }
+
+ /**
+ * Return whether the client allows the text classifier to include its own list of default
+ * types. If this function returns {@code true}, the text classifier can consider specifying
+ * a default list of entity types in {@link #resolveTypes(Collection)}.
+ *
+ * <p>NOTE: This method is intended for use by a text classifier.
+ *
+ * @see #resolveTypes(Collection)
+ */
+ public boolean shouldIncludeTypesFromTextClassifier() {
+ return mIncludeTypesFromTextClassifier;
+ }
+
+ /** Builder class to construct the {@link TypeConfig} object. */
+ public static final class Builder {
+ @Nullable
+ private Collection<String> mExcludedTypes;
+ @Nullable
+ private Collection<String> mIncludedTypes;
+ private boolean mIncludeTypesFromTextClassifier = true;
+
+ /**
+ * Sets a collection of types that are explicitly included, for example, {@link
+ * #TYPE_VIEW_CALENDAR}.
+ */
+ @NonNull
+ public Builder setIncludedTypes(
+ @Nullable @ActionType Collection<String> includedTypes) {
+ mIncludedTypes = includedTypes;
+ return this;
+ }
+
+ /**
+ * Sets a collection of types that are explicitly excluded, for example, {@link
+ * #TYPE_VIEW_CALENDAR}.
+ */
+ @NonNull
+ public Builder setExcludedTypes(
+ @Nullable @ActionType Collection<String> excludedTypes) {
+ mExcludedTypes = excludedTypes;
+ return this;
+ }
+
+ /**
+ * Specifies whether or not to include the types suggested by the text classifier. By
+ * default, it is included.
+ */
+ @NonNull
+ public Builder includeTypesFromTextClassifier(boolean includeTypesFromTextClassifier) {
+ mIncludeTypesFromTextClassifier = includeTypesFromTextClassifier;
+ return this;
+ }
+
+ /**
+ * Combines all of the options that have been set and returns a new {@link TypeConfig}
+ * object.
+ */
+ @NonNull
+ public TypeConfig build() {
+ return new TypeConfig(
+ mIncludedTypes == null
+ ? Collections.emptySet()
+ : new ArraySet<>(mIncludedTypes),
+ mExcludedTypes == null
+ ? Collections.emptySet()
+ : new ArraySet<>(mExcludedTypes),
+ mIncludeTypesFromTextClassifier);
+ }
+ }
+ }
+
+ /**
+ * A request object for generating conversation action suggestions.
+ *
+ * @see TextClassifier#suggestConversationActions(Request)
+ */
+ public static final class Request implements Parcelable {
+ @NonNull
+ private final List<Message> mConversation;
+ @NonNull
+ private final TypeConfig mTypeConfig;
+ private final int mMaxSuggestions;
+ @NonNull
+ @Hint
+ private final List<String> mHints;
+
+ private Request(
+ @NonNull List<Message> conversation,
+ @NonNull TypeConfig typeConfig,
+ int maxSuggestions,
+ @Nullable @Hint List<String> hints) {
+ mConversation = Preconditions.checkNotNull(conversation);
+ mTypeConfig = Preconditions.checkNotNull(typeConfig);
+ mMaxSuggestions = maxSuggestions;
+ mHints = hints;
+ }
+
+ private Request(Parcel in) {
+ List<Message> conversation = new ArrayList<>();
+ in.readParcelableList(conversation, null);
+ mConversation = Collections.unmodifiableList(conversation);
+ mTypeConfig = in.readParcelable(null);
+ mMaxSuggestions = in.readInt();
+ List<String> hints = new ArrayList<>();
+ in.readStringList(hints);
+ mHints = Collections.unmodifiableList(hints);
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelableList(mConversation, flags);
+ parcel.writeParcelable(mTypeConfig, flags);
+ parcel.writeInt(mMaxSuggestions);
+ parcel.writeStringList(mHints);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Creator<Request> CREATOR =
+ new Creator<Request>() {
+ @Override
+ public Request createFromParcel(Parcel in) {
+ return new Request(in);
+ }
+
+ @Override
+ public Request[] newArray(int size) {
+ return new Request[size];
+ }
+ };
+
+ /** Returns the type config. */
+ @NonNull
+ public TypeConfig getTypeConfig() {
+ return mTypeConfig;
+ }
+
+ /** Returns an immutable list of messages that make up the conversation. */
+ @NonNull
+ public List<Message> getConversation() {
+ return mConversation;
+ }
+
+ /**
+ * Return the maximal number of suggestions the caller wants, value 0 means no restriction.
+ */
+ @IntRange(from = 0)
+ public int getMaxSuggestions() {
+ return mMaxSuggestions;
+ }
+
+ /** Returns an immutable list of hints */
+ @Nullable
+ @Hint
+ public List<String> getHints() {
+ return mHints;
+ }
+
+ /** Builder object to construct the {@link Request} object. */
+ public static final class Builder {
+ @NonNull
+ private List<Message> mConversation;
+ @Nullable
+ private TypeConfig mTypeConfig;
+ private int mMaxSuggestions;
+ @Nullable
+ @Hint
+ private List<String> mHints;
+
+ /**
+ * Constructs a builder.
+ *
+ * @param conversation the conversation that the text classifier is going to generate
+ * actions for.
+ */
+ public Builder(@NonNull List<Message> conversation) {
+ mConversation = Preconditions.checkNotNull(conversation);
+ }
+
+ /**
+ * Sets the hints to help text classifier to generate actions. It could be used to help
+ * text classifier to infer what types of actions the caller may be interested in.
+ */
+ public Builder setHints(@Nullable @Hint List<String> hints) {
+ mHints = hints;
+ return this;
+ }
+
+ /** Sets the type config. */
+ @NonNull
+ public Builder setTypeConfig(@Nullable TypeConfig typeConfig) {
+ mTypeConfig = typeConfig;
+ return this;
+ }
+
+ /** Sets the maximum number of suggestions you want.
+ * <p>
+ * Value 0 means no restriction.
+ */
+ @NonNull
+ public Builder setMaxSuggestions(@IntRange(from = 0) int maxSuggestions) {
+ mMaxSuggestions = Preconditions.checkArgumentNonnegative(maxSuggestions);
+ return this;
+ }
+
+ /** Builds the {@link Request} object. */
+ @NonNull
+ public Request build() {
+ return new Request(
+ Collections.unmodifiableList(mConversation),
+ mTypeConfig == null ? new TypeConfig.Builder().build() : mTypeConfig,
+ mMaxSuggestions,
+ mHints == null
+ ? Collections.emptyList()
+ : Collections.unmodifiableList(mHints));
+ }
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/ModelFileManager.java b/core/java/android/view/textclassifier/ModelFileManager.java
new file mode 100644
index 000000000000..adea1259b943
--- /dev/null
+++ b/core/java/android/view/textclassifier/ModelFileManager.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static android.view.textclassifier.TextClassifier.DEFAULT_LOG_TAG;
+
+import android.annotation.Nullable;
+import android.os.LocaleList;
+import android.os.ParcelFileDescriptor;
+import android.text.TextUtils;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.StringJoiner;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Manages model files that are listed by the model files supplier.
+ * @hide
+ */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public final class ModelFileManager {
+ private final Object mLock = new Object();
+ private final Supplier<List<ModelFile>> mModelFileSupplier;
+
+ private List<ModelFile> mModelFiles;
+
+ public ModelFileManager(Supplier<List<ModelFile>> modelFileSupplier) {
+ mModelFileSupplier = Preconditions.checkNotNull(modelFileSupplier);
+ }
+
+ /**
+ * Returns an unmodifiable list of model files listed by the given model files supplier.
+ * <p>
+ * The result is cached.
+ */
+ public List<ModelFile> listModelFiles() {
+ synchronized (mLock) {
+ if (mModelFiles == null) {
+ mModelFiles = Collections.unmodifiableList(mModelFileSupplier.get());
+ }
+ return mModelFiles;
+ }
+ }
+
+ /**
+ * Returns the best model file for the given localelist, {@code null} if nothing is found.
+ *
+ * @param localeList the required locales, use {@code null} if there is no preference.
+ */
+ public ModelFile findBestModelFile(@Nullable LocaleList localeList) {
+ // Specified localeList takes priority over the system default, so it is listed first.
+ final String languages = localeList == null || localeList.isEmpty()
+ ? LocaleList.getDefault().toLanguageTags()
+ : localeList.toLanguageTags() + "," + LocaleList.getDefault().toLanguageTags();
+ final List<Locale.LanguageRange> languageRangeList = Locale.LanguageRange.parse(languages);
+
+ ModelFile bestModel = null;
+ for (ModelFile model : listModelFiles()) {
+ if (model.isAnyLanguageSupported(languageRangeList)) {
+ if (model.isPreferredTo(bestModel)) {
+ bestModel = model;
+ }
+ }
+ }
+ return bestModel;
+ }
+
+ /**
+ * Default implementation of the model file supplier.
+ */
+ public static final class ModelFileSupplierImpl implements Supplier<List<ModelFile>> {
+ private final File mUpdatedModelFile;
+ private final File mFactoryModelDir;
+ private final Pattern mModelFilenamePattern;
+ private final Function<Integer, Integer> mVersionSupplier;
+ private final Function<Integer, String> mSupportedLocalesSupplier;
+
+ public ModelFileSupplierImpl(
+ File factoryModelDir,
+ String factoryModelFileNameRegex,
+ File updatedModelFile,
+ Function<Integer, Integer> versionSupplier,
+ Function<Integer, String> supportedLocalesSupplier) {
+ mUpdatedModelFile = Preconditions.checkNotNull(updatedModelFile);
+ mFactoryModelDir = Preconditions.checkNotNull(factoryModelDir);
+ mModelFilenamePattern = Pattern.compile(
+ Preconditions.checkNotNull(factoryModelFileNameRegex));
+ mVersionSupplier = Preconditions.checkNotNull(versionSupplier);
+ mSupportedLocalesSupplier = Preconditions.checkNotNull(supportedLocalesSupplier);
+ }
+
+ @Override
+ public List<ModelFile> get() {
+ final List<ModelFile> modelFiles = new ArrayList<>();
+ // The update model has the highest precedence.
+ if (mUpdatedModelFile.exists()) {
+ final ModelFile updatedModel = createModelFile(mUpdatedModelFile);
+ if (updatedModel != null) {
+ modelFiles.add(updatedModel);
+ }
+ }
+ // Factory models should never have overlapping locales, so the order doesn't matter.
+ if (mFactoryModelDir.exists() && mFactoryModelDir.isDirectory()) {
+ final File[] files = mFactoryModelDir.listFiles();
+ for (File file : files) {
+ final Matcher matcher = mModelFilenamePattern.matcher(file.getName());
+ if (matcher.matches() && file.isFile()) {
+ final ModelFile model = createModelFile(file);
+ if (model != null) {
+ modelFiles.add(model);
+ }
+ }
+ }
+ }
+ return modelFiles;
+ }
+
+ /** Returns null if the path did not point to a compatible model. */
+ @Nullable
+ private ModelFile createModelFile(File file) {
+ if (!file.exists()) {
+ return null;
+ }
+ ParcelFileDescriptor modelFd = null;
+ try {
+ modelFd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ if (modelFd == null) {
+ return null;
+ }
+ final int modelFdInt = modelFd.getFd();
+ final int version = mVersionSupplier.apply(modelFdInt);
+ final String supportedLocalesStr = mSupportedLocalesSupplier.apply(modelFdInt);
+ if (supportedLocalesStr.isEmpty()) {
+ Log.d(DEFAULT_LOG_TAG, "Ignoring " + file.getAbsolutePath());
+ return null;
+ }
+ final List<Locale> supportedLocales = new ArrayList<>();
+ for (String langTag : supportedLocalesStr.split(",")) {
+ supportedLocales.add(Locale.forLanguageTag(langTag));
+ }
+ return new ModelFile(
+ file,
+ version,
+ supportedLocales,
+ ModelFile.LANGUAGE_INDEPENDENT.equals(supportedLocalesStr));
+ } catch (FileNotFoundException e) {
+ Log.e(DEFAULT_LOG_TAG, "Failed to find " + file.getAbsolutePath(), e);
+ return null;
+ } finally {
+ maybeCloseAndLogError(modelFd);
+ }
+ }
+
+ /**
+ * Closes the ParcelFileDescriptor, if non-null, and logs any errors that occur.
+ */
+ private static void maybeCloseAndLogError(@Nullable ParcelFileDescriptor fd) {
+ if (fd == null) {
+ return;
+ }
+ try {
+ fd.close();
+ } catch (IOException e) {
+ Log.e(DEFAULT_LOG_TAG, "Error closing file.", e);
+ }
+ }
+
+ }
+
+ /**
+ * Describes TextClassifier model files on disk.
+ */
+ public static final class ModelFile {
+ public static final String LANGUAGE_INDEPENDENT = "*";
+
+ private final File mFile;
+ private final int mVersion;
+ private final List<Locale> mSupportedLocales;
+ private final boolean mLanguageIndependent;
+
+ public ModelFile(File file, int version, List<Locale> supportedLocales,
+ boolean languageIndependent) {
+ mFile = Preconditions.checkNotNull(file);
+ mVersion = version;
+ mSupportedLocales = Preconditions.checkNotNull(supportedLocales);
+ mLanguageIndependent = languageIndependent;
+ }
+
+ /** Returns the absolute path to the model file. */
+ public String getPath() {
+ return mFile.getAbsolutePath();
+ }
+
+ /** Returns a name to use for id generation, effectively the name of the model file. */
+ public String getName() {
+ return mFile.getName();
+ }
+
+ /** Returns the version tag in the model's metadata. */
+ public int getVersion() {
+ return mVersion;
+ }
+
+ /** Returns whether the language supports any language in the given ranges. */
+ public boolean isAnyLanguageSupported(List<Locale.LanguageRange> languageRanges) {
+ Preconditions.checkNotNull(languageRanges);
+ return mLanguageIndependent || Locale.lookup(languageRanges, mSupportedLocales) != null;
+ }
+
+ /** Returns an immutable lists of supported locales. */
+ public List<Locale> getSupportedLocales() {
+ return Collections.unmodifiableList(mSupportedLocales);
+ }
+
+ /**
+ * Returns if this model file is preferred to the given one.
+ */
+ public boolean isPreferredTo(@Nullable ModelFile model) {
+ // A model is preferred to no model.
+ if (model == null) {
+ return true;
+ }
+
+ // A language-specific model is preferred to a language independent
+ // model.
+ if (!mLanguageIndependent && model.mLanguageIndependent) {
+ return true;
+ }
+
+ // A higher-version model is preferred.
+ if (mVersion > model.getVersion()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getPath());
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other instanceof ModelFile) {
+ final ModelFile otherModel = (ModelFile) other;
+ return TextUtils.equals(getPath(), otherModel.getPath());
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ final StringJoiner localesJoiner = new StringJoiner(",");
+ for (Locale locale : mSupportedLocales) {
+ localesJoiner.add(locale.toLanguageTag());
+ }
+ return String.format(Locale.US,
+ "ModelFile { path=%s name=%s version=%d locales=%s }",
+ getPath(), getName(), mVersion, localesJoiner.toString());
+ }
+ }
+}
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index 9511a9efb3d5..f6c3d770d2a8 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -33,6 +33,7 @@ import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
@@ -126,6 +127,7 @@ public final class TextClassification implements Parcelable {
@NonNull private final List<RemoteAction> mActions;
@NonNull private final EntityConfidence mEntityConfidence;
@Nullable private final String mId;
+ @NonNull private final Bundle mExtras;
private TextClassification(
@Nullable String text,
@@ -135,7 +137,8 @@ public final class TextClassification implements Parcelable {
@Nullable OnClickListener legacyOnClickListener,
@NonNull List<RemoteAction> actions,
@NonNull Map<String, Float> entityConfidence,
- @Nullable String id) {
+ @Nullable String id,
+ @NonNull Bundle extras) {
mText = text;
mLegacyIcon = legacyIcon;
mLegacyLabel = legacyLabel;
@@ -144,6 +147,7 @@ public final class TextClassification implements Parcelable {
mActions = Collections.unmodifiableList(actions);
mEntityConfidence = new EntityConfidence(entityConfidence);
mId = id;
+ mExtras = extras;
}
/**
@@ -255,6 +259,18 @@ public final class TextClassification implements Parcelable {
return mId;
}
+ /**
+ * Returns the extended data.
+ *
+ * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
+ * prefer to hold a reference to the returned bundle rather than frequently calling this
+ * method.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras.deepCopy();
+ }
+
@Override
public String toString() {
return String.format(Locale.US,
@@ -359,6 +375,7 @@ public final class TextClassification implements Parcelable {
@Nullable private Intent mLegacyIntent;
@Nullable private OnClickListener mLegacyOnClickListener;
@Nullable private String mId;
+ @Nullable private Bundle mExtras;
/**
* Sets the classified text.
@@ -471,12 +488,22 @@ public final class TextClassification implements Parcelable {
}
/**
+ * Sets the extended data.
+ */
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
* Builds and returns a {@link TextClassification} object.
*/
@NonNull
public TextClassification build() {
return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent,
- mLegacyOnClickListener, mActions, mEntityConfidence, mId);
+ mLegacyOnClickListener, mActions, mEntityConfidence, mId,
+ mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
}
}
@@ -490,18 +517,21 @@ public final class TextClassification implements Parcelable {
private final int mEndIndex;
@Nullable private final LocaleList mDefaultLocales;
@Nullable private final ZonedDateTime mReferenceTime;
+ @NonNull private final Bundle mExtras;
private Request(
CharSequence text,
int startIndex,
int endIndex,
LocaleList defaultLocales,
- ZonedDateTime referenceTime) {
+ ZonedDateTime referenceTime,
+ Bundle extras) {
mText = text;
mStartIndex = startIndex;
mEndIndex = endIndex;
mDefaultLocales = defaultLocales;
mReferenceTime = referenceTime;
+ mExtras = extras;
}
/**
@@ -548,6 +578,18 @@ public final class TextClassification implements Parcelable {
}
/**
+ * Returns the extended data.
+ *
+ * <p><b>NOTE: </b>Each call to this method returns a new bundle copy so clients should
+ * prefer to hold a reference to the returned bundle rather than frequently calling this
+ * method.
+ */
+ @NonNull
+ public Bundle getExtras() {
+ return mExtras.deepCopy();
+ }
+
+ /**
* A builder for building TextClassification requests.
*/
public static final class Builder {
@@ -555,6 +597,7 @@ public final class TextClassification implements Parcelable {
private final CharSequence mText;
private final int mStartIndex;
private final int mEndIndex;
+ private Bundle mExtras;
@Nullable private LocaleList mDefaultLocales;
@Nullable private ZonedDateTime mReferenceTime;
@@ -602,11 +645,23 @@ public final class TextClassification implements Parcelable {
}
/**
+ * Sets the extended data.
+ *
+ * @return this builder
+ */
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
+ mExtras = extras;
+ return this;
+ }
+
+ /**
* Builds and returns the request object.
*/
@NonNull
public Request build() {
- return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime);
+ return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime,
+ mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
}
}
@@ -628,6 +683,7 @@ public final class TextClassification implements Parcelable {
if (mReferenceTime != null) {
dest.writeString(mReferenceTime.toString());
}
+ dest.writeBundle(mExtras);
}
public static final Parcelable.Creator<Request> CREATOR =
@@ -649,6 +705,7 @@ public final class TextClassification implements Parcelable {
mEndIndex = in.readInt();
mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
mReferenceTime = in.readInt() == 0 ? null : ZonedDateTime.parse(in.readString());
+ mExtras = in.readBundle();
}
}
@@ -664,6 +721,7 @@ public final class TextClassification implements Parcelable {
dest.writeTypedList(mActions);
mEntityConfidence.writeToParcel(dest, flags);
dest.writeString(mId);
+ dest.writeBundle(mExtras);
}
public static final Parcelable.Creator<TextClassification> CREATOR =
@@ -695,6 +753,7 @@ public final class TextClassification implements Parcelable {
mLegacyIntent = null; // mLegacyIntent is not parcelled.
mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
mId = in.readString();
+ mExtras = in.readBundle();
}
// Best effort attempt to try to load a drawable from the provided icon.
@@ -717,67 +776,4 @@ public final class TextClassification implements Parcelable {
}
return null;
}
-
- // TODO: Remove once apps can build against the latest sdk.
- /**
- * Optional input parameters for generating TextClassification.
- * @hide
- */
- public static final class Options {
-
- @Nullable private final TextClassificationSessionId mSessionId;
- @Nullable private final Request mRequest;
- @Nullable private LocaleList mDefaultLocales;
- @Nullable private ZonedDateTime mReferenceTime;
-
- public Options() {
- this(null, null);
- }
-
- private Options(
- @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
- mSessionId = sessionId;
- mRequest = request;
- }
-
- /** Helper to create Options from a Request. */
- public static Options from(TextClassificationSessionId sessionId, Request request) {
- final Options options = new Options(sessionId, request);
- options.setDefaultLocales(request.getDefaultLocales());
- options.setReferenceTime(request.getReferenceTime());
- return options;
- }
-
- /** @param defaultLocales ordered list of locale preferences. */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
- mDefaultLocales = defaultLocales;
- return this;
- }
-
- /** @param referenceTime refrence time used for interpreting relatives dates */
- public Options setReferenceTime(@Nullable ZonedDateTime referenceTime) {
- mReferenceTime = referenceTime;
- return this;
- }
-
- @Nullable
- public LocaleList getDefaultLocales() {
- return mDefaultLocales;
- }
-
- @Nullable
- public ZonedDateTime getReferenceTime() {
- return mReferenceTime;
- }
-
- @Nullable
- public Request getRequest() {
- return mRequest;
- }
-
- @Nullable
- public TextClassificationSessionId getSessionId() {
- return mSessionId;
- }
- }
}
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 2e92f14c931c..e6757448b5bb 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -325,6 +325,17 @@ public interface TextClassifier {
}
/**
+ * Suggests and returns a list of actions according to the given conversation.
+ */
+ @WorkerThread
+ default ConversationActions suggestConversationActions(
+ @NonNull ConversationActions.Request request) {
+ Preconditions.checkNotNull(request);
+ Utils.checkMainThread();
+ return new ConversationActions(Collections.emptyList());
+ }
+
+ /**
* Reports a selection event.
*
* <p><strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 7f1e443f4aa5..159bfaa2ab26 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -58,16 +58,12 @@ import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
-import java.util.StringJoiner;
import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
* Default implementation of the {@link TextClassifier} interface.
@@ -81,13 +77,18 @@ import java.util.regex.Pattern;
public final class TextClassifierImpl implements TextClassifier {
private static final String LOG_TAG = DEFAULT_LOG_TAG;
- private static final String MODEL_DIR = "/etc/textclassifier/";
- private static final String MODEL_FILE_REGEX = "textclassifier\\.(.*)\\.model";
- private static final String UPDATED_MODEL_FILE_PATH =
- "/data/misc/textclassifier/textclassifier.model";
- private static final String LANG_ID_MODEL_FILE_PATH = "/etc/textclassifier/lang_id.model";
- private static final String UPDATED_LANG_ID_MODEL_FILE_PATH =
- "/data/misc/textclassifier/lang_id.model";
+
+ private static final File FACTORY_MODEL_DIR = new File("/etc/textclassifier/");
+ // Annotator
+ private static final String ANNOTATOR_FACTORY_MODEL_FILENAME_REGEX =
+ "textclassifier\\.(.*)\\.model";
+ private static final File ANNOTATOR_UPDATED_MODEL_FILE =
+ new File("/data/misc/textclassifier/textclassifier.model");
+
+ // LangID
+ private static final String LANG_ID_FACTORY_MODEL_FILENAME_REGEX = "lang_id.model";
+ private static final File UPDATED_LANG_ID_MODEL_FILE =
+ new File("/data/misc/textclassifier/lang_id.model");
private final Context mContext;
private final TextClassifier mFallback;
@@ -95,9 +96,7 @@ public final class TextClassifierImpl implements TextClassifier {
private final Object mLock = new Object();
@GuardedBy("mLock") // Do not access outside this lock.
- private List<ModelFile> mAllModelFiles;
- @GuardedBy("mLock") // Do not access outside this lock.
- private ModelFile mModel;
+ private ModelFileManager.ModelFile mAnnotatorModelInUse;
@GuardedBy("mLock") // Do not access outside this lock.
private AnnotatorModel mAnnotatorImpl;
@GuardedBy("mLock") // Do not access outside this lock.
@@ -109,12 +108,29 @@ public final class TextClassifierImpl implements TextClassifier {
private final TextClassificationConstants mSettings;
+ private final ModelFileManager mAnnotatorModelFileManager;
+ private final ModelFileManager mLangIdModelFileManager;
+
public TextClassifierImpl(
Context context, TextClassificationConstants settings, TextClassifier fallback) {
mContext = Preconditions.checkNotNull(context);
mFallback = Preconditions.checkNotNull(fallback);
mSettings = Preconditions.checkNotNull(settings);
mGenerateLinksLogger = new GenerateLinksLogger(mSettings.getGenerateLinksLogSampleRate());
+ mAnnotatorModelFileManager = new ModelFileManager(
+ new ModelFileManager.ModelFileSupplierImpl(
+ FACTORY_MODEL_DIR,
+ ANNOTATOR_FACTORY_MODEL_FILENAME_REGEX,
+ ANNOTATOR_UPDATED_MODEL_FILE,
+ AnnotatorModel::getVersion,
+ AnnotatorModel::getLocales));
+ mLangIdModelFileManager = new ModelFileManager(
+ new ModelFileManager.ModelFileSupplierImpl(
+ FACTORY_MODEL_DIR,
+ LANG_ID_FACTORY_MODEL_FILENAME_REGEX,
+ UPDATED_LANG_ID_MODEL_FILE,
+ fd -> -1, // TODO: Replace this with LangIdModel.getVersion(fd)
+ fd -> ModelFileManager.ModelFile.LANGUAGE_INDEPENDENT));
}
public TextClassifierImpl(Context context, TextClassificationConstants settings) {
@@ -334,22 +350,24 @@ public final class TextClassifierImpl implements TextClassifier {
throws FileNotFoundException {
synchronized (mLock) {
localeList = localeList == null ? LocaleList.getEmptyLocaleList() : localeList;
- final ModelFile bestModel = findBestModelLocked(localeList);
+ final ModelFileManager.ModelFile bestModel =
+ mAnnotatorModelFileManager.findBestModelFile(localeList);
if (bestModel == null) {
- throw new FileNotFoundException("No model for " + localeList.toLanguageTags());
+ throw new FileNotFoundException(
+ "No annotator model for " + localeList.toLanguageTags());
}
- if (mAnnotatorImpl == null || !Objects.equals(mModel, bestModel)) {
+ if (mAnnotatorImpl == null || !Objects.equals(mAnnotatorModelInUse, bestModel)) {
Log.d(DEFAULT_LOG_TAG, "Loading " + bestModel);
destroyAnnotatorImplIfExistsLocked();
- final ParcelFileDescriptor fd = ParcelFileDescriptor.open(
+ final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
new File(bestModel.getPath()), ParcelFileDescriptor.MODE_READ_ONLY);
try {
- if (fd != null) {
- mAnnotatorImpl = new AnnotatorModel(fd.getFd());
- mModel = bestModel;
+ if (pfd != null) {
+ mAnnotatorImpl = new AnnotatorModel(pfd.getFd());
+ mAnnotatorModelInUse = bestModel;
}
} finally {
- maybeCloseAndLogError(fd);
+ maybeCloseAndLogError(pfd);
}
}
return mAnnotatorImpl;
@@ -367,40 +385,19 @@ public final class TextClassifierImpl implements TextClassifier {
private LangIdModel getLangIdImpl() throws FileNotFoundException {
synchronized (mLock) {
if (mLangIdImpl == null) {
- ParcelFileDescriptor factoryFd = null;
- ParcelFileDescriptor updateFd = null;
+ final ModelFileManager.ModelFile bestModel =
+ mLangIdModelFileManager.findBestModelFile(LocaleList.getEmptyLocaleList());
+ if (bestModel == null) {
+ throw new FileNotFoundException("No LangID model is found");
+ }
+ final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
+ new File(bestModel.getPath()), ParcelFileDescriptor.MODE_READ_ONLY);
try {
- int factoryVersion = -1;
- int updateVersion = factoryVersion;
- final File factoryFile = new File(LANG_ID_MODEL_FILE_PATH);
- if (factoryFile.exists()) {
- factoryFd = ParcelFileDescriptor.open(
- factoryFile, ParcelFileDescriptor.MODE_READ_ONLY);
- // TODO: Uncomment when method is implemented:
- // if (factoryFd != null) {
- // factoryVersion = LangIdModel.getVersion(factoryFd.getFd());
- // }
- }
- final File updateFile = new File(UPDATED_LANG_ID_MODEL_FILE_PATH);
- if (updateFile.exists()) {
- updateFd = ParcelFileDescriptor.open(
- updateFile, ParcelFileDescriptor.MODE_READ_ONLY);
- // TODO: Uncomment when method is implemented:
- // if (updateFd != null) {
- // updateVersion = LangIdModel.getVersion(updateFd.getFd());
- // }
- }
-
- if (updateVersion > factoryVersion) {
- mLangIdImpl = new LangIdModel(updateFd.getFd());
- } else if (factoryFd != null) {
- mLangIdImpl = new LangIdModel(factoryFd.getFd());
- } else {
- throw new FileNotFoundException("Language detection model not found");
+ if (pfd != null) {
+ mLangIdImpl = new LangIdModel(pfd.getFd());
}
} finally {
- maybeCloseAndLogError(factoryFd);
- maybeCloseAndLogError(updateFd);
+ maybeCloseAndLogError(pfd);
}
}
return mLangIdImpl;
@@ -409,8 +406,9 @@ public final class TextClassifierImpl implements TextClassifier {
private String createId(String text, int start, int end) {
synchronized (mLock) {
- return SelectionSessionLogger.createId(text, start, end, mContext, mModel.getVersion(),
- mModel.getSupportedLocales());
+ return SelectionSessionLogger.createId(text, start, end, mContext,
+ mAnnotatorModelInUse.getVersion(),
+ mAnnotatorModelInUse.getSupportedLocales());
}
}
@@ -418,66 +416,6 @@ public final class TextClassifierImpl implements TextClassifier {
return (locales == null) ? "" : locales.toLanguageTags();
}
- /**
- * Finds the most appropriate model to use for the given target locale list.
- *
- * The basic logic is: we ignore all models that don't support any of the target locales. For
- * the remaining candidates, we take the update model unless its version number is lower than
- * the factory version. It's assumed that factory models do not have overlapping locale ranges
- * and conflict resolution between these models hence doesn't matter.
- */
- @GuardedBy("mLock") // Do not call outside this lock.
- @Nullable
- private ModelFile findBestModelLocked(LocaleList localeList) {
- // Specified localeList takes priority over the system default, so it is listed first.
- final String languages = localeList.isEmpty()
- ? LocaleList.getDefault().toLanguageTags()
- : localeList.toLanguageTags() + "," + LocaleList.getDefault().toLanguageTags();
- final List<Locale.LanguageRange> languageRangeList = Locale.LanguageRange.parse(languages);
-
- ModelFile bestModel = null;
- for (ModelFile model : listAllModelsLocked()) {
- if (model.isAnyLanguageSupported(languageRangeList)) {
- if (model.isPreferredTo(bestModel)) {
- bestModel = model;
- }
- }
- }
- return bestModel;
- }
-
- /** Returns a list of all model files available, in order of precedence. */
- @GuardedBy("mLock") // Do not call outside this lock.
- private List<ModelFile> listAllModelsLocked() {
- if (mAllModelFiles == null) {
- final List<ModelFile> allModels = new ArrayList<>();
- // The update model has the highest precedence.
- if (new File(UPDATED_MODEL_FILE_PATH).exists()) {
- final ModelFile updatedModel = ModelFile.fromPath(UPDATED_MODEL_FILE_PATH);
- if (updatedModel != null) {
- allModels.add(updatedModel);
- }
- }
- // Factory models should never have overlapping locales, so the order doesn't matter.
- final File modelsDir = new File(MODEL_DIR);
- if (modelsDir.exists() && modelsDir.isDirectory()) {
- final File[] modelFiles = modelsDir.listFiles();
- final Pattern modelFilenamePattern = Pattern.compile(MODEL_FILE_REGEX);
- for (File modelFile : modelFiles) {
- final Matcher matcher = modelFilenamePattern.matcher(modelFile.getName());
- if (matcher.matches() && modelFile.isFile()) {
- final ModelFile model = ModelFile.fromPath(modelFile.getAbsolutePath());
- if (model != null) {
- allModels.add(model);
- }
- }
- }
- }
- mAllModelFiles = allModels;
- }
- return mAllModelFiles;
- }
-
private TextClassification createClassificationResult(
AnnotatorModel.ClassificationResult[] classifications,
String text, int start, int end, @Nullable Instant referenceTime) {
@@ -523,12 +461,18 @@ public final class TextClassifierImpl implements TextClassifier {
@Override
public void dump(@NonNull IndentingPrintWriter printWriter) {
synchronized (mLock) {
- listAllModelsLocked();
printWriter.println("TextClassifierImpl:");
printWriter.increaseIndent();
- printWriter.println("Model file(s):");
+ printWriter.println("Annotator model file(s):");
printWriter.increaseIndent();
- for (ModelFile modelFile : mAllModelFiles) {
+ for (ModelFileManager.ModelFile modelFile :
+ mAnnotatorModelFileManager.listModelFiles()) {
+ printWriter.println(modelFile.toString());
+ }
+ printWriter.decreaseIndent();
+ printWriter.println("LangID model file(s):");
+ for (ModelFileManager.ModelFile modelFile :
+ mLangIdModelFileManager.listModelFiles()) {
printWriter.println(modelFile.toString());
}
printWriter.decreaseIndent();
@@ -554,126 +498,6 @@ public final class TextClassifierImpl implements TextClassifier {
}
/**
- * Describes TextClassifier model files on disk.
- */
- private static final class ModelFile {
-
- private final String mPath;
- private final String mName;
- private final int mVersion;
- private final List<Locale> mSupportedLocales;
- private final boolean mLanguageIndependent;
-
- /** Returns null if the path did not point to a compatible model. */
- static @Nullable ModelFile fromPath(String path) {
- final File file = new File(path);
- if (!file.exists()) {
- return null;
- }
- ParcelFileDescriptor modelFd = null;
- try {
- modelFd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
- if (modelFd == null) {
- return null;
- }
- final int version = AnnotatorModel.getVersion(modelFd.getFd());
- final String supportedLocalesStr = AnnotatorModel.getLocales(modelFd.getFd());
- if (supportedLocalesStr.isEmpty()) {
- Log.d(DEFAULT_LOG_TAG, "Ignoring " + file.getAbsolutePath());
- return null;
- }
- final boolean languageIndependent = supportedLocalesStr.equals("*");
- final List<Locale> supportedLocales = new ArrayList<>();
- for (String langTag : supportedLocalesStr.split(",")) {
- supportedLocales.add(Locale.forLanguageTag(langTag));
- }
- return new ModelFile(path, file.getName(), version, supportedLocales,
- languageIndependent);
- } catch (FileNotFoundException e) {
- Log.e(DEFAULT_LOG_TAG, "Failed to peek " + file.getAbsolutePath(), e);
- return null;
- } finally {
- maybeCloseAndLogError(modelFd);
- }
- }
-
- /** The absolute path to the model file. */
- String getPath() {
- return mPath;
- }
-
- /** A name to use for id generation. Effectively the name of the model file. */
- String getName() {
- return mName;
- }
-
- /** Returns the version tag in the model's metadata. */
- int getVersion() {
- return mVersion;
- }
-
- /** Returns whether the language supports any language in the given ranges. */
- boolean isAnyLanguageSupported(List<Locale.LanguageRange> languageRanges) {
- return mLanguageIndependent || Locale.lookup(languageRanges, mSupportedLocales) != null;
- }
-
- /** All locales supported by the model. */
- List<Locale> getSupportedLocales() {
- return Collections.unmodifiableList(mSupportedLocales);
- }
-
- public boolean isPreferredTo(ModelFile model) {
- // A model is preferred to no model.
- if (model == null) {
- return true;
- }
-
- // A language-specific model is preferred to a language independent
- // model.
- if (!mLanguageIndependent && model.mLanguageIndependent) {
- return true;
- }
-
- // A higher-version model is preferred.
- if (getVersion() > model.getVersion()) {
- return true;
- }
- return false;
- }
-
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other instanceof ModelFile) {
- final ModelFile otherModel = (ModelFile) other;
- return mPath.equals(otherModel.mPath);
- }
- return false;
- }
-
- @Override
- public String toString() {
- final StringJoiner localesJoiner = new StringJoiner(",");
- for (Locale locale : mSupportedLocales) {
- localesJoiner.add(locale.toLanguageTag());
- }
- return String.format(Locale.US, "ModelFile { path=%s name=%s version=%d locales=%s }",
- mPath, mName, mVersion, localesJoiner.toString());
- }
-
- private ModelFile(String path, String name, int version, List<Locale> supportedLocales,
- boolean languageIndependent) {
- mPath = path;
- mName = name;
- mVersion = version;
- mSupportedLocales = supportedLocales;
- mLanguageIndependent = languageIndependent;
- }
- }
-
- /**
* Helper class to store the information from which RemoteActions are built.
*/
private static final class LabeledIntent {
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index 1cac3ede363a..b31438f757e2 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -20,7 +20,6 @@ import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.LocaleList;
import android.os.Parcel;
@@ -29,8 +28,6 @@ import android.text.Spannable;
import android.text.method.MovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
-import android.text.util.Linkify;
-import android.text.util.Linkify.LinkifyMask;
import android.view.View;
import android.view.textclassifier.TextClassifier.EntityType;
import android.widget.TextView;
@@ -634,125 +631,4 @@ public final class TextLinks implements Parcelable {
return new TextLinks(mFullText, mLinks);
}
}
-
- // TODO: Remove once apps can build against the latest sdk.
- /**
- * Optional input parameters for generating TextLinks.
- * @hide
- */
- public static final class Options {
-
- @Nullable private final TextClassificationSessionId mSessionId;
- @Nullable private final Request mRequest;
- @Nullable private LocaleList mDefaultLocales;
- @Nullable private TextClassifier.EntityConfig mEntityConfig;
- private boolean mLegacyFallback;
-
- private @ApplyStrategy int mApplyStrategy;
- private Function<TextLink, TextLinkSpan> mSpanFactory;
-
- private String mCallingPackageName;
-
- @UnsupportedAppUsage
- public Options() {
- this(null, null);
- }
-
- private Options(
- @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
- mSessionId = sessionId;
- mRequest = request;
- }
-
- /** Helper to create Options from a Request. */
- public static Options from(TextClassificationSessionId sessionId, Request request) {
- final Options options = new Options(sessionId, request);
- options.setDefaultLocales(request.getDefaultLocales());
- options.setEntityConfig(request.getEntityConfig());
- return options;
- }
-
- /** Returns a new options object based on the specified link mask. */
- public static Options fromLinkMask(@LinkifyMask int mask) {
- final List<String> entitiesToFind = new ArrayList<>();
-
- if ((mask & Linkify.WEB_URLS) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_URL);
- }
- if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_EMAIL);
- }
- if ((mask & Linkify.PHONE_NUMBERS) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_PHONE);
- }
- if ((mask & Linkify.MAP_ADDRESSES) != 0) {
- entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
- }
-
- return new Options().setEntityConfig(
- TextClassifier.EntityConfig.createWithEntityList(entitiesToFind));
- }
-
- /** @param defaultLocales ordered list of locale preferences. */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
- mDefaultLocales = defaultLocales;
- return this;
- }
-
- /** @param entityConfig definition of which entity types to look for. */
- public Options setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
- mEntityConfig = entityConfig;
- return this;
- }
-
- /** @param applyStrategy strategy to use when resolving conflicts. */
- public Options setApplyStrategy(@ApplyStrategy int applyStrategy) {
- checkValidApplyStrategy(applyStrategy);
- mApplyStrategy = applyStrategy;
- return this;
- }
-
- /** @param spanFactory factory for converting TextLink to TextLinkSpan. */
- public Options setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
- mSpanFactory = spanFactory;
- return this;
- }
-
- @Nullable
- public LocaleList getDefaultLocales() {
- return mDefaultLocales;
- }
-
- @Nullable
- public TextClassifier.EntityConfig getEntityConfig() {
- return mEntityConfig;
- }
-
- @ApplyStrategy
- public int getApplyStrategy() {
- return mApplyStrategy;
- }
-
- @Nullable
- public Function<TextLink, TextLinkSpan> getSpanFactory() {
- return mSpanFactory;
- }
-
- @Nullable
- public Request getRequest() {
- return mRequest;
- }
-
- @Nullable
- public TextClassificationSessionId getSessionId() {
- return mSessionId;
- }
-
- private static void checkValidApplyStrategy(int applyStrategy) {
- if (applyStrategy != APPLY_STRATEGY_IGNORE && applyStrategy != APPLY_STRATEGY_REPLACE) {
- throw new IllegalArgumentException(
- "Invalid apply strategy. See TextLinks.ApplyStrategy for options.");
- }
- }
- }
}
diff --git a/core/java/android/view/textclassifier/TextSelection.java b/core/java/android/view/textclassifier/TextSelection.java
index a4550afed15a..52d01ea6b035 100644
--- a/core/java/android/view/textclassifier/TextSelection.java
+++ b/core/java/android/view/textclassifier/TextSelection.java
@@ -375,56 +375,4 @@ public final class TextSelection implements Parcelable {
mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
mId = in.readString();
}
-
-
- // TODO: Remove once apps can build against the latest sdk.
- /**
- * Optional input parameters for generating TextSelection.
- * @hide
- */
- public static final class Options {
-
- @Nullable private final TextClassificationSessionId mSessionId;
- @Nullable private final Request mRequest;
- @Nullable private LocaleList mDefaultLocales;
- private boolean mDarkLaunchAllowed;
-
- public Options() {
- this(null, null);
- }
-
- private Options(
- @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
- mSessionId = sessionId;
- mRequest = request;
- }
-
- /** Helper to create Options from a Request. */
- public static Options from(TextClassificationSessionId sessionId, Request request) {
- final Options options = new Options(sessionId, request);
- options.setDefaultLocales(request.getDefaultLocales());
- return options;
- }
-
- /** @param defaultLocales ordered list of locale preferences. */
- public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
- mDefaultLocales = defaultLocales;
- return this;
- }
-
- @Nullable
- public LocaleList getDefaultLocales() {
- return mDefaultLocales;
- }
-
- @Nullable
- public Request getRequest() {
- return mRequest;
- }
-
- @Nullable
- public TextClassificationSessionId getSessionId() {
- return mSessionId;
- }
- }
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 4d031232152a..a93604f95c79 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -21,6 +21,7 @@ import android.annotation.DimenRes;
import android.annotation.NonNull;
import android.annotation.StyleRes;
import android.annotation.UnsupportedAppUsage;
+import android.app.Activity;
import android.app.ActivityOptions;
import android.app.ActivityThread;
import android.app.Application;
@@ -56,13 +57,14 @@ import android.os.StrictMode;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.IntArray;
import android.util.Log;
+import android.util.Pair;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.LayoutInflater.Filter;
import android.view.RemotableViewMethod;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.AdapterView.OnItemClickListener;
@@ -129,13 +131,19 @@ public class RemoteViews implements Parcelable, Filter {
static final String EXTRA_REMOTEADAPTER_APPWIDGET_ID = "remoteAdapterAppWidgetId";
/**
+ * The intent extra that contains the bounds for all shared elements.
+ */
+ public static final String EXTRA_SHARED_ELEMENT_BOUNDS =
+ "android.widget.extra.SHARED_ELEMENT_BOUNDS";
+
+ /**
* Maximum depth of nested views calls from {@link #addView(int, RemoteViews)} and
* {@link #RemoteViews(RemoteViews, RemoteViews)}.
*/
private static final int MAX_NESTED_VIEWS = 10;
// The unique identifiers for each custom {@link Action}.
- private static final int SET_ON_CLICK_PENDING_INTENT_TAG = 1;
+ private static final int SET_ON_CLICK_RESPONSE_TAG = 1;
private static final int REFLECTION_ACTION_TAG = 2;
private static final int SET_DRAWABLE_TINT_TAG = 3;
private static final int VIEW_GROUP_ACTION_ADD_TAG = 4;
@@ -143,7 +151,6 @@ public class RemoteViews implements Parcelable, Filter {
private static final int SET_EMPTY_VIEW_ACTION_TAG = 6;
private static final int VIEW_GROUP_ACTION_REMOVE_TAG = 7;
private static final int SET_PENDING_INTENT_TEMPLATE_TAG = 8;
- private static final int SET_ON_CLICK_FILL_IN_INTENT_TAG = 9;
private static final int SET_REMOTE_VIEW_ADAPTER_INTENT_TAG = 10;
private static final int TEXT_VIEW_DRAWABLE_ACTION_TAG = 11;
private static final int BITMAP_REFLECTION_ACTION_TAG = 12;
@@ -228,7 +235,8 @@ public class RemoteViews implements Parcelable, Filter {
/** Class cookies of the Parcel this instance was read from. */
private final Map<Class, Object> mClassCookies;
- private static final OnClickHandler DEFAULT_ON_CLICK_HANDLER = new OnClickHandler();
+ private static final OnClickHandler DEFAULT_ON_CLICK_HANDLER = (view, pendingIntent, response)
+ -> startPendingIntent(view, pendingIntent, response.getLaunchOptions(view));
private static final ArrayMap<MethodKey, MethodArgs> sMethods = new ArrayMap<>();
@@ -362,57 +370,10 @@ public class RemoteViews implements Parcelable, Filter {
}
/** @hide */
- public static class OnClickHandler {
-
- @UnsupportedAppUsage
- public boolean onClickHandler(View view, PendingIntent pendingIntent, Intent fillInIntent) {
- try {
- // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
- Context context = view.getContext();
- ActivityOptions opts = getActivityOptions(context);
- // The NEW_TASK flags are applied through the activity options and not as a part of
- // the call to startIntentSender() to ensure that they are consistently applied to
- // both mutable and immutable PendingIntents.
- context.startIntentSender(
- pendingIntent.getIntentSender(), fillInIntent,
- 0, 0, 0, opts.toBundle());
- } catch (IntentSender.SendIntentException e) {
- android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e);
- return false;
- } catch (Exception e) {
- android.util.Log.e(LOG_TAG, "Cannot send pending intent due to " +
- "unknown exception: ", e);
- return false;
- }
- return true;
- }
+ public interface OnClickHandler {
/** @hide */
- protected ActivityOptions getActivityOptions(Context context) {
- if (context.getResources().getBoolean(
- com.android.internal.R.bool.config_overrideRemoteViewsActivityTransition)) {
- TypedArray windowStyle = context.getTheme().obtainStyledAttributes(
- com.android.internal.R.styleable.Window);
- int windowAnimations = windowStyle.getResourceId(
- com.android.internal.R.styleable.Window_windowAnimationStyle, 0);
- TypedArray windowAnimationStyle = context.obtainStyledAttributes(
- windowAnimations, com.android.internal.R.styleable.WindowAnimation);
- int enterAnimationId = windowAnimationStyle.getResourceId(com.android.internal.R
- .styleable.WindowAnimation_activityOpenRemoteViewsEnterAnimation, 0);
- windowStyle.recycle();
- windowAnimationStyle.recycle();
-
- if (enterAnimationId != 0) {
- final ActivityOptions opts = ActivityOptions.makeCustomAnimation(context,
- enterAnimationId, 0);
- opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return opts;
- }
- }
- final ActivityOptions opts = ActivityOptions.makeBasic();
- opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return opts;
- }
+ boolean onClickHandler(View view, PendingIntent pendingIntent, RemoteResponse response);
}
/**
@@ -630,86 +591,6 @@ public class RemoteViews implements Parcelable, Filter {
}
}
- private class SetOnClickFillInIntent extends Action {
- public SetOnClickFillInIntent(int id, Intent fillInIntent) {
- this.viewId = id;
- this.fillInIntent = fillInIntent;
- }
-
- public SetOnClickFillInIntent(Parcel parcel) {
- viewId = parcel.readInt();
- fillInIntent = parcel.readTypedObject(Intent.CREATOR);
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(viewId);
- dest.writeTypedObject(fillInIntent, 0 /* no flags */);
- }
-
- @Override
- public void apply(View root, ViewGroup rootParent, final OnClickHandler handler) {
- final View target = root.findViewById(viewId);
- if (target == null) return;
-
- if (!mIsWidgetCollectionChild) {
- Log.e(LOG_TAG, "The method setOnClickFillInIntent is available " +
- "only from RemoteViewsFactory (ie. on collection items).");
- return;
- }
- if (target == root) {
- target.setTagInternal(com.android.internal.R.id.fillInIntent, fillInIntent);
- } else if (fillInIntent != null) {
- OnClickListener listener = new OnClickListener() {
- public void onClick(View v) {
- // Insure that this view is a child of an AdapterView
- View parent = (View) v.getParent();
- // Break the for loop on the first encounter of:
- // 1) an AdapterView,
- // 2) an AppWidgetHostView that is not a RemoteViewsFrameLayout, or
- // 3) a null parent.
- // 2) and 3) are unexpected and catch the case where a child is not
- // correctly parented in an AdapterView.
- while (parent != null && !(parent instanceof AdapterView<?>)
- && !((parent instanceof AppWidgetHostView) &&
- !(parent instanceof RemoteViewsAdapter.RemoteViewsFrameLayout))) {
- parent = (View) parent.getParent();
- }
-
- if (!(parent instanceof AdapterView<?>)) {
- // Somehow they've managed to get this far without having
- // and AdapterView as a parent.
- Log.e(LOG_TAG, "Collection item doesn't have AdapterView parent");
- return;
- }
-
- // Insure that a template pending intent has been set on an ancestor
- if (!(parent.getTag() instanceof PendingIntent)) {
- Log.e(LOG_TAG, "Attempting setOnClickFillInIntent without" +
- " calling setPendingIntentTemplate on parent.");
- return;
- }
-
- PendingIntent pendingIntent = (PendingIntent) parent.getTag();
-
- final Rect rect = getSourceBounds(v);
-
- fillInIntent.setSourceBounds(rect);
- handler.onClickHandler(v, pendingIntent, fillInIntent);
- }
-
- };
- target.setOnClickListener(listener);
- }
- }
-
- @Override
- public int getActionTag() {
- return SET_ON_CLICK_FILL_IN_INTENT_TAG;
- }
-
- Intent fillInIntent;
- }
-
private class SetPendingIntentTemplate extends Action {
public SetPendingIntentTemplate(int id, PendingIntent pendingIntentTemplate) {
this.viewId = id;
@@ -749,22 +630,17 @@ public class RemoteViews implements Parcelable, Filter {
}
if (vg == null) return;
- Intent fillInIntent = null;
+ RemoteResponse response = null;
int childCount = vg.getChildCount();
for (int i = 0; i < childCount; i++) {
Object tag = vg.getChildAt(i).getTag(com.android.internal.R.id.fillInIntent);
- if (tag instanceof Intent) {
- fillInIntent = (Intent) tag;
+ if (tag instanceof RemoteResponse) {
+ response = (RemoteResponse) tag;
break;
}
}
- if (fillInIntent == null) return;
-
- final Rect rect = getSourceBounds(view);
-
- final Intent intent = new Intent();
- intent.setSourceBounds(rect);
- handler.onClickHandler(view, pendingIntentTemplate, fillInIntent);
+ if (response == null) return;
+ response.handleViewClick(view, handler);
}
}
};
@@ -922,20 +798,22 @@ public class RemoteViews implements Parcelable, Filter {
* {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)}
* to launch the provided {@link PendingIntent}.
*/
- private class SetOnClickPendingIntent extends Action {
- public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) {
+ private class SetOnClickResponse extends Action {
+
+ SetOnClickResponse(int id, RemoteResponse response) {
this.viewId = id;
- this.pendingIntent = pendingIntent;
+ this.mResponse = response;
}
- public SetOnClickPendingIntent(Parcel parcel) {
+ SetOnClickResponse(Parcel parcel) {
viewId = parcel.readInt();
- pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel);
+ mResponse = new RemoteResponse();
+ mResponse.readFromParcel(parcel);
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(viewId);
- PendingIntent.writePendingIntentOrNullToParcel(pendingIntent, dest);
+ mResponse.writeToParcel(dest, flags);
}
@Override
@@ -943,50 +821,54 @@ public class RemoteViews implements Parcelable, Filter {
final View target = root.findViewById(viewId);
if (target == null) return;
- // If the view is an AdapterView, setting a PendingIntent on click doesn't make much
- // sense, do they mean to set a PendingIntent template for the AdapterView's children?
- if (mIsWidgetCollectionChild) {
- Log.w(LOG_TAG, "Cannot setOnClickPendingIntent for collection item " +
- "(id: " + viewId + ")");
- ApplicationInfo appInfo = root.getContext().getApplicationInfo();
-
- // We let this slide for HC and ICS so as to not break compatibility. It should have
- // been disabled from the outset, but was left open by accident.
- if (appInfo != null &&
- appInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN) {
+ if (mResponse.mPendingIntent != null) {
+ // If the view is an AdapterView, setting a PendingIntent on click doesn't make
+ // much sense, do they mean to set a PendingIntent template for the
+ // AdapterView's children?
+ if (mIsWidgetCollectionChild) {
+ Log.w(LOG_TAG, "Cannot SetOnClickResponse for collection item "
+ + "(id: " + viewId + ")");
+ ApplicationInfo appInfo = root.getContext().getApplicationInfo();
+
+ // We let this slide for HC and ICS so as to not break compatibility. It should
+ // have been disabled from the outset, but was left open by accident.
+ if (appInfo != null
+ && appInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN) {
+ return;
+ }
+ }
+ target.setTagInternal(R.id.pending_intent_tag, mResponse.mPendingIntent);
+ } else if (mResponse.mFillIntent != null) {
+ if (!mIsWidgetCollectionChild) {
+ Log.e(LOG_TAG, "The method setOnClickFillInIntent is available "
+ + "only from RemoteViewsFactory (ie. on collection items).");
return;
}
+ if (target == root) {
+ // Target is a root node of an AdapterView child. Set the response in the tag.
+ // Actual click handling is done by OnItemClickListener in
+ // SetPendingIntentTemplate, which uses this tag information.
+ target.setTagInternal(com.android.internal.R.id.fillInIntent, mResponse);
+ return;
+ }
+ } else {
+ // No intent to apply
+ target.setOnClickListener(null);
+ return;
}
-
- // If the pendingIntent is null, we clear the onClickListener
- OnClickListener listener = null;
- if (pendingIntent != null) {
- listener = new OnClickListener() {
- public void onClick(View v) {
- // Find target view location in screen coordinates and
- // fill into PendingIntent before sending.
- final Rect rect = getSourceBounds(v);
-
- final Intent intent = new Intent();
- intent.setSourceBounds(rect);
- handler.onClickHandler(v, pendingIntent, intent);
- }
- };
- }
- target.setTagInternal(R.id.pending_intent_tag, pendingIntent);
- target.setOnClickListener(listener);
+ target.setOnClickListener(v -> mResponse.handleViewClick(v, handler));
}
@Override
public int getActionTag() {
- return SET_ON_CLICK_PENDING_INTENT_TAG;
+ return SET_ON_CLICK_RESPONSE_TAG;
}
- @UnsupportedAppUsage
- PendingIntent pendingIntent;
+ final RemoteResponse mResponse;
}
- private static Rect getSourceBounds(View v) {
+ /** @hide **/
+ public static Rect getSourceBounds(View v) {
final float appScale = v.getContext().getResources()
.getCompatibilityInfo().applicationScale;
final int[] pos = new int[2];
@@ -2413,8 +2295,8 @@ public class RemoteViews implements Parcelable, Filter {
private Action getActionFromParcel(Parcel parcel, int depth) {
int tag = parcel.readInt();
switch (tag) {
- case SET_ON_CLICK_PENDING_INTENT_TAG:
- return new SetOnClickPendingIntent(parcel);
+ case SET_ON_CLICK_RESPONSE_TAG:
+ return new SetOnClickResponse(parcel);
case SET_DRAWABLE_TINT_TAG:
return new SetDrawableTint(parcel);
case REFLECTION_ACTION_TAG:
@@ -2430,8 +2312,6 @@ public class RemoteViews implements Parcelable, Filter {
return new SetEmptyView(parcel);
case SET_PENDING_INTENT_TEMPLATE_TAG:
return new SetPendingIntentTemplate(parcel);
- case SET_ON_CLICK_FILL_IN_INTENT_TAG:
- return new SetOnClickFillInIntent(parcel);
case SET_REMOTE_VIEW_ADAPTER_INTENT_TAG:
return new SetRemoteViewsAdapterIntent(parcel);
case TEXT_VIEW_DRAWABLE_ACTION_TAG:
@@ -2834,7 +2714,7 @@ public class RemoteViews implements Parcelable, Filter {
* to launch the provided {@link PendingIntent}. The source bounds
* ({@link Intent#getSourceBounds()}) of the intent will be set to the bounds of the clicked
* view in screen space.
- * Note that any activity options associated with the pendingIntent may get overridden
+ * Note that any activity options associated with the mPendingIntent may get overridden
* before starting the intent.
*
* When setting the on-click action of items within collections (eg. {@link ListView},
@@ -2846,7 +2726,19 @@ public class RemoteViews implements Parcelable, Filter {
* @param pendingIntent The {@link PendingIntent} to send when user clicks
*/
public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) {
- addAction(new SetOnClickPendingIntent(viewId, pendingIntent));
+ setOnClickResponse(viewId, RemoteResponse.fromPendingIntent(pendingIntent));
+ }
+
+ /**
+ * Equivalent of calling
+ * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)}
+ * to launch the provided {@link RemoteResponse}.
+ *
+ * @param viewId The id of the view that will trigger the {@link RemoteResponse} when clicked
+ * @param response The {@link RemoteResponse} to send when user clicks
+ */
+ public void setOnClickResponse(int viewId, RemoteResponse response) {
+ addAction(new SetOnClickResponse(viewId, response));
}
/**
@@ -2883,7 +2775,7 @@ public class RemoteViews implements Parcelable, Filter {
* in order to determine the on-click behavior of the view specified by viewId
*/
public void setOnClickFillInIntent(int viewId, Intent fillInIntent) {
- addAction(new SetOnClickFillInIntent(viewId, fillInIntent));
+ setOnClickResponse(viewId, RemoteResponse.fromFillInIntent(fillInIntent));
}
/**
@@ -3903,4 +3795,213 @@ public class RemoteViews implements Parcelable, Filter {
}
}
}
+
+ /**
+ * Class representing a response to an action performed on any element of a RemoteViews.
+ */
+ public static class RemoteResponse {
+
+ private PendingIntent mPendingIntent;
+ private Intent mFillIntent;
+
+ private IntArray mViewIds;
+ private ArrayList<String> mElementNames;
+
+ /**
+ * Creates a response which sends a pending intent as part of the response. The source
+ * bounds ({@link Intent#getSourceBounds()}) of the intent will be set to the bounds of the
+ * target view in screen space.
+ * Note that any activity options associated with the mPendingIntent may get overridden
+ * before starting the intent.
+ *
+ * @param pendingIntent The {@link PendingIntent} to send as part of the response
+ */
+ public static RemoteResponse fromPendingIntent(PendingIntent pendingIntent) {
+ RemoteResponse response = new RemoteResponse();
+ response.mPendingIntent = pendingIntent;
+ return response;
+ }
+
+ /**
+ * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is
+ * very costly to set PendingIntents on the individual items, and is hence not permitted.
+ * Instead a single PendingIntent template can be set on the collection, see {@link
+ * RemoteViews#setPendingIntentTemplate(int, PendingIntent)}, and the individual on-click
+ * action of a given item can be distinguished by setting a fillInIntent on that item. The
+ * fillInIntent is then combined with the PendingIntent template in order to determine the
+ * final intent which will be executed when the item is clicked. This works as follows: any
+ * fields which are left blank in the PendingIntent template, but are provided by the
+ * fillInIntent will be overwritten, and the resulting PendingIntent will be used. The rest
+ * of the PendingIntent template will then be filled in with the associated fields that are
+ * set in fillInIntent. See {@link Intent#fillIn(Intent, int)} for more details.
+ * Creates a response which sends a pending intent as part of the response. The source
+ * bounds ({@link Intent#getSourceBounds()}) of the intent will be set to the bounds of the
+ * target view in screen space.
+ * Note that any activity options associated with the mPendingIntent may get overridden
+ * before starting the intent.
+ *
+ * @param fillIntent The intent which will be combined with the parent's PendingIntent in
+ * order to determine the behavior of the response
+ *
+ * @see RemoteViews#setPendingIntentTemplate(int, PendingIntent)
+ * @see RemoteViews#setOnClickFillInIntent(int, Intent)
+ * @return
+ */
+ public static RemoteResponse fromFillInIntent(Intent fillIntent) {
+ RemoteResponse response = new RemoteResponse();
+ response.mFillIntent = fillIntent;
+ return response;
+ }
+
+ /**
+ * Adds a shared element to be transferred as part of the transition between Activities
+ * using cross-Activity scene animations. The position of the first element will be used as
+ * the epicenter for the exit Transition. The position of the associated shared element in
+ * the launched Activity will be the epicenter of its entering Transition.
+ *
+ * @param viewId The id of the view to be shared as part of the transition
+ * @param sharedElementName The shared element name for this view
+ *
+ * @see ActivityOptions#makeSceneTransitionAnimation(Activity, Pair[])
+ */
+ public RemoteResponse addSharedElement(int viewId, String sharedElementName) {
+ if (mViewIds == null) {
+ mViewIds = new IntArray();
+ mElementNames = new ArrayList<>();
+ }
+ mViewIds.add(viewId);
+ mElementNames.add(sharedElementName);
+ return this;
+ }
+
+ private void writeToParcel(Parcel dest, int flags) {
+ PendingIntent.writePendingIntentOrNullToParcel(mPendingIntent, dest);
+ if (mPendingIntent == null) {
+ // Only write the intent if pending intent is null
+ dest.writeTypedObject(mFillIntent, flags);
+ }
+ dest.writeIntArray(mViewIds == null ? null : mViewIds.toArray());
+ dest.writeStringList(mElementNames);
+ }
+
+ private void readFromParcel(Parcel parcel) {
+ mPendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel);
+ if (mPendingIntent == null) {
+ mFillIntent = parcel.readTypedObject(Intent.CREATOR);
+ }
+ int[] viewIds = parcel.createIntArray();
+ mViewIds = viewIds == null ? null : IntArray.wrap(viewIds);
+ mElementNames = parcel.createStringArrayList();
+ }
+
+ private void handleViewClick(View v, OnClickHandler handler) {
+ final PendingIntent pi;
+ if (mPendingIntent != null) {
+ pi = mPendingIntent;
+ } else if (mFillIntent != null) {
+ // Insure that this view is a child of an AdapterView
+ View parent = (View) v.getParent();
+ // Break the for loop on the first encounter of:
+ // 1) an AdapterView,
+ // 2) an AppWidgetHostView that is not a RemoteViewsFrameLayout, or
+ // 3) a null parent.
+ // 2) and 3) are unexpected and catch the case where a child is not
+ // correctly parented in an AdapterView.
+ while (parent != null && !(parent instanceof AdapterView<?>)
+ && !((parent instanceof AppWidgetHostView)
+ && !(parent instanceof RemoteViewsAdapter.RemoteViewsFrameLayout))) {
+ parent = (View) parent.getParent();
+ }
+
+ if (!(parent instanceof AdapterView<?>)) {
+ // Somehow they've managed to get this far without having
+ // and AdapterView as a parent.
+ Log.e(LOG_TAG, "Collection item doesn't have AdapterView parent");
+ return;
+ }
+ // Insure that a template pending intent has been set on an ancestor
+ if (!(parent.getTag() instanceof PendingIntent)) {
+ Log.e(LOG_TAG, "Attempting setOnClickFillInIntent without"
+ + " calling setPendingIntentTemplate on parent.");
+ return;
+ }
+
+ pi = (PendingIntent) parent.getTag();
+ } else {
+ Log.e(LOG_TAG, "Response has neither pendingIntent nor fillInIntent");
+ return;
+ }
+
+ handler.onClickHandler(v, pi, this);
+ }
+
+ /** @hide */
+ public Pair<Intent, ActivityOptions> getLaunchOptions(View view) {
+ Intent intent = mPendingIntent != null ? new Intent() : new Intent(mFillIntent);
+ intent.setSourceBounds(getSourceBounds(view));
+
+ ActivityOptions opts = null;
+
+ Context context = view.getContext();
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_overrideRemoteViewsActivityTransition)) {
+ TypedArray windowStyle = context.getTheme().obtainStyledAttributes(
+ com.android.internal.R.styleable.Window);
+ int windowAnimations = windowStyle.getResourceId(
+ com.android.internal.R.styleable.Window_windowAnimationStyle, 0);
+ TypedArray windowAnimationStyle = context.obtainStyledAttributes(
+ windowAnimations, com.android.internal.R.styleable.WindowAnimation);
+ int enterAnimationId = windowAnimationStyle.getResourceId(com.android.internal.R
+ .styleable.WindowAnimation_activityOpenRemoteViewsEnterAnimation, 0);
+ windowStyle.recycle();
+ windowAnimationStyle.recycle();
+
+ if (enterAnimationId != 0) {
+ opts = ActivityOptions.makeCustomAnimation(context,
+ enterAnimationId, 0);
+ opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ }
+
+ if (opts == null && mViewIds != null && mElementNames != null) {
+ View parent = (View) view.getParent();
+ while (parent != null && !(parent instanceof AppWidgetHostView)) {
+ parent = (View) parent.getParent();
+ }
+ if (parent instanceof AppWidgetHostView) {
+ opts = ((AppWidgetHostView) parent).createSharedElementActivityOptions(
+ mViewIds.toArray(),
+ mElementNames.toArray(new String[mElementNames.size()]), intent);
+ }
+ }
+
+ if (opts == null) {
+ opts = ActivityOptions.makeBasic();
+ opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ return Pair.create(intent, opts);
+ }
+ }
+
+ /** @hide */
+ public static boolean startPendingIntent(View view, PendingIntent pendingIntent,
+ Pair<Intent, ActivityOptions> options) {
+ try {
+ // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
+ Context context = view.getContext();
+ // The NEW_TASK flags are applied through the activity options and not as a part of
+ // the call to startIntentSender() to ensure that they are consistently applied to
+ // both mutable and immutable PendingIntents.
+ context.startIntentSender(
+ pendingIntent.getIntentSender(), options.first,
+ 0, 0, 0, options.second.toBundle());
+ } catch (IntentSender.SendIntentException e) {
+ Log.e(LOG_TAG, "Cannot send pending intent: ", e);
+ return false;
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Cannot send pending intent due to unknown exception: ", e);
+ return false;
+ }
+ return true;
+ }
}
diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java
index d7031eaed4d8..3462e08a4c6a 100644
--- a/core/java/com/android/internal/app/AlertController.java
+++ b/core/java/com/android/internal/app/AlertController.java
@@ -191,7 +191,8 @@ public class AlertController {
public static final AlertController create(Context context, DialogInterface di, Window window) {
final TypedArray a = context.obtainStyledAttributes(
- null, R.styleable.AlertDialog, R.attr.alertDialogStyle, 0);
+ null, R.styleable.AlertDialog, R.attr.alertDialogStyle,
+ R.style.Theme_DeviceDefault_Settings);
int controllerType = a.getInt(R.styleable.AlertDialog_controllerType, 0);
a.recycle();
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 768dddd35a6d..049103bfebb2 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -17,6 +17,7 @@
package com.android.internal.app;
import android.app.AppOpsManager;
+import android.content.pm.ParceledListSlice;
import android.os.Bundle;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsActiveCallback;
@@ -40,6 +41,10 @@ interface IAppOpsService {
int checkPackage(int uid, String packageName);
List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);
List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
+ ParceledListSlice getAllHistoricalPackagesOps(in String[] ops,
+ long beginTimeMillis, long endTimeMillis);
+ AppOpsManager.HistoricalPackageOps getHistoricalPackagesOps(int uid, String packageName,
+ in String[] ops, long beginTimeMillis, long endTimeMillis);
List<AppOpsManager.PackageOps> getUidOps(int uid, in int[] ops);
void setUidMode(int code, int uid, int mode);
void setMode(int code, int uid, String packageName, int mode);
diff --git a/core/java/com/android/internal/inputmethod/InputMethodDebug.java b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
index a5dc3d1b7138..025e27bc45c9 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodDebug.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodDebug.java
@@ -19,6 +19,8 @@ package com.android.internal.inputmethod;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
+import java.util.StringJoiner;
+
/**
* Provides useful methods for debugging.
*/
@@ -96,7 +98,7 @@ public final class InputMethodDebug {
* @return {@link String} message corresponds for the given {@code softInputMode}.
*/
public static String softInputModeToString(@SoftInputModeFlags int softInputMode) {
- final StringBuilder sb = new StringBuilder();
+ final StringJoiner joiner = new StringJoiner("|");
final int state = softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE;
final int adjust = softInputMode & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
final boolean isForwardNav =
@@ -104,55 +106,75 @@ public final class InputMethodDebug {
switch (state) {
case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:
- sb.append("STATE_UNSPECIFIED");
+ joiner.add("STATE_UNSPECIFIED");
break;
case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED:
- sb.append("STATE_UNCHANGED");
+ joiner.add("STATE_UNCHANGED");
break;
case WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN:
- sb.append("STATE_HIDDEN");
+ joiner.add("STATE_HIDDEN");
break;
case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
- sb.append("STATE_ALWAYS_HIDDEN");
+ joiner.add("STATE_ALWAYS_HIDDEN");
break;
case WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE:
- sb.append("STATE_VISIBLE");
+ joiner.add("STATE_VISIBLE");
break;
case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
- sb.append("STATE_ALWAYS_VISIBLE");
+ joiner.add("STATE_ALWAYS_VISIBLE");
break;
default:
- sb.append("STATE_UNKNOWN(");
- sb.append(state);
- sb.append(")");
+ joiner.add("STATE_UNKNOWN(" + state + ")");
break;
}
switch (adjust) {
case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED:
- sb.append("|ADJUST_UNSPECIFIED");
+ joiner.add("ADJUST_UNSPECIFIED");
break;
case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE:
- sb.append("|ADJUST_RESIZE");
+ joiner.add("ADJUST_RESIZE");
break;
case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN:
- sb.append("|ADJUST_PAN");
+ joiner.add("ADJUST_PAN");
break;
case WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING:
- sb.append("|ADJUST_NOTHING");
+ joiner.add("ADJUST_NOTHING");
break;
default:
- sb.append("|ADJUST_UNKNOWN(");
- sb.append(adjust);
- sb.append(")");
+ joiner.add("ADJUST_UNKNOWN(" + adjust + ")");
break;
}
if (isForwardNav) {
// This is a special bit that is set by the system only during the window navigation.
- sb.append("|IS_FORWARD_NAVIGATION");
+ joiner.add("IS_FORWARD_NAVIGATION");
+ }
+
+ return joiner.setEmptyValue("(none)").toString();
+ }
+
+ /**
+ * Converts {@link StartInputFlags} to {@link String} for debug logging.
+ *
+ * @param startInputFlags integer constant for {@link StartInputFlags}.
+ * @return {@link String} message corresponds for the given {@code startInputFlags}.
+ */
+ public static String startInputFlagsToString(@StartInputFlags int startInputFlags) {
+ final StringJoiner joiner = new StringJoiner("|");
+ if ((startInputFlags & StartInputFlags.VIEW_HAS_FOCUS) != 0) {
+ joiner.add("VIEW_HAS_FOCUS");
+ }
+ if ((startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0) {
+ joiner.add("IS_TEXT_EDITOR");
+ }
+ if ((startInputFlags & StartInputFlags.FIRST_WINDOW_FOCUS_GAIN) != 0) {
+ joiner.add("FIRST_WINDOW_FOCUS_GAIN");
+ }
+ if ((startInputFlags & StartInputFlags.INITIAL_CONNECTION) != 0) {
+ joiner.add("INITIAL_CONNECTION");
}
- return sb.toString();
+ return joiner.setEmptyValue("(none)").toString();
}
}
diff --git a/core/java/com/android/internal/inputmethod/StartInputFlags.java b/core/java/com/android/internal/inputmethod/StartInputFlags.java
new file mode 100644
index 000000000000..ba26d8db533c
--- /dev/null
+++ b/core/java/com/android/internal/inputmethod/StartInputFlags.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.inputmethod;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+
+/**
+ * Describes additional info in
+ * {@link com.android.internal.view.IInputMethodManager#startInputOrWindowGainedFocus}.
+ */
+@Retention(SOURCE)
+@IntDef(flag = true, value = {
+ StartInputFlags.VIEW_HAS_FOCUS,
+ StartInputFlags.IS_TEXT_EDITOR,
+ StartInputFlags.FIRST_WINDOW_FOCUS_GAIN,
+ StartInputFlags.INITIAL_CONNECTION})
+public @interface StartInputFlags {
+ /**
+ * There is a focused view in the focused window.
+ */
+ int VIEW_HAS_FOCUS = 1;
+
+ /**
+ * The focused view is a text editor.
+ */
+ int IS_TEXT_EDITOR = 2;
+
+ /**
+ * This is the first time the window has gotten focus.
+ */
+ int FIRST_WINDOW_FOCUS_GAIN = 4;
+
+ /**
+ * An internal concept to distinguish "start" and "restart". This concept doesn't look well
+ * documented hence we probably need to revisit this though.
+ */
+ int INITIAL_CONNECTION = 8;
+}
diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java
index d1c279918bb4..0a7cff6856e5 100644
--- a/core/java/com/android/internal/net/NetworkStatsFactory.java
+++ b/core/java/com/android/internal/net/NetworkStatsFactory.java
@@ -113,11 +113,12 @@ public class NetworkStatsFactory {
/**
* Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}.
- * @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map)
+ * @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map, boolean)
*/
public static void apply464xlatAdjustments(NetworkStats baseTraffic,
- NetworkStats stackedTraffic) {
- NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces);
+ NetworkStats stackedTraffic, boolean useBpfStats) {
+ NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces,
+ useBpfStats);
}
@VisibleForTesting
@@ -263,7 +264,7 @@ public class NetworkStatsFactory {
// No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap.
// TODO: remove this and only apply adjustments in NetworkStatsService.
- stats.apply464xlatAdjustments(sStackedIfaces);
+ stats.apply464xlatAdjustments(sStackedIfaces, mUseBpfStats);
return stats;
}
diff --git a/core/java/com/android/internal/os/ProcStatsUtil.java b/core/java/com/android/internal/os/ProcStatsUtil.java
index 06519758a698..3d4df890852e 100644
--- a/core/java/com/android/internal/os/ProcStatsUtil.java
+++ b/core/java/com/android/internal/os/ProcStatsUtil.java
@@ -20,6 +20,8 @@ import android.annotation.Nullable;
import android.os.StrictMode;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
@@ -27,7 +29,8 @@ import java.io.IOException;
/**
* Utility functions for reading {@code proc} files
*/
-final class ProcStatsUtil {
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
+public final class ProcStatsUtil {
private static final String TAG = "ProcStatsUtil";
@@ -48,8 +51,9 @@ final class ProcStatsUtil {
*
* @param path path of the file to read
*/
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
@Nullable
- static String readNullSeparatedFile(String path) {
+ public static String readNullSeparatedFile(String path) {
String contents = readSingleLineProcFile(path);
if (contents == null) {
return null;
@@ -72,8 +76,9 @@ final class ProcStatsUtil {
*
* @param path path of the file to read
*/
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
@Nullable
- static String readSingleLineProcFile(String path) {
+ public static String readSingleLineProcFile(String path) {
return readTerminatedProcFile(path, (byte) '\n');
}
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 98b7b5d28779..65213c0a1085 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -216,6 +216,11 @@ public final class Zygote {
*/
native protected static void nativeUnmountStorageOnInit();
+ private static void callPostForkSystemServerHooks() {
+ // SystemServer specific post fork hooks run before child post fork hooks.
+ VM_HOOKS.postForkSystemServer();
+ }
+
private static void callPostForkChildHooks(int runtimeFlags, boolean isSystemServer,
boolean isZygote, String instructionSet) {
VM_HOOKS.postForkChild(runtimeFlags, isSystemServer, isZygote, instructionSet);
diff --git a/core/java/com/android/internal/util/ScreenRecordHelper.java b/core/java/com/android/internal/util/ScreenRecordHelper.java
new file mode 100644
index 000000000000..64d089848b7d
--- /dev/null
+++ b/core/java/com/android/internal/util/ScreenRecordHelper.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * Helper class to initiate a screen recording
+ */
+public class ScreenRecordHelper {
+ private static final String SYSUI_PACKAGE = "com.android.systemui";
+ private static final String SYSUI_SCREENRECORD_LAUNCHER =
+ "com.android.systemui.screenrecord.ScreenRecordDialog";
+
+ private final Context mContext;
+
+ /**
+ * Create a new ScreenRecordHelper for the given context
+ * @param context
+ */
+ public ScreenRecordHelper(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Show dialog of screen recording options to user.
+ */
+ public void launchRecordPrompt() {
+ final ComponentName launcherComponent = new ComponentName(SYSUI_PACKAGE,
+ SYSUI_SCREENRECORD_LAUNCHER);
+ final Intent intent = new Intent();
+ intent.setComponent(launcherComponent);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+ }
+}
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 29c55c234677..1e71bd171eea 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -55,7 +55,8 @@ interface IInputMethodManager {
// @NonNull
InputBindResult startInputOrWindowGainedFocus(
/* @StartInputReason */ int startInputReason,
- in IInputMethodClient client, in IBinder windowToken, int controlFlags,
+ in IInputMethodClient client, in IBinder windowToken,
+ /* @StartInputFlags */ int startInputFlags,
/* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode,
int windowFlags, in EditorInfo attribute, IInputContext inputContext,
/* @InputConnectionInspector.MissingMethodFlags */ int missingMethodFlags,
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 80d80638a750..c96bacd636d3 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -55,21 +55,21 @@ import android.util.SparseLongArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
+
import com.google.android.collect.Lists;
import libcore.util.HexEncoding;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.StringJoiner;
+
/**
* Utilities for the lock pattern and its settings.
*/
@@ -1527,7 +1527,7 @@ public class LockPatternUtils {
/**
* @see StrongAuthTracker#isFingerprintAllowedForUser
*/
- public boolean isFingerprintAllowedForUser(int userId) {
+ public boolean isBiometricAllowedForUser(int userId) {
return (getStrongAuthForUser(userId) & ~StrongAuthTracker.ALLOWING_BIOMETRIC) == 0;
}
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index ae0f8b93819c..15745e929c4b 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -26,6 +26,7 @@ import android.os.Build;
import android.os.Environment;
import android.os.Process;
import android.os.storage.StorageManager;
+import android.permission.PermissionManager.SplitPermissionInfo;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -74,6 +75,8 @@ public class SystemConfig {
// system configuration files.
final SparseArray<ArraySet<String>> mSystemPermissions = new SparseArray<>();
+ final ArrayList<SplitPermissionInfo> mSplitPermissions = new ArrayList<>();
+
// These are the built-in shared libraries that were read from the
// system configuration files. Keys are the library names; strings are the
// paths to the libraries.
@@ -192,6 +195,10 @@ public class SystemConfig {
return mSystemPermissions;
}
+ public ArrayList<SplitPermissionInfo> getSplitPermissions() {
+ return mSplitPermissions;
+ }
+
public ArrayMap<String, String> getSharedLibraries() {
return mSharedLibraries;
}
@@ -484,6 +491,8 @@ public class SystemConfig {
perms.add(perm);
XmlUtils.skipCurrentTag(parser);
+ } else if ("split-permission".equals(name) && allowPermissions) {
+ readSplitPermission(parser, permFile);
} else if ("library".equals(name) && allowLibs) {
String lname = parser.getAttributeValue(null, "name");
String lfile = parser.getAttributeValue(null, "file");
@@ -883,4 +892,46 @@ public class SystemConfig {
}
mOemPermissions.put(packageName, permissions);
}
+
+ private void readSplitPermission(XmlPullParser parser, File permFile)
+ throws IOException, XmlPullParserException {
+ String splitPerm = parser.getAttributeValue(null, "name");
+ if (splitPerm == null) {
+ Slog.w(TAG, "<split-permission> without name in " + permFile + " at "
+ + parser.getPositionDescription());
+ XmlUtils.skipCurrentTag(parser);
+ return;
+ }
+ String targetSdkStr = parser.getAttributeValue(null, "targetSdk");
+ int targetSdk = Build.VERSION_CODES.CUR_DEVELOPMENT + 1;
+ if (!TextUtils.isEmpty(targetSdkStr)) {
+ try {
+ targetSdk = Integer.parseInt(targetSdkStr);
+ } catch (NumberFormatException e) {
+ Slog.w(TAG, "<split-permission> targetSdk not an integer in " + permFile + " at "
+ + parser.getPositionDescription());
+ XmlUtils.skipCurrentTag(parser);
+ return;
+ }
+ }
+ final int depth = parser.getDepth();
+ List<String> newPermissions = new ArrayList<>();
+ while (XmlUtils.nextElementWithin(parser, depth)) {
+ String name = parser.getName();
+ if ("new-permission".equals(name)) {
+ final String newName = parser.getAttributeValue(null, "name");
+ if (TextUtils.isEmpty(newName)) {
+ Slog.w(TAG, "name is required for <new-permission> in "
+ + parser.getPositionDescription());
+ continue;
+ }
+ newPermissions.add(newName);
+ } else {
+ XmlUtils.skipCurrentTag(parser);
+ }
+ }
+ if (!newPermissions.isEmpty()) {
+ mSplitPermissions.add(new SplitPermissionInfo(splitPerm, newPermissions, targetSdk));
+ }
+ }
}
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index a45b4933a900..d50e60c1a899 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -657,6 +657,7 @@ static int getPixelFormatFromInternalFormat(uint32_t internalFormat) {
switch (internalFormat) {
// For sized internal format.
case GL_RGBA16F:
+ case GL_SRGB8_ALPHA8:
return GL_RGBA;
// Base internal formats and pixel formats are still the same, see Table 1 in
// https://www.khronos.org/registry/OpenGL-Refpages/es3.1/html/glTexImage2D.xhtml
diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h
index 83a8c2e934c1..f7f13a5f0431 100644
--- a/core/jni/android_media_AudioFormat.h
+++ b/core/jni/android_media_AudioFormat.h
@@ -71,10 +71,10 @@ static inline audio_format_t audioFormatToNative(int audioFormat)
return AUDIO_FORMAT_AAC_HE_V1;
case ENCODING_AAC_HE_V2:
return AUDIO_FORMAT_AAC_HE_V2;
- case ENCODING_DOLBY_TRUEHD:
- return AUDIO_FORMAT_DOLBY_TRUEHD;
case ENCODING_IEC61937:
return AUDIO_FORMAT_IEC61937;
+ case ENCODING_DOLBY_TRUEHD:
+ return AUDIO_FORMAT_DOLBY_TRUEHD;
case ENCODING_AAC_ELD:
return AUDIO_FORMAT_AAC_ELD;
case ENCODING_AAC_XHE:
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index d4a84c15480b..7410b5235060 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -1016,6 +1016,7 @@ static jint convertAudioPortFromNative(JNIEnv *env,
jintArray jFormats = NULL;
jobjectArray jGains = NULL;
jobject jHandle = NULL;
+ jobject jAudioPortConfig = NULL;
jstring jDeviceName = NULL;
bool useInMask;
size_t numPositionMasks = 0;
@@ -1194,7 +1195,6 @@ static jint convertAudioPortFromNative(JNIEnv *env,
goto exit;
}
- jobject jAudioPortConfig;
jStatus = convertAudioPortConfigFromNative(env,
*jAudioPort,
&jAudioPortConfig,
@@ -1230,6 +1230,9 @@ exit:
if (jHandle != NULL) {
env->DeleteLocalRef(jHandle);
}
+ if (jAudioPortConfig != NULL) {
+ env->DeleteLocalRef(jAudioPortConfig);
+ }
return jStatus;
}
@@ -1300,12 +1303,15 @@ android_media_AudioSystem_listAudioPorts(JNIEnv *env, jobject clazz,
}
for (size_t i = 0; i < numPorts; i++) {
- jobject jAudioPort;
+ jobject jAudioPort = NULL;
jStatus = convertAudioPortFromNative(env, &jAudioPort, &nPorts[i]);
if (jStatus != AUDIO_JAVA_SUCCESS) {
goto exit;
}
env->CallBooleanMethod(jPorts, gArrayListMethods.add, jAudioPort);
+ if (jAudioPort != NULL) {
+ env->DeleteLocalRef(jAudioPort);
+ }
}
exit:
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index ec980800c410..fd042b39f7c2 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -865,17 +865,17 @@ void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
// ----------------------------------------------------------------------------
-static jint android_os_Binder_getCallingPid(JNIEnv* env, jobject clazz)
+static jint android_os_Binder_getCallingPid()
{
return IPCThreadState::self()->getCallingPid();
}
-static jint android_os_Binder_getCallingUid(JNIEnv* env, jobject clazz)
+static jint android_os_Binder_getCallingUid()
{
return IPCThreadState::self()->getCallingUid();
}
-static jlong android_os_Binder_clearCallingIdentity(JNIEnv* env, jobject clazz)
+static jlong android_os_Binder_clearCallingIdentity()
{
return IPCThreadState::self()->clearCallingIdentity();
}
@@ -894,12 +894,12 @@ static void android_os_Binder_restoreCallingIdentity(JNIEnv* env, jobject clazz,
IPCThreadState::self()->restoreCallingIdentity(token);
}
-static void android_os_Binder_setThreadStrictModePolicy(JNIEnv* env, jobject clazz, jint policyMask)
+static void android_os_Binder_setThreadStrictModePolicy(jint policyMask)
{
IPCThreadState::self()->setStrictModePolicy(policyMask);
}
-static jint android_os_Binder_getThreadStrictModePolicy(JNIEnv* env, jobject clazz)
+static jint android_os_Binder_getThreadStrictModePolicy()
{
return IPCThreadState::self()->getStrictModePolicy();
}
@@ -950,11 +950,16 @@ static void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject cla
static const JNINativeMethod gBinderMethods[] = {
/* name, signature, funcPtr */
+ // @CriticalNative
{ "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid },
+ // @CriticalNative
{ "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid },
+ // @CriticalNative
{ "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity },
{ "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity },
+ // @CriticalNative
{ "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy },
+ // @CriticalNative
{ "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy },
// @CriticalNative
{ "setThreadWorkSource", "(I)I", (void*)android_os_Binder_setThreadWorkSource },
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 3e04bb3a2019..4e20e294350f 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -84,6 +84,7 @@ static pid_t gSystemServerPid = 0;
static const char kIsolatedStorage[] = "persist.sys.isolated_storage";
static const char kZygoteClassName[] = "com/android/internal/os/Zygote";
static jclass gZygoteClass;
+static jmethodID gCallPostForkSystemServerHooks;
static jmethodID gCallPostForkChildHooks;
static bool g_is_security_enforced = true;
@@ -886,6 +887,18 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGi
// Unset the SIGCHLD handler, but keep ignoring SIGHUP (rationale in SetSignalHandlers).
UnsetChldSignalHandler();
+ if (is_system_server) {
+ env->CallStaticVoidMethod(gZygoteClass, gCallPostForkSystemServerHooks);
+ if (env->ExceptionCheck()) {
+ fail_fn("Error calling post fork system server hooks.");
+ }
+ // TODO(oth): Remove hardcoded label here (b/117874058).
+ static const char* kSystemServerLabel = "u:r:system_server:s0";
+ if (selinux_android_setcon(kSystemServerLabel) != 0) {
+ fail_fn(CREATE_ERROR("selinux_android_setcon(%s)", kSystemServerLabel));
+ }
+ }
+
env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,
is_system_server, is_child_zygote, instructionSet);
if (env->ExceptionCheck()) {
@@ -1181,6 +1194,9 @@ static const JNINativeMethod gMethods[] = {
int register_com_android_internal_os_Zygote(JNIEnv* env) {
gZygoteClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kZygoteClassName));
+ gCallPostForkSystemServerHooks = GetStaticMethodIDOrDie(env, gZygoteClass,
+ "callPostForkSystemServerHooks",
+ "()V");
gCallPostForkChildHooks = GetStaticMethodIDOrDie(env, gZygoteClass, "callPostForkChildHooks",
"(IZZLjava/lang/String;)V");
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index f56f7eca5f00..2465759a9fa5 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -37,6 +37,7 @@ static const char* kPathWhitelist[] = {
"/dev/socket/zygote",
"/dev/socket/zygote_secondary",
"/dev/socket/webview_zygote",
+ "/dev/socket/heapprofd",
"/sys/kernel/debug/tracing/trace_marker",
"/system/framework/framework-res.apk",
"/dev/urandom",
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
index 30a9a01c3448..2ace1ac491c7 100644
--- a/core/proto/OWNERS
+++ b/core/proto/OWNERS
@@ -9,7 +9,11 @@ kwekua@google.com
singhtejinder@google.com
yanglu@google.com
yaochen@google.com
+yro@google.com
# Frameworks
ogunwale@google.com
jjaggi@google.com
+
+# Launcher
+hyunyoungs@google.com
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index 1dc435c0c7ce..54333938c52d 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -26,38 +26,43 @@ enum Action {
ACTION_UNKNOWN = 0;
PAGE_VISIBLE = 1;
PAGE_HIDE = 2;
- PREF_CHANGE = 3;
+
+ // ACTION: Settings > Any preference is changed
+ ACTION_SETTINGS_PREFERENCE_CHANGE = 853;
}
/**
* Id for Settings pages. Each page must have its own unique Id.
*/
enum PageId {
- // Unknown page. Should not be used in production code.
- PAGE_UNKNOWN = 0;
+ // Unknown page. Should not be used in production code.
+ PAGE_UNKNOWN = 0;
+
+ // OPEN: Settings homepage
+ SETTINGS_HOMEPAGE = 1502;
- // OPEN: Settings homepage
- SETTINGS_HOMEPAGE = 1502;
+ // OPEN: Settings > System > Input & Gesture > Wake screen
+ SETTINGS_GESTURE_WAKE_SCREEN = 1570;
- // OPEN: Settings > System > Input & Gesture > Wake screen
- SETTINGS_GESTURE_WAKE_SCREEN = 1570;
+ // OPEN: Settings > Network & internet > Mobile network
+ MOBILE_NETWORK = 1571;
- // OPEN: Settings > Network & internet > Mobile network
- MOBILE_NETWORK = 1571;
+ // OPEN: Settings > Network & internet > Mobile network > Choose network
+ MOBILE_NETWORK_SELECT = 1581;
- // OPEN: Settings > Network & internet > Mobile network > Choose network
- MOBILE_NETWORK_SELECT = 1581;
+ // OPEN: Settings > Network & internet > Mobile network > Mobile Data > Dialog
+ MOBILE_DATA_DIALOG = 1582;
- // OPEN: Settings > Network & internet > Mobile network > Mobile Data > Dialog
- MOBILE_DATA_DIALOG = 1582;
+ // OPEN: Settings > Network & internet > Mobile network > Data roaming > Dialog
+ MOBILE_ROAMING_DIALOG = 1583;
- // OPEN: Settings > Network & internet > Mobile network > Data roaming > Dialog
- MOBILE_ROAMING_DIALOG = 1583;
+ // Settings > Display > Lock screen display > On lock screen
+ LOCK_SCREEN_NOTIFICATION_CONTENT = 1584;
- // Settings > Display > Lock screen display > On lock screen
- LOCK_SCREEN_NOTIFICATION_CONTENT = 1584;
+ // ConfirmDeviceCredentials > BiometricPrompt
+ BIOMETRIC_FRAGMENT = 1585;
- // ConfirmDeviceCredentials > BiometricPrompt
- BIOMETRIC_FRAGMENT = 1585;
+ // OPEN: Biometric Enrollment (android.settings.BIOMETRIC_ENROLL action intent)
+ BIOMETRIC_ENROLL_ACTIVITY = 1586;
}
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index c1c86f088873..b0dbaa03760e 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -45,7 +45,6 @@ message WindowManagerServiceDumpProto {
optional bool display_frozen = 6;
optional int32 rotation = 7;
optional int32 last_orientation = 8;
- optional AppTransitionProto app_transition = 9;
}
/* represents RootWindowContainer object */
@@ -159,6 +158,7 @@ message DisplayContentProto {
optional DisplayFramesProto display_frames = 13;
optional int32 surface_size = 14;
optional string focused_app = 15;
+ optional AppTransitionProto app_transition = 16;
}
/* represents DisplayFrames */
diff --git a/core/proto/android/service/adb.proto b/core/proto/android/service/adb.proto
new file mode 100644
index 000000000000..006081399f64
--- /dev/null
+++ b/core/proto/android/service/adb.proto
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.service.adb;
+
+option java_multiple_files = true;
+option java_outer_classname = "AdbServiceProto";
+
+import "frameworks/base/libs/incident/proto/android/privacy.proto";
+
+message AdbServiceDumpProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional AdbDebuggingManagerProto debugging_manager = 1;
+}
+
+message AdbDebuggingManagerProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional bool connected_to_adb = 1;
+ optional string last_key_recevied = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ];
+ optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ];
+}
diff --git a/core/proto/android/stats/launcher/Android.bp b/core/proto/android/stats/launcher/Android.bp
new file mode 100644
index 000000000000..b8fb6ffc6677
--- /dev/null
+++ b/core/proto/android/stats/launcher/Android.bp
@@ -0,0 +1,27 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+java_library {
+ name: "launcherprotosnano",
+ proto: {
+ type: "nano",
+ output_params: ["store_unknown_fields=true"],
+ include_dirs: ["external/protobuf/src"],
+ },
+
+ sdk_version: "current",
+ srcs: [
+ "*.proto",
+ ],
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index cd6bf666b5a1..48d1dff02971 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -488,6 +488,7 @@
<protected-broadcast android:name="android.telephony.action.CARRIER_CONFIG_CHANGED" />
<protected-broadcast android:name="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
<protected-broadcast android:name="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
+ <protected-broadcast android:name="android.telephony.action.SECRET_CODE" />
<protected-broadcast android:name="android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION" />
<protected-broadcast android:name="android.telephony.action.SUBSCRIPTION_PLANS_CHANGED" />
@@ -1791,6 +1792,12 @@
<permission android:name="android.permission.MANAGE_USB"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to manage Android Debug Bridge settings.
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.MANAGE_DEBUGGING"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to access the MTP USB kernel driver.
For use only by the device side MTP implementation.
@hide -->
@@ -4199,6 +4206,11 @@
<permission android:name="android.permission.READ_CLIPBOARD_IN_BACKGROUND"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows modifying accessibility state.
+ @hide -->
+ <permission android:name="android.permission.MANAGE_ACCESSIBILITY"
+ android:protectionLevel="signature|setup" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 425dfe529775..453bedfa9a59 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -262,7 +262,7 @@
<string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN-a"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Administracija uređaja"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string>
- <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Promotivna demonstracija u maloprodaji"</string>
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Prodajna demonstracija"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"USB veza"</string>
<string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"Pokrenuta je aplikacija"</string>
<string name="notification_channel_foreground_service" msgid="3931987440602669158">"Aplikacije koje troše bateriju"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 3ac65fd49f90..2472e2b1e3ec 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -651,14 +651,14 @@
<string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea el tablet o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
<string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea la TV o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea el teléfono o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string>
- <string name="policylab_resetPassword" msgid="4934707632423915395">"Cambiar el bloqueo de pantalla"</string>
- <string name="policydesc_resetPassword" msgid="1278323891710619128">"Cambiar el bloqueo de pantalla"</string>
+ <string name="policylab_resetPassword" msgid="4934707632423915395">"Cambia el bloqueo de pantalla"</string>
+ <string name="policydesc_resetPassword" msgid="1278323891710619128">"Cambia el bloqueo de pantalla"</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Bloquear la pantalla"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Controlar cómo y cuándo se bloquea la pantalla"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Controla cómo y cuándo se bloquea la pantalla"</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"Borrar todos los datos"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Borrar los datos del tablet sin avisar restableciendo el estado de fábrica"</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Borra los datos de la TV sin advertencia previa restableciendo la TV a los valores predeterminados de fábrica."</string>
- <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Borrar los datos del teléfono sin avisar restableciendo el estado de fábrica"</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Borra los datos del teléfono sin avisar restableciendo el estado de fábrica"</string>
<string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"Borrar datos del usuario"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Borra los datos del usuario en este tablet sin avisar."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Borra los datos del usuario en esta TV sin avisar."</string>
@@ -670,7 +670,7 @@
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"Cifrado del almacenamiento"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exige que se cifren los datos de la aplicación almacenados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Inhabilitar cámaras"</string>
- <string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar el uso de las cámaras del dispositivo"</string>
+ <string name="policydesc_disableCamera" msgid="2306349042834754597">"Evita el uso de las cámaras del dispositivo"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Inhabilitar algunas funciones del bloqueo de pantalla"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Evitar el uso de algunas funciones del bloqueo de pantalla"</string>
<string-array name="phoneTypes">
diff --git a/core/res/res/values-mcc208-mnc01/config.xml b/core/res/res/values-mcc208-mnc01/config.xml
deleted file mode 100644
index 5930e3aa7a12..000000000000
--- a/core/res/res/values-mcc208-mnc01/config.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. Do not translate. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Orange Internet,orange.fr,,,orange,orange,,,,,208,01,1,DUN</item>
- </string-array>
-
-</resources>
diff --git a/core/res/res/values-mcc208-mnc10/config.xml b/core/res/res/values-mcc208-mnc10/config.xml
deleted file mode 100644
index 3ed78181ffe6..000000000000
--- a/core/res/res/values-mcc208-mnc10/config.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You my 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.
-*/
--->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>SFR option modem,websfr,,,,,,,,,208,10,,DUN</item>
- <item>[ApnSettingV3]INTERNET NRJ,internetnrj,,,,,,,,,208,10,,DUN,,,true,0,,,,,,,gid,4E</item>
- </string-array>
-
-</resources>
diff --git a/core/res/res/values-mcc214-mnc01/config.xml b/core/res/res/values-mcc214-mnc01/config.xml
index 41e24d779362..b34696b14d94 100644
--- a/core/res/res/values-mcc214-mnc01/config.xml
+++ b/core/res/res/values-mcc214-mnc01/config.xml
@@ -31,15 +31,6 @@
<item>9</item>
</integer-array>
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>INTERNET,airtelnet.es,,,vodafone,vodafone,,,,,214,01,1,DUN</item>
- </string-array>
-
<!-- Whether safe headphone volume warning dialog is disabled on Vol+ (operator specific). -->
<bool name="config_safe_media_disable_on_volume_up">false</bool>
diff --git a/core/res/res/values-mcc214-mnc07/config.xml b/core/res/res/values-mcc214-mnc07/config.xml
deleted file mode 100644
index 4b7cc7c0d089..000000000000
--- a/core/res/res/values-mcc214-mnc07/config.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, 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 my 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.
-*/
--->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Conexión Compartida,movistar.es,,,MOVISTAR,MOVISTAR,,,,,214,07,1,DUN</item>
- </string-array>
-
-</resources>
diff --git a/core/res/res/values-mcc222-mnc10/config.xml b/core/res/res/values-mcc222-mnc10/config.xml
index 0085a1b7e190..abacef0d7e4f 100644
--- a/core/res/res/values-mcc222-mnc10/config.xml
+++ b/core/res/res/values-mcc222-mnc10/config.xml
@@ -20,15 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. Do not translate. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Tethering Internet,web.omnitel.it,,,,,,,,,222,10,,DUN</item>
- </string-array>
-
<!-- Whether safe headphone volume warning dialog is disabled on Vol+ (operator specific). -->
<bool name="config_safe_media_disable_on_volume_up">false</bool>
diff --git a/core/res/res/values-mcc234-mnc20/config.xml b/core/res/res/values-mcc234-mnc20/config.xml
index 1e4bb0be8802..224dc3113c1b 100644
--- a/core/res/res/values-mcc234-mnc20/config.xml
+++ b/core/res/res/values-mcc234-mnc20/config.xml
@@ -20,15 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>3hotspot,3hotspot,,,,,,,,,234,20,0,DUN</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1440</integer>
diff --git a/core/res/res/values-mcc235-mnc94/config.xml b/core/res/res/values-mcc235-mnc94/config.xml
index d527304379fb..38ae2a0dceab 100644
--- a/core/res/res/values-mcc235-mnc94/config.xml
+++ b/core/res/res/values-mcc235-mnc94/config.xml
@@ -31,14 +31,6 @@
<item>9</item>
</integer-array>
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>3hotspot,3hotspot,,,,,,,,,235,94,0,DUN</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1440</integer>
diff --git a/core/res/res/values-mcc268-mnc03/config.xml b/core/res/res/values-mcc268-mnc03/config.xml
index 2f5171bccf35..876c26e7f629 100644
--- a/core/res/res/values-mcc268-mnc03/config.xml
+++ b/core/res/res/values-mcc268-mnc03/config.xml
@@ -30,13 +30,4 @@
<item>7</item>
<item>9</item>
</integer-array>
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,270,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Optimus HotSpot,modem,,,,,,,,,268,03,,DUN</item>
- </string-array>
</resources>
diff --git a/core/res/res/values-mcc302-mnc220/config.xml b/core/res/res/values-mcc302-mnc220/config.xml
index 13f6bce4d30e..36efd0a28b91 100644
--- a/core/res/res/values-mcc302-mnc220/config.xml
+++ b/core/res/res/values-mcc302-mnc220/config.xml
@@ -23,17 +23,6 @@
<integer name="config_mobile_mtu">1410</integer>
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>[ApnSettingV3]TELUS ISP,isp.telus.com,,,,,,,,,302,220,,DUN,IP,IP,true,0,,,,,,,gid,5455</item>
- <item>[ApnSettingV3]Tethered Mobile Internet,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,5043</item>
- <item>[ApnSettingV3]Tethered Public Mobile,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,4D4F</item>
- </string-array>
-
<!-- Values for GPS configuration (Telus) -->
<string-array translatable="false" name="config_gpsParameters">
<item>SUPL_HOST=supl.google.com</item>
diff --git a/core/res/res/values-mcc302-mnc221/config.xml b/core/res/res/values-mcc302-mnc221/config.xml
index d45b91a7b74b..a11dd95174a2 100644
--- a/core/res/res/values-mcc302-mnc221/config.xml
+++ b/core/res/res/values-mcc302-mnc221/config.xml
@@ -20,18 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>[ApnSettingV3]TELUS ISP,isp.telus.com,,,,,,,,,302,221,,DUN,,,true,0,,,,,,,gid,5455</item>
- <item>[ApnSettingV3]Tethered PC Mobile,isp.mb.com,,,,,,,,,302,221,,DUN,,,true,0,,,,,,,gid,5043</item>
- <item>[ApnSettingV3]Koodo,sp.koodo.com,,,,,,,,,302,221,,DUN,,,true,0,,,,,,,gid,4B4F</item>
- </string-array>
-
<!-- Values for GPS configuration (Telus) -->
<string-array translatable="false" name="config_gpsParameters">
<item>SUPL_HOST=supl.google.com</item>
diff --git a/core/res/res/values-mcc302-mnc370/config.xml b/core/res/res/values-mcc302-mnc370/config.xml
index b520d5d95a34..8d29ec15bf6b 100644
--- a/core/res/res/values-mcc302-mnc370/config.xml
+++ b/core/res/res/values-mcc302-mnc370/config.xml
@@ -20,17 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. Do not translate. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Fido LTE Tethering,ltedata.apn,,,,,,,,,302,370,,DUN</item>
- <item>[ApnSettingV3]MTS Tethering,internet.mts,,,,,,,,,302,370,,DUN,,,true,0,,,,,,,gid,2C</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1410</integer>
diff --git a/core/res/res/values-mcc302-mnc660/config.xml b/core/res/res/values-mcc302-mnc660/config.xml
index 8c2e7023081e..beb233670c2d 100644
--- a/core/res/res/values-mcc302-mnc660/config.xml
+++ b/core/res/res/values-mcc302-mnc660/config.xml
@@ -29,16 +29,6 @@
<item>7</item>
<item>9</item>
</integer-array>
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>MTS -Tethering,internet.mts,,,,,,,,,302,660,,DUN</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1430</integer>
diff --git a/core/res/res/values-mcc302-mnc720/config.xml b/core/res/res/values-mcc302-mnc720/config.xml
index 11bfa056d295..735a8c80e4e8 100644
--- a/core/res/res/values-mcc302-mnc720/config.xml
+++ b/core/res/res/values-mcc302-mnc720/config.xml
@@ -20,19 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. Do not translate. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Rogers LTE Tethering,ltedata.apn,,,,,,,,,302,720,,DUN</item>
- <item>[ApnSettingV3]chatr Tethering,chatrisp.apn,,,,,,,,,302,720,,DUN,,,true,0,,,,,,,imsi,302720x94</item>
- <item>[ApnSettingV3]Tbaytel Tethering,ltedata.apn,,,,,,,,,302,720,,DUN,IPV4V6,IP,true,0,,,,,,,gid,BA</item>
- <item>[ApnSettingV3]Cityfone Tethering,ltedata.apn,,,,,,,,,302,720,,DUN,IPV4V6,IP,true,0,,,,,,,spn,CITYFONE</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1430</integer>
diff --git a/core/res/res/values-mcc311-mnc190/config.xml b/core/res/res/values-mcc311-mnc190/config.xml
index c17a07c963e0..876c26e7f629 100644
--- a/core/res/res/values-mcc311-mnc190/config.xml
+++ b/core/res/res/values-mcc311-mnc190/config.xml
@@ -30,13 +30,4 @@
<item>7</item>
<item>9</item>
</integer-array>
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Tether,broadband.cellular1.net,,,,,,,,,311,190,,DUN</item>
- </string-array>
-
</resources>
diff --git a/core/res/res/values-mcc334-mnc050/config.xml b/core/res/res/values-mcc334-mnc050/config.xml
index 616a8e8fa283..23678f15fba3 100644
--- a/core/res/res/values-mcc334-mnc050/config.xml
+++ b/core/res/res/values-mcc334-mnc050/config.xml
@@ -31,15 +31,6 @@
<item>9</item>
</integer-array>
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Modem,modem.iusacellgsm.mx,,,iusacellgsm,iusacellgsm,,,,,334,050,1,DUN</item>
- </string-array>
-
<!-- Do not translate. Defines the slots is Two Digit Number for dialing normally not USSD -->
<string-array translatable="false" name="config_twoDigitNumberPattern">
<item>"#9"</item>
diff --git a/core/res/res/values-mcc340-mnc01/config.xml b/core/res/res/values-mcc340-mnc01/config.xml
index 1ca89635af7b..3b23b85e61d2 100644
--- a/core/res/res/values-mcc340-mnc01/config.xml
+++ b/core/res/res/values-mcc340-mnc01/config.xml
@@ -29,13 +29,4 @@
<item>7</item>
<item>9</item>
</integer-array>
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>Orangeweb,orangeweb,,,orange,orange,,,,,340,01,1,DUN</item>
- </string-array>
</resources>
diff --git a/core/res/res/values-mcc425-mnc07/config.xml b/core/res/res/values-mcc425-mnc07/config.xml
index 770cebde8c1d..876c26e7f629 100644
--- a/core/res/res/values-mcc425-mnc07/config.xml
+++ b/core/res/res/values-mcc425-mnc07/config.xml
@@ -30,13 +30,4 @@
<item>7</item>
<item>9</item>
</integer-array>
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>PC HOT mobile,pc.hotm,,,,,,,,,425,07,,DUN</item>
- </string-array>
</resources>
diff --git a/core/res/res/values-mcc454-mnc10/config.xml b/core/res/res/values-mcc454-mnc10/config.xml
deleted file mode 100644
index 79a9a7e00ca5..000000000000
--- a/core/res/res/values-mcc454-mnc10/config.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, 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 my 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.
-*/
--->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
- <string-array translatable="false" name="config_tether_apndata">
- <item>one2free Tethering,internet,,,,,,,,,454,10,0,DUN</item>
- </string-array>
-
-</resources>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 99af0de749d6..6fc0f5b33a36 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -2735,4 +2735,10 @@
<attr name="name" format="string" />
</declare-styleable>
+
+ <declare-styleable name="AndroidManifestProfileable" parent="AndroidManifestApplication">
+ <!-- Flag indicating whether the application can be profiled by the shell user,
+ even when running on a device that is running in user mode. -->
+ <attr name="shell" format="boolean" />
+ </declare-styleable>
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index e257a5cdae34..a8c78a686d28 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -513,17 +513,6 @@
<string-array translatable="false" name="config_cdma_dun_supported_types">
</string-array>
- <!-- String containing the apn value for tethering. May be overriden by secure settings
- TETHER_DUN_APN. Value is a comma separated series of strings:
- "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type",
- Or string format of ApnSettingV3 or higher.
- note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN"
- Multiple entries are separated by using string-array:
- "<item>[ApnSettingV3]Name,apn,,,,,,,,,123,45,,mms|*,IPV6,IP,true,14,,,,,,,spn,testspn</item>
- <item>[ApnSettingV5]Name1,apn2,,,,,,,,,123,46,,mms|*,IPV6,IP,true,12,,,,,,,,,,</item>" -->
- <string-array translatable="false" name="config_tether_apndata">
- </string-array>
-
<!-- Boolean indicating whether the wifi chipset has dual frequency band support -->
<bool translatable="false" name="config_wifi_dual_band_support">false</bool>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index b7908297f60b..e1c5df39676b 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2917,6 +2917,7 @@
<public name="isSplitRequired" />
<public name="textLocale" />
<public name="settingsSliceUri" />
+ <public name="shell" />
</public-group>
<public-group type="drawable" first-id="0x010800b4">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index abd653b72f6c..670a4a220abf 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1831,7 +1831,6 @@
<java-symbol type="array" name="config_tether_dhcp_range" />
<java-symbol type="array" name="config_tether_upstream_types" />
<java-symbol type="bool" name="config_tether_upstream_automatic" />
- <java-symbol type="array" name="config_tether_apndata" />
<java-symbol type="array" name="config_tether_usb_regexs" />
<java-symbol type="array" name="config_tether_wifi_regexs" />
<java-symbol type="array" name="config_usbHostBlacklist" />
diff --git a/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java
new file mode 100644
index 000000000000..51e5aec8b219
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/ModelFileManagerTest.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.view.textclassifier;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.os.LocaleList;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ModelFileManagerTest {
+
+ @Mock
+ private Supplier<List<ModelFileManager.ModelFile>> mModelFileSupplier;
+ private ModelFileManager.ModelFileSupplierImpl mModelFileSupplierImpl;
+ private ModelFileManager mModelFileManager;
+ private File mRootTestDir;
+ private File mFactoryModelDir;
+ private File mUpdatedModelFile;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mModelFileManager = new ModelFileManager(mModelFileSupplier);
+ mRootTestDir = InstrumentationRegistry.getContext().getCacheDir();
+ mFactoryModelDir = new File(mRootTestDir, "factory");
+ mUpdatedModelFile = new File(mRootTestDir, "updated.model");
+
+ mModelFileSupplierImpl =
+ new ModelFileManager.ModelFileSupplierImpl(
+ mFactoryModelDir,
+ "test\\d.model",
+ mUpdatedModelFile,
+ fd -> 1,
+ fd -> ModelFileManager.ModelFile.LANGUAGE_INDEPENDENT
+ );
+
+ mRootTestDir.mkdirs();
+ mFactoryModelDir.mkdirs();
+ }
+
+ @After
+ public void removeTestDir() {
+ recursiveDelete(mRootTestDir);
+ }
+
+ @Test
+ public void get() {
+ ModelFileManager.ModelFile modelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1, Collections.emptyList(), true);
+ when(mModelFileSupplier.get()).thenReturn(Collections.singletonList(modelFile));
+
+ List<ModelFileManager.ModelFile> modelFiles = mModelFileManager.listModelFiles();
+
+ assertThat(modelFiles).hasSize(1);
+ assertThat(modelFiles.get(0)).isEqualTo(modelFile);
+ }
+
+ @Test
+ public void findBestModel_versionCode() {
+ ModelFileManager.ModelFile olderModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.emptyList(), true);
+
+ ModelFileManager.ModelFile newerModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 2,
+ Collections.emptyList(), true);
+ when(mModelFileSupplier.get())
+ .thenReturn(Arrays.asList(olderModelFile, newerModelFile));
+
+ ModelFileManager.ModelFile bestModelFile =
+ mModelFileManager.findBestModelFile(LocaleList.getEmptyLocaleList());
+
+ assertThat(bestModelFile).isEqualTo(newerModelFile);
+ }
+
+ @Test
+ public void findBestModel_languageDependentModelIsPreferred() {
+ Locale locale = Locale.forLanguageTag("ja");
+ ModelFileManager.ModelFile languageIndependentModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.emptyList(), true);
+
+ ModelFileManager.ModelFile languageDependentModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 1,
+ Collections.singletonList(locale), false);
+ when(mModelFileSupplier.get())
+ .thenReturn(
+ Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
+
+ ModelFileManager.ModelFile bestModelFile =
+ mModelFileManager.findBestModelFile(
+ LocaleList.forLanguageTags(locale.toLanguageTag()));
+ assertThat(bestModelFile).isEqualTo(languageDependentModelFile);
+ }
+
+ @Test
+ public void findBestModel_useIndependentWhenNoLanguageModelMatch() {
+ Locale locale = Locale.forLanguageTag("ja");
+ ModelFileManager.ModelFile languageIndependentModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.emptyList(), true);
+
+ ModelFileManager.ModelFile languageDependentModelFile =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 1,
+ Collections.singletonList(locale), false);
+
+ when(mModelFileSupplier.get())
+ .thenReturn(
+ Arrays.asList(languageIndependentModelFile, languageDependentModelFile));
+
+ ModelFileManager.ModelFile bestModelFile =
+ mModelFileManager.findBestModelFile(
+ LocaleList.forLanguageTags("zh-hk"));
+ assertThat(bestModelFile).isEqualTo(languageIndependentModelFile);
+ }
+
+ @Test
+ public void findBestModel_languageIsMoreImportantThanVersion() {
+ ModelFileManager.ModelFile matchButOlderModel =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("fr")), false);
+
+ ModelFileManager.ModelFile mismatchButNewerModel =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 2,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ when(mModelFileSupplier.get())
+ .thenReturn(
+ Arrays.asList(matchButOlderModel, mismatchButNewerModel));
+
+ ModelFileManager.ModelFile bestModelFile =
+ mModelFileManager.findBestModelFile(
+ LocaleList.forLanguageTags("fr"));
+ assertThat(bestModelFile).isEqualTo(matchButOlderModel);
+ }
+
+ @Test
+ public void modelFileEquals() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ ModelFileManager.ModelFile modelB =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ assertThat(modelA).isEqualTo(modelB);
+ }
+
+ @Test
+ public void modelFile_different() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ ModelFileManager.ModelFile modelB =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ assertThat(modelA).isNotEqualTo(modelB);
+ }
+
+
+ @Test
+ public void modelFile_getPath() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ assertThat(modelA.getPath()).isEqualTo("/path/a");
+ }
+
+ @Test
+ public void modelFile_getName() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ assertThat(modelA.getName()).isEqualTo("a");
+ }
+
+ @Test
+ public void modelFile_isPreferredTo_languageDependentIsBetter() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 1,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ ModelFileManager.ModelFile modelB =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 2,
+ Collections.emptyList(), true);
+
+ assertThat(modelA.isPreferredTo(modelB)).isTrue();
+ }
+
+ @Test
+ public void modelFile_isPreferredTo_version() {
+ ModelFileManager.ModelFile modelA =
+ new ModelFileManager.ModelFile(
+ new File("/path/a"), 2,
+ Collections.singletonList(Locale.forLanguageTag("ja")), false);
+
+ ModelFileManager.ModelFile modelB =
+ new ModelFileManager.ModelFile(
+ new File("/path/b"), 1,
+ Collections.emptyList(), false);
+
+ assertThat(modelA.isPreferredTo(modelB)).isTrue();
+ }
+
+ @Test
+ public void testFileSupplierImpl_updatedFileOnly() throws IOException {
+ mUpdatedModelFile.createNewFile();
+ File model1 = new File(mFactoryModelDir, "test1.model");
+ model1.createNewFile();
+ File model2 = new File(mFactoryModelDir, "test2.model");
+ model2.createNewFile();
+ new File(mFactoryModelDir, "not_match_regex.model").createNewFile();
+
+ List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
+ List<String> modelFilePaths =
+ modelFiles
+ .stream()
+ .map(modelFile -> modelFile.getPath())
+ .collect(Collectors.toList());
+
+ assertThat(modelFiles).hasSize(3);
+ assertThat(modelFilePaths).containsExactly(
+ mUpdatedModelFile.getAbsolutePath(),
+ model1.getAbsolutePath(),
+ model2.getAbsolutePath());
+ }
+
+ @Test
+ public void testFileSupplierImpl_empty() {
+ mFactoryModelDir.delete();
+ List<ModelFileManager.ModelFile> modelFiles = mModelFileSupplierImpl.get();
+
+ assertThat(modelFiles).hasSize(0);
+ }
+
+ private static void recursiveDelete(File f) {
+ if (f.isDirectory()) {
+ for (File innerFile : f.listFiles()) {
+ recursiveDelete(innerFile);
+ }
+ }
+ f.delete();
+ }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
index de863d743442..91a54409608a 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
@@ -29,6 +29,7 @@ import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.support.test.InstrumentationRegistry;
@@ -48,6 +49,13 @@ import java.util.Locale;
@RunWith(AndroidJUnit4.class)
public class TextClassificationTest {
+ private static final String BUNDLE_KEY = "key";
+ private static final String BUNDLE_VALUE = "value";
+ private static final Bundle BUNDLE = new Bundle();
+ static {
+ BUNDLE.putString(BUNDLE_KEY, BUNDLE_VALUE);
+ }
+
public Icon generateTestIcon(int width, int height, int colorValue) {
final int numPixels = width * height;
final int[] colors = new int[numPixels];
@@ -89,6 +97,7 @@ public class TextClassificationTest {
.setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
.setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
.setId(id)
+ .setExtras(BUNDLE)
.build();
// Parcel and unparcel
@@ -119,6 +128,9 @@ public class TextClassificationTest {
assertEquals(TextClassifier.TYPE_ADDRESS, result.getEntity(1));
assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f);
assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f);
+
+ // Extras
+ assertEquals(BUNDLE_VALUE, result.getExtras().getString(BUNDLE_KEY));
}
@Test
@@ -182,6 +194,7 @@ public class TextClassificationTest {
new TextClassification.Request.Builder(text, 0, text.length())
.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
.setReferenceTime(referenceTime)
+ .setExtras(BUNDLE)
.build();
// Parcel and unparcel.
@@ -197,5 +210,6 @@ public class TextClassificationTest {
assertEquals(referenceTime, result.getReferenceTime());
assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
assertEquals(referenceTime, result.getReferenceTime());
+ assertEquals(BUNDLE_VALUE, result.getExtras().getString(BUNDLE_KEY));
}
}
diff --git a/core/tests/coretests/src/android/widget/RemoteViewsTest.java b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
index 70cf097f42a3..44561227a497 100644
--- a/core/tests/coretests/src/android/widget/RemoteViewsTest.java
+++ b/core/tests/coretests/src/android/widget/RemoteViewsTest.java
@@ -16,11 +16,14 @@
package android.widget;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import android.app.ActivityOptions;
import android.app.PendingIntent;
+import android.appwidget.AppWidgetHostView;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -444,4 +447,40 @@ public class RemoteViewsTest {
}
return found[0];
}
+
+ @Test
+ public void sharedElement_pendingIntent_notifyParent() throws Exception {
+ RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test);
+ PendingIntent pi = PendingIntent.getBroadcast(mContext, 0,
+ new Intent("android.widget.RemoteViewsTest_shared_element"),
+ PendingIntent.FLAG_ONE_SHOT);
+ views.setOnClickResponse(R.id.image, RemoteViews.RemoteResponse.fromPendingIntent(pi)
+ .addSharedElement(0, "e0")
+ .addSharedElement(1, "e1")
+ .addSharedElement(2, "e2"));
+
+ WidgetContainer container = new WidgetContainer(mContext);
+ container.addView(new RemoteViews(views).apply(mContext, container));
+ container.findViewById(R.id.image).performClick();
+
+ assertArrayEquals(container.mSharedViewIds, new int[] {0, 1, 2});
+ assertArrayEquals(container.mSharedViewNames, new String[] {"e0", "e1", "e2"});
+ }
+
+ private class WidgetContainer extends AppWidgetHostView {
+ int[] mSharedViewIds;
+ String[] mSharedViewNames;
+
+ WidgetContainer(Context context) {
+ super(context);
+ }
+
+ @Override
+ public ActivityOptions createSharedElementActivityOptions(
+ int[] sharedViewIds, String[] sharedViewNames, Intent fillInIntent) {
+ mSharedViewIds = sharedViewIds;
+ mSharedViewNames = sharedViewNames;
+ return null;
+ }
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java
new file mode 100644
index 000000000000..629f7b60471c
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodDebugTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.inputmethod;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.WindowManager.LayoutParams;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class InputMethodDebugTest {
+ @Test
+ public void testStartInputReasonToString() {
+ // TODO: Use reflection to make sure that all the constants defined in StartInputReason are
+ // covered.
+ assertEquals("UNSPECIFIED",
+ InputMethodDebug.startInputReasonToString(StartInputReason.UNSPECIFIED));
+ }
+
+ @Test
+ public void testUnbindReasonToString() {
+ // TODO: Use reflection to make sure that all the constants defined in UnbindReason are
+ // covered.
+ assertEquals("UNSPECIFIED",
+ InputMethodDebug.startInputReasonToString(UnbindReason.UNSPECIFIED));
+ }
+
+ @Test
+ public void testSoftInputModeToString() {
+ // TODO: add more tests
+ assertEquals("STATE_UNCHANGED|ADJUST_RESIZE|IS_FORWARD_NAVIGATION",
+ InputMethodDebug.softInputModeToString(
+ LayoutParams.SOFT_INPUT_STATE_UNCHANGED
+ | LayoutParams.SOFT_INPUT_ADJUST_RESIZE
+ | LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION));
+ }
+
+ @Test
+ public void testStartInputFlagsToString() {
+ // TODO: add more tests
+ assertEquals("(none)", InputMethodDebug.startInputFlagsToString(0));
+ assertEquals("IS_TEXT_EDITOR",
+ InputMethodDebug.startInputFlagsToString(StartInputFlags.IS_TEXT_EDITOR));
+ assertEquals("VIEW_HAS_FOCUS|INITIAL_CONNECTION",
+ InputMethodDebug.startInputFlagsToString(
+ StartInputFlags.VIEW_HAS_FOCUS | StartInputFlags.INITIAL_CONNECTION));
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java
new file mode 100644
index 000000000000..489e164e0b12
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/ProcStatsUtilTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.os.FileUtils;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ProcStatsUtilTest {
+
+ private File mProcDirectory;
+
+ @Before
+ public void setUp() {
+ Context context = InstrumentationRegistry.getContext();
+ mProcDirectory = context.getDir("proc", Context.MODE_PRIVATE);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ FileUtils.deleteContents(mProcDirectory);
+ }
+
+ @Test
+ public void testReadNullSeparatedFile_empty() throws IOException {
+ assertEquals(
+ "",
+ runReadNullSeparatedFile(""));
+ }
+
+ @Test
+ public void testReadNullSeparatedFile_simple() throws IOException {
+ assertEquals(
+ "abc def ghi",
+ runReadNullSeparatedFile("abc\0def\0ghi"));
+ }
+
+ @Test
+ public void testReadNullSeparatedFile_trailingNulls() throws IOException {
+ assertEquals(
+ "abc",
+ runReadNullSeparatedFile("abc\0\0\0\0"));
+ }
+
+ @Test
+ public void testReadNullSeparatedFile_doubleNullEnds() throws IOException {
+ assertEquals(
+ "abc",
+ runReadNullSeparatedFile("abc\0\0def"));
+ }
+
+ @Test
+ public void testReadSingleLineProcFile_simple() throws IOException {
+ assertEquals(
+ "abc",
+ runReadSingleLineProcFile("abc"));
+ }
+
+ @Test
+ public void testReadSingleLineProcFile_empty() throws IOException {
+ assertEquals(
+ "",
+ runReadSingleLineProcFile(""));
+ }
+
+ @Test
+ public void testReadSingleLineProcFile_newLine() throws IOException {
+ assertEquals(
+ "abc",
+ runReadSingleLineProcFile("abc\ndef"));
+ }
+
+ @Test
+ public void testReadSingleLineProcFile_doubleNewLine() throws IOException {
+ assertEquals(
+ "abc",
+ runReadSingleLineProcFile("abc\n\ndef"));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_simple() throws IOException {
+ assertEquals(
+ "abc",
+ runReadTerminatedProcFile("abc\0", (byte) '\0'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_withExtra() throws IOException {
+ assertEquals(
+ "123",
+ runReadTerminatedProcFile("123\0extra", (byte) '\0'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_noTerminator() throws IOException {
+ assertEquals(
+ "noterm",
+ runReadTerminatedProcFile("noterm", (byte) '\0'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_newLineTerm() throws IOException {
+ assertEquals(
+ "123",
+ runReadTerminatedProcFile("123\n456", (byte) '\n'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_normalCharTerm() throws IOException {
+ assertEquals(
+ "abc",
+ runReadTerminatedProcFile("abcdef", (byte) 'd'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_largeUnterminated() throws IOException {
+ String longString = new String(new char[10000]).replace('\0', 'a');
+ assertEquals(
+ longString,
+ runReadTerminatedProcFile(longString, (byte) '\0'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_largeTerminated() throws IOException {
+ String longString = new String(new char[10000]).replace('\0', 'a');
+ assertEquals(
+ longString,
+ runReadTerminatedProcFile(longString + "\0", (byte) '\0'));
+ }
+
+ @Test
+ public void testReadTerminatedProcFile_largeExtra() throws IOException {
+ String longString = new String(new char[10000]).replace('\0', 'a');
+ assertEquals(
+ longString,
+ runReadTerminatedProcFile(longString + "\0abc", (byte) '\0'));
+ }
+
+ private String runReadNullSeparatedFile(String fileContents) throws IOException {
+ File tempFile = File.createTempFile("null-separated-file", null, mProcDirectory);
+ Files.write(tempFile.toPath(), fileContents.getBytes());
+ String result = ProcStatsUtil.readNullSeparatedFile(tempFile.toString());
+ Files.delete(tempFile.toPath());
+ return result;
+ }
+
+ private String runReadSingleLineProcFile(String fileContents) throws IOException {
+ File tempFile = File.createTempFile("single-line-proc-file", null, mProcDirectory);
+ Files.write(tempFile.toPath(), fileContents.getBytes());
+ String result = ProcStatsUtil.readSingleLineProcFile(tempFile.toString());
+ Files.delete(tempFile.toPath());
+ return result;
+ }
+
+ private String runReadTerminatedProcFile(
+ String fileContents, byte terminator) throws IOException {
+ File tempFile = File.createTempFile("terminated-proc-file", null, mProcDirectory);
+ Files.write(tempFile.toPath(), fileContents.getBytes());
+ String result = ProcStatsUtil.readTerminatedProcFile(tempFile.toString(), terminator);
+ Files.delete(tempFile.toPath());
+ return result;
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java
new file mode 100644
index 000000000000..f2a531fb938a
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/ProcTimeInStateReaderTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+import android.os.FileUtils;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ProcTimeInStateReaderTest {
+
+ private File mProcDirectory;
+
+ @Before
+ public void setUp() {
+ Context context = InstrumentationRegistry.getContext();
+ mProcDirectory = context.getDir("proc", Context.MODE_PRIVATE);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ FileUtils.deleteContents(mProcDirectory);
+ }
+
+ @Test
+ public void testSimple() throws IOException {
+ Path initialTimeInStateFile = mProcDirectory.toPath().resolve("initial-time-in-state");
+ Files.write(initialTimeInStateFile, "1 2\n3 4\n5 6\n7 8\n".getBytes());
+ ProcTimeInStateReader reader = new ProcTimeInStateReader(initialTimeInStateFile);
+
+ assertArrayEquals(
+ "Reported frequencies are correct",
+ new long[]{1, 3, 5, 7},
+ reader.getFrequenciesKhz());
+ assertArrayEquals(
+ "Reported usage times are correct",
+ new long[]{20, 40, 60, 80},
+ reader.getUsageTimesMillis(initialTimeInStateFile));
+ }
+
+ @Test
+ public void testDifferentFile() throws IOException {
+ Path initialTimeInStateFile = mProcDirectory.toPath().resolve("initial-time-in-state");
+ Files.write(initialTimeInStateFile, "1 2\n3 4\n5 6\n7 8\n".getBytes());
+ ProcTimeInStateReader reader = new ProcTimeInStateReader(initialTimeInStateFile);
+
+ Path timeInStateFile = mProcDirectory.toPath().resolve("time-in-state");
+ Files.write(timeInStateFile, "1 20\n3 40\n5 60\n7 80\n".getBytes());
+ assertArrayEquals(
+ "Reported usage times are correct",
+ new long[]{200, 400, 600, 800},
+ reader.getUsageTimesMillis(timeInStateFile));
+ }
+
+ @Test
+ public void testWrongLength() throws IOException {
+ Path initialTimeInStateFile = mProcDirectory.toPath().resolve("initial-time-in-state");
+ Files.write(initialTimeInStateFile, "1 2\n3 4\n5 6\n7 8\n".getBytes());
+ ProcTimeInStateReader reader = new ProcTimeInStateReader(initialTimeInStateFile);
+
+ Path timeInStateFile = mProcDirectory.toPath().resolve("time-in-state");
+ Files.write(timeInStateFile, "1 2\n3 4\n5 6\n".getBytes());
+ assertNull(reader.getUsageTimesMillis(timeInStateFile));
+ }
+
+ @Test
+ public void testEmptyInitialFails() throws IOException {
+ Path initialTimeInStateFile = mProcDirectory.toPath().resolve("initial-time-in-state");
+ Files.write(initialTimeInStateFile, "".getBytes());
+ try {
+ new ProcTimeInStateReader(initialTimeInStateFile);
+ fail("Instantiation didn't fail with empty initial time_in_state file");
+ } catch (IOException ignored) {
+ }
+ }
+}
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 73c10d238a60..68f24fb7b661 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -178,6 +178,28 @@
<assign-permission name="android.permission.STATSCOMPANION" uid="statsd" />
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="statsd" />
+ <split-permission name="android.permission.WRITE_EXTERNAL_STORAGE">
+ <new-permission name="android.permission.READ_EXTERNAL_STORAGE" />
+ </split-permission>
+ <split-permission name="android.permission.READ_CONTACTS"
+ targetSdk="16">
+ <new-permission name="android.permission.READ_CALL_LOG" />
+ </split-permission>
+ <split-permission name="android.permission.WRITE_CONTACTS"
+ targetSdk="16">
+ <new-permission name="android.permission.WRITE_CALL_LOG" />
+ </split-permission>
+ <!-- STOPSHIP(b/118882117): change targetSdk to Q when SDK version finalised -->
+ <split-permission name="android.permission.ACCESS_FINE_LOCATION"
+ targetSdk="10000">
+ <new-permission name="android.permission.ACCESS_BACKGROUND_LOCATION" />
+ </split-permission>
+ <!-- STOPSHIP(b/118882117): change targetSdk to Q when SDK version finalised -->
+ <split-permission name="android.permission.ACCESS_COARSE_LOCATION"
+ targetSdk="10000">
+ <new-permission name="android.permission.ACCESS_BACKGROUND_LOCATION" />
+ </split-permission>
+
<!-- This is a list of all the libraries available for application
code to link against. -->
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 28e92dbe264a..2604365ab8dc 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -256,6 +256,7 @@ applications that come with the platform
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.FORCE_STOP_PACKAGES"/>
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
+ <permission name="android.permission.MANAGE_DEBUGGING"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
<permission name="android.permission.MANAGE_FINGERPRINT"/>
<permission name="android.permission.MANAGE_USB"/>
@@ -313,6 +314,7 @@ applications that come with the platform
<permission name="android.permission.INSTALL_PACKAGES"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
+ <permission name="android.permission.MANAGE_ACCESSIBILITY"/>
<permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
<permission name="android.permission.MANAGE_DEVICE_ADMINS"/>
<permission name="android.permission.MANAGE_USB"/>
@@ -375,6 +377,7 @@ applications that come with the platform
<permission name="android.permission.GET_APP_OPS_STATS"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
+ <permission name="android.permission.MANAGE_DEBUGGING"/>
<permission name="android.permission.MANAGE_USB"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MASTER_CLEAR"/>
diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java
index 3efe655b2565..6f786517ba12 100644
--- a/graphics/java/android/graphics/text/MeasuredText.java
+++ b/graphics/java/android/graphics/text/MeasuredText.java
@@ -48,9 +48,6 @@ import libcore.util.NativeAllocationRegistry;
* </p>
*/
public class MeasuredText {
- private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
- MeasuredText.class.getClassLoader(), nGetReleaseFunc(), 1024);
-
private long mNativePtr;
private @NonNull char[] mChars;
@@ -166,6 +163,9 @@ public class MeasuredText {
* Note: The appendStyle and appendReplacementRun should be called to cover the text length.
*/
public static class Builder {
+ private static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ MeasuredText.class.getClassLoader(), nGetReleaseFunc(), 1024);
+
private long mNativePtr;
private final @NonNull char[] mText;
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 2e5aef5347d5..9c707bab95f1 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -732,14 +732,10 @@ void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& p
float y, float boundsLeft, float boundsTop, float boundsRight,
float boundsBottom, float totalAdvance) {
if (count <= 0 || paint.nothingToDraw()) return;
- // Set align to left for drawing, as we don't want individual
- // glyphs centered or right-aligned; the offset above takes
- // care of all alignment.
SkPaint paintCopy(paint);
if (mPaintFilter) {
mPaintFilter->filter(&paintCopy);
}
- paintCopy.setTextAlign(SkPaint::kLeft_Align);
SkASSERT(paintCopy.getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
// Stroke with a hairline is drawn on HW with a fill style for compatibility with Android O and
// older.
@@ -763,14 +759,10 @@ void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& p
void SkiaCanvas::drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
const SkPaint& paint, const SkPath& path, size_t start,
size_t end) {
- // Set align to left for drawing, as we don't want individual
- // glyphs centered or right-aligned; the offsets take care of
- // that portion of the alignment.
SkPaint paintCopy(paint);
if (mPaintFilter) {
mPaintFilter->filter(&paintCopy);
}
- paintCopy.setTextAlign(SkPaint::kLeft_Align);
SkASSERT(paintCopy.getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
const int N = end - start;
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index 31d3c0d00b36..c1a3b6d1143b 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -86,6 +86,14 @@ public:
const Typeface* getAndroidTypeface() const { return mTypeface; }
+ enum Align {
+ kLeft_Align,
+ kCenter_Align,
+ kRight_Align,
+ };
+ Align getTextAlign() const { return mAlign; }
+ void setTextAlign(Align align) { mAlign = align; }
+
private:
float mLetterSpacing = 0;
float mWordSpacing = 0;
@@ -98,6 +106,7 @@ private:
// object. Thus, following pointer can never be a dangling pointer. Note that
// nullptr is valid: it means the default typeface.
const Typeface* mTypeface = nullptr;
+ Align mAlign = kLeft_Align;
};
} // namespace android
diff --git a/libs/hwui/hwui/PaintImpl.cpp b/libs/hwui/hwui/PaintImpl.cpp
index 29cc890682f0..bdbf5cacaaf0 100644
--- a/libs/hwui/hwui/PaintImpl.cpp
+++ b/libs/hwui/hwui/PaintImpl.cpp
@@ -34,7 +34,8 @@ Paint::Paint(const Paint& paint)
, mMinikinLocaleListId(paint.mMinikinLocaleListId)
, mFamilyVariant(paint.mFamilyVariant)
, mHyphenEdit(paint.mHyphenEdit)
- , mTypeface(paint.mTypeface) {}
+ , mTypeface(paint.mTypeface)
+ , mAlign(paint.mAlign) {}
Paint::Paint(const SkPaint& paint)
: SkPaint(paint)
@@ -55,6 +56,7 @@ Paint& Paint::operator=(const Paint& other) {
mFamilyVariant = other.mFamilyVariant;
mHyphenEdit = other.mHyphenEdit;
mTypeface = other.mTypeface;
+ mAlign = other.mAlign;
return *this;
}
@@ -64,6 +66,6 @@ bool operator==(const Paint& a, const Paint& b) {
a.mFontFeatureSettings == b.mFontFeatureSettings &&
a.mMinikinLocaleListId == b.mMinikinLocaleListId &&
a.mFamilyVariant == b.mFamilyVariant && a.mHyphenEdit == b.mHyphenEdit &&
- a.mTypeface == b.mTypeface;
+ a.mTypeface == b.mTypeface && a.mAlign == b.mAlign;
}
} // namespace android
diff --git a/libs/hwui/tests/common/scenes/ListViewAnimation.cpp b/libs/hwui/tests/common/scenes/ListViewAnimation.cpp
index fd8c252ff318..9a1ee54bff49 100644
--- a/libs/hwui/tests/common/scenes/ListViewAnimation.cpp
+++ b/libs/hwui/tests/common/scenes/ListViewAnimation.cpp
@@ -46,7 +46,6 @@ class ListViewAnimation : public TestListViewSceneBase {
SkColorGetR(randomColor) + SkColorGetG(randomColor) + SkColorGetB(randomColor) <
128 * 3;
paint.setColor(bgDark ? Color::White : Color::Grey_700);
- paint.setTextAlign(SkPaint::kCenter_Align);
paint.setTextSize(size / 2);
char charToShow = 'A' + (rand() % 26);
const SkPoint pos[] = {{SkIntToScalar(size / 2),
diff --git a/libs/hwui/tests/macrobench/TestSceneRunner.cpp b/libs/hwui/tests/macrobench/TestSceneRunner.cpp
index 9428f532434a..5f5a92e55bf2 100644
--- a/libs/hwui/tests/macrobench/TestSceneRunner.cpp
+++ b/libs/hwui/tests/macrobench/TestSceneRunner.cpp
@@ -81,11 +81,11 @@ void outputBenchmarkReport(const TestScene::Info& info, const TestScene::Options
// mean and stddev which doesn't make sense for our usage
std::vector<BenchmarkReporter::Run> reports;
BenchmarkReporter::Run report;
- report.benchmark_name = info.name;
+ report.run_name = info.name;
report.iterations = static_cast<int64_t>(opts.count);
report.real_accumulated_time = durationInS;
report.cpu_accumulated_time = durationInS;
- report.items_per_second = opts.count / durationInS;
+ report.counters["items_per_second"] = opts.count / durationInS;
reports.push_back(report);
reporter->ReportRuns(reports);
@@ -94,13 +94,13 @@ void outputBenchmarkReport(const TestScene::Info& info, const TestScene::Options
// in that test case than percentiles.
if (!opts.renderOffscreen) {
for (auto& ri : REPORTS) {
- reports[0].benchmark_name = info.name;
- reports[0].benchmark_name += ri.suffix;
+ reports[0].run_name = info.name;
+ reports[0].run_name += ri.suffix;
durationInS = proxy->frameTimePercentile(ri.percentile) / 1000.0;
reports[0].real_accumulated_time = durationInS;
reports[0].cpu_accumulated_time = durationInS;
reports[0].iterations = 1;
- reports[0].items_per_second = 0;
+ reports[0].counters["items_per_second"] = 0;
reporter->ReportRuns(reports);
}
}
diff --git a/libs/incident/Android.bp b/libs/incident/Android.bp
new file mode 100644
index 000000000000..0619a9c100dd
--- /dev/null
+++ b/libs/incident/Android.bp
@@ -0,0 +1,50 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+cc_library_shared {
+ name: "libincident",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-missing-field-initializers",
+ "-Wno-unused-variable",
+ "-Wunused-parameter",
+ ],
+
+ shared_libs: [
+ "libbinder",
+ "liblog",
+ "libutils",
+ ],
+
+ aidl: {
+ include_dirs: ["frameworks/base/core/java"],
+ export_aidl_headers: true,
+ },
+
+ srcs: [
+ ":libincident_aidl",
+ "proto/android/os/header.proto",
+ "proto/android/os/metadata.proto",
+ "src/IncidentReportArgs.cpp",
+ ],
+
+ proto: {
+ type: "lite",
+ export_proto_headers: true,
+ },
+
+ export_include_dirs: ["include"],
+}
diff --git a/libs/incident/Android.mk b/libs/incident/Android.mk
deleted file mode 100644
index 08c834699f40..000000000000
--- a/libs/incident/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libincident
-
-LOCAL_CFLAGS := \
- -Wall -Werror -Wno-missing-field-initializers -Wno-unused-variable -Wunused-parameter
-
-LOCAL_SHARED_LIBRARIES := \
- libbinder \
- liblog \
- libutils
-
-LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/../../core/java
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/include
-
-LOCAL_SRC_FILES := \
- ../../core/java/android/os/IIncidentManager.aidl \
- ../../core/java/android/os/IIncidentReportStatusListener.aidl \
- proto/android/os/header.proto \
- proto/android/os/metadata.proto \
- src/IncidentReportArgs.cpp
-
-LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
-LOCAL_PROTO_OPTIMIZE_TYPE := lite
-
-include $(BUILD_SHARED_LIBRARY)
-
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index a02b6af59d5e..b34f2700f520 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -311,6 +311,8 @@ public final class AudioFormat implements Parcelable {
return "ENCODING_AAC_XHE";
case ENCODING_AC4:
return "ENCODING_AC4";
+ case ENCODING_E_AC3_JOC:
+ return "ENCODING_E_AC3_JOC";
default :
return "invalid encoding " + enc;
}
@@ -518,12 +520,11 @@ public final class AudioFormat implements Parcelable {
public static boolean isValidEncoding(int audioFormat)
{
switch (audioFormat) {
- case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
+ case ENCODING_PCM_8BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_AC3:
case ENCODING_E_AC3:
- case ENCODING_E_AC3_JOC:
case ENCODING_DTS:
case ENCODING_DTS_HD:
case ENCODING_MP3:
@@ -531,9 +532,11 @@ public final class AudioFormat implements Parcelable {
case ENCODING_AAC_HE_V1:
case ENCODING_AAC_HE_V2:
case ENCODING_IEC61937:
+ case ENCODING_DOLBY_TRUEHD:
case ENCODING_AAC_ELD:
case ENCODING_AAC_XHE:
case ENCODING_AC4:
+ case ENCODING_E_AC3_JOC:
return true;
default:
return false;
@@ -544,22 +547,23 @@ public final class AudioFormat implements Parcelable {
public static boolean isPublicEncoding(int audioFormat)
{
switch (audioFormat) {
- case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
+ case ENCODING_PCM_8BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_AC3:
case ENCODING_E_AC3:
- case ENCODING_E_AC3_JOC:
case ENCODING_DTS:
case ENCODING_DTS_HD:
- case ENCODING_IEC61937:
case ENCODING_MP3:
case ENCODING_AAC_LC:
case ENCODING_AAC_HE_V1:
case ENCODING_AAC_HE_V2:
+ case ENCODING_IEC61937:
+ case ENCODING_DOLBY_TRUEHD:
case ENCODING_AAC_ELD:
case ENCODING_AAC_XHE:
case ENCODING_AC4:
+ case ENCODING_E_AC3_JOC:
return true;
default:
return false;
@@ -571,14 +575,13 @@ public final class AudioFormat implements Parcelable {
public static boolean isEncodingLinearPcm(int audioFormat)
{
switch (audioFormat) {
- case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
+ case ENCODING_PCM_8BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_DEFAULT:
return true;
case ENCODING_AC3:
case ENCODING_E_AC3:
- case ENCODING_E_AC3_JOC:
case ENCODING_DTS:
case ENCODING_DTS_HD:
case ENCODING_MP3:
@@ -586,9 +589,11 @@ public final class AudioFormat implements Parcelable {
case ENCODING_AAC_HE_V1:
case ENCODING_AAC_HE_V2:
case ENCODING_IEC61937: // wrapped in PCM but compressed
+ case ENCODING_DOLBY_TRUEHD:
case ENCODING_AAC_ELD:
case ENCODING_AAC_XHE:
case ENCODING_AC4:
+ case ENCODING_E_AC3_JOC:
return false;
case ENCODING_INVALID:
default:
@@ -600,24 +605,25 @@ public final class AudioFormat implements Parcelable {
public static boolean isEncodingLinearFrames(int audioFormat)
{
switch (audioFormat) {
- case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
+ case ENCODING_PCM_8BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_IEC61937: // same size as stereo PCM
case ENCODING_DEFAULT:
return true;
case ENCODING_AC3:
case ENCODING_E_AC3:
- case ENCODING_E_AC3_JOC:
case ENCODING_DTS:
case ENCODING_DTS_HD:
case ENCODING_MP3:
case ENCODING_AAC_LC:
case ENCODING_AAC_HE_V1:
case ENCODING_AAC_HE_V2:
+ case ENCODING_DOLBY_TRUEHD:
case ENCODING_AAC_ELD:
case ENCODING_AAC_XHE:
case ENCODING_AC4:
+ case ENCODING_E_AC3_JOC:
return false;
case ENCODING_INVALID:
default:
@@ -844,22 +850,23 @@ public final class AudioFormat implements Parcelable {
case ENCODING_DEFAULT:
mEncoding = ENCODING_PCM_16BIT;
break;
- case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
+ case ENCODING_PCM_8BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_AC3:
case ENCODING_E_AC3:
- case ENCODING_E_AC3_JOC:
case ENCODING_DTS:
case ENCODING_DTS_HD:
- case ENCODING_IEC61937:
case ENCODING_MP3:
case ENCODING_AAC_LC:
case ENCODING_AAC_HE_V1:
case ENCODING_AAC_HE_V2:
+ case ENCODING_IEC61937:
+ case ENCODING_DOLBY_TRUEHD:
case ENCODING_AAC_ELD:
case ENCODING_AAC_XHE:
case ENCODING_AC4:
+ case ENCODING_E_AC3_JOC:
mEncoding = encoding;
break;
case ENCODING_INVALID:
@@ -1060,22 +1067,23 @@ public final class AudioFormat implements Parcelable {
/** @hide */
@IntDef(flag = false, prefix = "ENCODING", value = {
ENCODING_DEFAULT,
- ENCODING_PCM_8BIT,
ENCODING_PCM_16BIT,
+ ENCODING_PCM_8BIT,
ENCODING_PCM_FLOAT,
ENCODING_AC3,
ENCODING_E_AC3,
- ENCODING_E_AC3_JOC,
ENCODING_DTS,
ENCODING_DTS_HD,
ENCODING_MP3,
- ENCODING_IEC61937,
+ ENCODING_AAC_LC,
ENCODING_AAC_HE_V1,
ENCODING_AAC_HE_V2,
- ENCODING_AAC_LC,
+ ENCODING_IEC61937,
+ ENCODING_DOLBY_TRUEHD,
ENCODING_AAC_ELD,
ENCODING_AAC_XHE,
- ENCODING_AC4 }
+ ENCODING_AC4,
+ ENCODING_E_AC3_JOC }
)
@Retention(RetentionPolicy.SOURCE)
public @interface Encoding {}
@@ -1088,8 +1096,8 @@ public final class AudioFormat implements Parcelable {
ENCODING_DTS_HD,
ENCODING_AAC_LC,
ENCODING_DOLBY_TRUEHD,
- ENCODING_E_AC3_JOC,
ENCODING_AC4,
+ ENCODING_E_AC3_JOC,
};
/** @hide */
@@ -1100,8 +1108,8 @@ public final class AudioFormat implements Parcelable {
ENCODING_DTS_HD,
ENCODING_AAC_LC,
ENCODING_DOLBY_TRUEHD,
- ENCODING_E_AC3_JOC,
- ENCODING_AC4 }
+ ENCODING_AC4,
+ ENCODING_E_AC3_JOC }
)
@Retention(RetentionPolicy.SOURCE)
public @interface SurroundSoundEncoding {}
@@ -1129,10 +1137,10 @@ public final class AudioFormat implements Parcelable {
return "AAC";
case ENCODING_DOLBY_TRUEHD:
return "Dolby TrueHD";
- case ENCODING_E_AC3_JOC:
- return "Dolby Atmos in Dolby Digital Plus";
case ENCODING_AC4:
return "Dolby AC-4";
+ case ENCODING_E_AC3_JOC:
+ return "Dolby Atmos in Dolby Digital Plus";
default:
return "Unknown surround sound format";
}
diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java
index ce71436b9bb3..1cc650bf2702 100644
--- a/media/java/android/media/AudioPresentation.java
+++ b/media/java/android/media/AudioPresentation.java
@@ -19,13 +19,14 @@ package android.media;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
+import android.icu.util.ULocale;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
/**
@@ -34,7 +35,7 @@ import java.util.Map;
*
* Used by {@link MediaExtractor} {@link MediaExtractor#getAudioPresentations(int)} and
* {@link AudioTrack} {@link AudioTrack#setPresentation(AudioPresentation)} to query available
- * presentations and to select one.
+ * presentations and to select one, respectively.
*
* A list of available audio presentations in a media source can be queried using
* {@link MediaExtractor#getAudioPresentations(int)}. This list can be presented to a user for
@@ -49,8 +50,7 @@ import java.util.Map;
public final class AudioPresentation {
private final int mPresentationId;
private final int mProgramId;
- private final Map<String, String> mLabels;
- private final String mLanguage;
+ private final ULocale mLanguage;
/** @hide */
@IntDef(
@@ -63,72 +63,98 @@ public final class AudioPresentation {
})
@Retention(RetentionPolicy.SOURCE)
public @interface MasteringIndicationType {}
-
private final @MasteringIndicationType int mMasteringIndication;
private final boolean mAudioDescriptionAvailable;
private final boolean mSpokenSubtitlesAvailable;
private final boolean mDialogueEnhancementAvailable;
+ private final Map<ULocale, String> mLabels;
/**
* No preferred reproduction channel layout.
+ *
+ * @see Builder#setMasteringIndication(int)
*/
public static final int MASTERING_NOT_INDICATED = 0;
/**
* Stereo speaker layout.
+ *
+ * @see Builder#setMasteringIndication(int)
*/
public static final int MASTERED_FOR_STEREO = 1;
/**
* Two-dimensional (e.g. 5.1) speaker layout.
+ *
+ * @see Builder#setMasteringIndication(int)
*/
public static final int MASTERED_FOR_SURROUND = 2;
/**
* Three-dimensional (e.g. 5.1.2) speaker layout.
+ *
+ * @see Builder#setMasteringIndication(int)
*/
public static final int MASTERED_FOR_3D = 3;
/**
* Prerendered for headphone playback.
+ *
+ * @see Builder#setMasteringIndication(int)
*/
public static final int MASTERED_FOR_HEADPHONE = 4;
/**
- * @hide
- */
- @TestApi
- public AudioPresentation(int presentationId,
- int programId,
- @NonNull Map<String, String> labels,
- @NonNull String language,
- @MasteringIndicationType int masteringIndication,
- boolean audioDescriptionAvailable,
- boolean spokenSubtitlesAvailable,
- boolean dialogueEnhancementAvailable) {
- this.mPresentationId = presentationId;
- this.mProgramId = programId;
- this.mLanguage = language;
- this.mMasteringIndication = masteringIndication;
- this.mAudioDescriptionAvailable = audioDescriptionAvailable;
- this.mSpokenSubtitlesAvailable = spokenSubtitlesAvailable;
- this.mDialogueEnhancementAvailable = dialogueEnhancementAvailable;
-
- this.mLabels = new HashMap<String, String>(labels);
+ * This ID is reserved. No items can be explicitly assigned this ID.
+ */
+ private static final int UNKNOWN_ID = -1;
+
+ /**
+ * This allows an application developer to construct an AudioPresentation object with all the
+ * parameters.
+ * The IDs are all that is required for an
+ * {@link AudioTrack#setPresentation(AudioPresentation)} to be successful.
+ * The rest of the metadata is informative only so as to distinguish features
+ * of different presentations.
+ * @param presentationId Presentation ID to be decoded by a next generation audio decoder.
+ * @param programId Program ID to be decoded by a next generation audio decoder.
+ * @param language Locale corresponding to ISO 639-1/639-2 language code.
+ * @param masteringIndication One of {@link AudioPresentation#MASTERING_NOT_INDICATED},
+ * {@link AudioPresentation#MASTERED_FOR_STEREO},
+ * {@link AudioPresentation#MASTERED_FOR_SURROUND},
+ * {@link AudioPresentation#MASTERED_FOR_3D},
+ * {@link AudioPresentation#MASTERED_FOR_HEADPHONE}.
+ * @param audioDescriptionAvailable Audio description for the visually impaired.
+ * @param spokenSubtitlesAvailable Spoken subtitles for the visually impaired.
+ * @param dialogueEnhancementAvailable Dialogue enhancement.
+ * @param labels Text label indexed by its locale corresponding to the language code.
+ */
+ private AudioPresentation(int presentationId,
+ int programId,
+ @NonNull ULocale language,
+ @MasteringIndicationType int masteringIndication,
+ boolean audioDescriptionAvailable,
+ boolean spokenSubtitlesAvailable,
+ boolean dialogueEnhancementAvailable,
+ @NonNull Map<ULocale, String> labels) {
+ mPresentationId = presentationId;
+ mProgramId = programId;
+ mLanguage = language;
+ mMasteringIndication = masteringIndication;
+ mAudioDescriptionAvailable = audioDescriptionAvailable;
+ mSpokenSubtitlesAvailable = spokenSubtitlesAvailable;
+ mDialogueEnhancementAvailable = dialogueEnhancementAvailable;
+ mLabels = new HashMap<ULocale, String>(labels);
}
/**
- * The framework uses this presentation id to select an audio presentation rendered by a
- * decoder. Presentation id is typically sequential, but does not have to be.
- * @hide
+ * Returns presentation ID used by the framework to select an audio presentation rendered by a
+ * decoder. Presentation ID is typically sequential, but does not have to be.
*/
- @TestApi
public int getPresentationId() {
return mPresentationId;
}
/**
- * The framework uses this program id to select an audio presentation rendered by a decoder.
- * Program id can be used to further uniquely identify the presentation to a decoder.
- * @hide
+ * Returns program ID used by the framework to select an audio presentation rendered by a
+ * decoder. Program ID can be used to further uniquely identify the presentation to a decoder.
*/
- @TestApi
public int getProgramId() {
return mProgramId;
}
@@ -139,9 +165,9 @@ public final class AudioPresentation {
* or ISO 639-2/T could be used.
*/
public Map<Locale, String> getLabels() {
- Map<Locale, String> localeLabels = new HashMap<>();
- for (Map.Entry<String, String> entry : mLabels.entrySet()) {
- localeLabels.put(new Locale(entry.getKey()), entry.getValue());
+ Map<Locale, String> localeLabels = new HashMap<Locale, String>();
+ for (Map.Entry<ULocale, String> entry : mLabels.entrySet()) {
+ localeLabels.put(entry.getKey().toLocale(), entry.getValue());
}
return localeLabels;
}
@@ -150,13 +176,20 @@ public final class AudioPresentation {
* @return the locale corresponding to audio presentation's ISO 639-1/639-2 language code.
*/
public Locale getLocale() {
- return new Locale(mLanguage);
+ return mLanguage.toLocale();
+ }
+
+ private ULocale getULocale() {
+ return mLanguage;
}
/**
* @return the mastering indication of the audio presentation.
- * See {@link #MASTERING_NOT_INDICATED}, {@link #MASTERED_FOR_STEREO},
- * {@link #MASTERED_FOR_SURROUND}, {@link #MASTERED_FOR_3D}, {@link #MASTERED_FOR_HEADPHONE}
+ * See {@link AudioPresentation#MASTERING_NOT_INDICATED},
+ * {@link AudioPresentation#MASTERED_FOR_STEREO},
+ * {@link AudioPresentation#MASTERED_FOR_SURROUND},
+ * {@link AudioPresentation#MASTERED_FOR_3D},
+ * {@link AudioPresentation#MASTERED_FOR_HEADPHONE}
*/
@MasteringIndicationType
public int getMasteringIndication() {
@@ -186,4 +219,147 @@ public final class AudioPresentation {
public boolean hasDialogueEnhancement() {
return mDialogueEnhancementAvailable;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof AudioPresentation)) {
+ return false;
+ }
+ AudioPresentation obj = (AudioPresentation) o;
+ return mPresentationId == obj.getPresentationId()
+ && mProgramId == obj.getProgramId()
+ && mLanguage == obj.getULocale()
+ && mMasteringIndication == obj.getMasteringIndication()
+ && mAudioDescriptionAvailable == obj.hasAudioDescription()
+ && mSpokenSubtitlesAvailable == obj.hasSpokenSubtitles()
+ && mDialogueEnhancementAvailable == obj.hasDialogueEnhancement()
+ && mLabels.equals(obj.getLabels());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(mPresentationId);
+ }
+
+ /**
+ * A builder class for creating {@link AudioPresentation} objects.
+ */
+ public static class Builder {
+ private final int mPresentationId;
+ private int mProgramId = UNKNOWN_ID;
+ private ULocale mLanguage = new ULocale("");
+ private int mMasteringIndication = MASTERING_NOT_INDICATED;
+ private boolean mAudioDescriptionAvailable = false;
+ private boolean mSpokenSubtitlesAvailable = false;
+ private boolean mDialogueEnhancementAvailable = false;
+ private Map<ULocale, String> mLabels = new HashMap<ULocale, String>();
+
+ /**
+ * Create a {@link Builder}. Any field that should be included in the
+ * {@link AudioPresentation} must be added.
+ *
+ * @param presentationId the presentation ID of this audio presentation
+ */
+ public Builder(int presentationId) {
+ mPresentationId = presentationId;
+ }
+ /**
+ * Sets the ProgramId to which this audio presentation refers.
+ *
+ * @param programId
+ */
+ public @NonNull Builder setProgramId(int programId) {
+ mProgramId = programId;
+ return this;
+ }
+ /**
+ * Sets the language information of the audio presentation.
+ *
+ * @param language code
+ */
+ public @NonNull Builder setLocale(ULocale language) {
+ mLanguage = language;
+ return this;
+ }
+
+ /**
+ * Sets the mastering indication.
+ *
+ * @param masteringIndication Input to set mastering indication.
+ * @throws IllegalArgumentException if the mastering indication is not any of
+ * {@link AudioPresentation#MASTERING_NOT_INDICATED},
+ * {@link AudioPresentation#MASTERED_FOR_STEREO},
+ * {@link AudioPresentation#MASTERED_FOR_SURROUND},
+ * {@link AudioPresentation#MASTERED_FOR_3D},
+ * and {@link AudioPresentation#MASTERED_FOR_HEADPHONE}
+ */
+ public @NonNull Builder setMasteringIndication(
+ @MasteringIndicationType int masteringIndication) {
+ if (masteringIndication != MASTERING_NOT_INDICATED
+ && masteringIndication != MASTERED_FOR_STEREO
+ && masteringIndication != MASTERED_FOR_SURROUND
+ && masteringIndication != MASTERED_FOR_3D
+ && masteringIndication != MASTERED_FOR_HEADPHONE) {
+ throw new IllegalArgumentException("Unknown mastering indication: "
+ + masteringIndication);
+ }
+ mMasteringIndication = masteringIndication;
+ return this;
+ }
+
+ /**
+ * Sets locale / text label pairs describing the presentation.
+ *
+ * @param labels
+ */
+ public @NonNull Builder setLabels(@NonNull Map<ULocale, String> labels) {
+ mLabels = new HashMap<ULocale, String>(labels);
+ return this;
+ }
+
+ /**
+ * Indicate whether the presentation contains audio description for the visually impaired.
+ *
+ * @param audioDescriptionAvailable
+ */
+ public @NonNull Builder setHasAudioDescription(boolean audioDescriptionAvailable) {
+ mAudioDescriptionAvailable = audioDescriptionAvailable;
+ return this;
+ }
+
+ /**
+ * Indicate whether the presentation contains spoken subtitles for the visually impaired.
+ *
+ * @param spokenSubtitlesAvailable
+ */
+ public @NonNull Builder setHasSpokenSubtitles(boolean spokenSubtitlesAvailable) {
+ mSpokenSubtitlesAvailable = spokenSubtitlesAvailable;
+ return this;
+ }
+
+ /**
+ * Indicate whether the presentation supports dialogue enhancement.
+ *
+ * @param dialogueEnhancementAvailable
+ */
+ public @NonNull Builder setHasDialogueEnhancement(boolean dialogueEnhancementAvailable) {
+ mDialogueEnhancementAvailable = dialogueEnhancementAvailable;
+ return this;
+ }
+
+ /**
+ * Creates a {@link AudioPresentation} instance with the specified fields.
+ *
+ * @return The new {@link AudioPresentation} instance
+ */
+ public @NonNull AudioPresentation build() {
+ return new AudioPresentation(mPresentationId, mProgramId,
+ mLanguage, mMasteringIndication,
+ mAudioDescriptionAvailable, mSpokenSubtitlesAvailable,
+ mDialogueEnhancementAvailable, mLabels);
+ }
+ }
}
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index 54b5ab19b018..b51caa5adb3b 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -345,9 +345,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* playback will start at the beginning. If the source had not been
* prepared, the player will prepare the source and play.
*
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void play();
+ public abstract Object play();
/**
* Prepares the player for playback, asynchronously.
@@ -355,31 +356,35 @@ public abstract class MediaPlayer2 implements AutoCloseable
* After setting the datasource and the display surface, you need to
* call prepare().
*
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void prepare();
+ public abstract Object prepare();
/**
* Pauses playback. Call play() to resume.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void pause();
+ public abstract Object pause();
/**
* Tries to play next data source if applicable.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void skipToNext();
+ public abstract Object skipToNext();
/**
* Moves the media to specified time position.
* Same as {@link #seekTo(long, int)} with {@code mode = SEEK_PREVIOUS_SYNC}.
*
* @param msec the offset in milliseconds from the start to seek to
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public void seekTo(long msec) {
- seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */);
+ public Object seekTo(long msec) {
+ return seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */);
}
/**
@@ -467,9 +472,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* You must call this method before {@link #prepare()} in order
* for the audio attributes to become effective thereafter.
* @param attributes a non-null set of audio attributes
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setAudioAttributes(@NonNull AudioAttributes attributes);
+ public abstract Object setAudioAttributes(@NonNull AudioAttributes attributes);
/**
* Gets the audio attributes for this MediaPlayer2.
@@ -481,32 +487,36 @@ public abstract class MediaPlayer2 implements AutoCloseable
* Sets the data source as described by a DataSourceDesc.
*
* @param dsd the descriptor of data source you want to play
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setDataSource(@NonNull DataSourceDesc dsd);
+ public abstract Object setDataSource(@NonNull DataSourceDesc dsd);
/**
* Sets a single data source as described by a DataSourceDesc which will be played
* after current data source is finished.
*
* @param dsd the descriptor of data source you want to play after current one
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setNextDataSource(@NonNull DataSourceDesc dsd);
+ public abstract Object setNextDataSource(@NonNull DataSourceDesc dsd);
/**
* Sets a list of data sources to be played sequentially after current data source is done.
*
* @param dsds the list of data sources you want to play after current one
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds);
+ public abstract Object setNextDataSources(@NonNull List<DataSourceDesc> dsds);
/**
* Removes all data sources pending to be played.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void clearNextDataSources();
+ public abstract Object clearNextDataSources();
/**
* Gets the current data source as described by a DataSourceDesc.
@@ -518,9 +528,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
/**
* Configures the player to loop on the current data source.
* @param loop true if the current data source is meant to loop.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void loopCurrent(boolean loop);
+ public abstract Object loopCurrent(boolean loop);
/**
* Sets the volume of the audio of the media to play, expressed as a linear multiplier
@@ -530,9 +541,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* A value of 0.0f indicates muting, a value of 1.0f is the nominal unattenuated and unamplified
* gain. See {@link #getMaxPlayerVolume()} for the volume range supported by this player.
* @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setPlayerVolume(float volume);
+ public abstract Object setPlayerVolume(float volume);
/**
* Returns the current volume of this player to this player.
@@ -573,9 +585,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
*
* @param label An application specific Object used to help to identify the completeness
* of a batch of commands.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public void notifyWhenCommandLabelReached(@NonNull Object label) { }
+ public abstract Object notifyWhenCommandLabelReached(@NonNull Object label);
/**
* Sets the {@link SurfaceHolder} to use for displaying the video
@@ -590,9 +603,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* @param sh the SurfaceHolder to use for video display
* @throws IllegalStateException if the internal player engine has not been
* initialized or has been released.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
* @hide
*/
- public abstract void setDisplay(SurfaceHolder sh);
+ public abstract Object setDisplay(SurfaceHolder sh);
/**
* Sets the {@link Surface} to be used as the sink for the video portion of
@@ -612,9 +626,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* the media.
* @throws IllegalStateException if the internal player engine has not been
* initialized or has been released.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setSurface(Surface surface);
+ public abstract Object setSurface(Surface surface);
/* Do not change these video scaling mode values below without updating
* their counterparts in system/window.h! Please do not forget to update
@@ -653,11 +668,21 @@ public abstract class MediaPlayer2 implements AutoCloseable
*
* @param mode target video scaling mode. Must be one of the supported
* video scaling modes; otherwise, IllegalArgumentException will be thrown.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*
* @see MediaPlayer2#VIDEO_SCALING_MODE_SCALE_TO_FIT
* @hide
*/
- public void setVideoScalingMode(int mode) { }
+ public abstract Object setVideoScalingMode(int mode);
+
+ /**
+ * Cancels a pending command.
+ *
+ * @param token the command to be canceled. This is the returned Object when command is issued.
+ * @return {@code false} if the task could not be cancelled; {@code true} otherwise.
+ */
+ // This is a synchronous call.
+ public abstract boolean cancelCommand(Object token);
/**
* Discards all pending commands.
@@ -820,14 +845,12 @@ public abstract class MediaPlayer2 implements AutoCloseable
* The input is a hint to MediaPlayer2.
*
* @param params the buffering management params.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*
- * @throws IllegalStateException if the internal player engine has not been
- * initialized or has been released, or {@code setDataSource} has not been called.
- * @throws IllegalArgumentException if params is invalid or not supported.
* @hide
*/
// This is an asynchronous call.
- public void setBufferingParams(@NonNull BufferingParams params) { }
+ public abstract Object setBufferingParams(@NonNull BufferingParams params);
/**
* Change playback speed of audio by resampling the audio.
@@ -904,9 +927,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* the object state.
*
* @param params the playback params.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setPlaybackParams(@NonNull PlaybackParams params);
+ public abstract Object setPlaybackParams(@NonNull PlaybackParams params);
/**
* Gets the playback params, containing the current playback rate.
@@ -920,9 +944,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* Sets A/V sync mode.
*
* @param params the A/V sync params to apply
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setSyncParams(@NonNull SyncParams params);
+ public abstract Object setSyncParams(@NonNull SyncParams params);
/**
* Gets the A/V sync mode.
@@ -998,9 +1023,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* If msec is negative, time position zero will be used.
* If msec is larger than duration, duration will be used.
* @param mode the mode indicating where exactly to seek to.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void seekTo(long msec, @SeekMode int mode);
+ public abstract Object seekTo(long msec, @SeekMode int mode);
/**
* Get current playback position as a {@link MediaTimestamp}.
@@ -1055,9 +1081,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* However, it is possible to force this player to be part of an already existing audio session
* by calling this method.
* This method must be called before one of the overloaded <code> setDataSource </code> methods.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setAudioSessionId(int sessionId);
+ public abstract Object setAudioSessionId(int sessionId);
/**
* Returns the audio session ID.
@@ -1080,9 +1107,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* <p>This method must be called after one of the overloaded <code> setDataSource </code>
* methods.
* @param effectId system wide unique id of the effect to attach
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void attachAuxEffect(int effectId);
+ public abstract Object attachAuxEffect(int effectId);
/**
@@ -1096,9 +1124,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* x == 0 -> level = 0
* 0 < x <= R -> level = 10^(72*(x-R)/20/R)
* @param level send level scalar
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void setAuxEffectSendLevel(float level);
+ public abstract Object setAuxEffectSendLevel(float level);
/**
* Class for MediaPlayer2 to return each audio/video/subtitle track's metadata.
@@ -1221,12 +1250,12 @@ public abstract class MediaPlayer2 implements AutoCloseable
* @param index the index of the track to be selected. The valid range of the index
* is 0..total number of track - 1. The total number of tracks as well as the type of
* each individual track can be found by calling {@link #getTrackInfo()} method.
- * @throws IllegalStateException if called in an invalid state.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*
* @see MediaPlayer2#getTrackInfo
*/
// This is an asynchronous call.
- public abstract void selectTrack(int index);
+ public abstract Object selectTrack(int index);
/**
* Deselect a track.
@@ -1238,12 +1267,12 @@ public abstract class MediaPlayer2 implements AutoCloseable
* @param index the index of the track to be deselected. The valid range of the index
* is 0..total number of tracks - 1. The total number of tracks as well as the type of
* each individual track can be found by calling {@link #getTrackInfo()} method.
- * @throws IllegalStateException if called in an invalid state.
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*
* @see MediaPlayer2#getTrackInfo
*/
// This is an asynchronous call.
- public abstract void deselectTrack(int index);
+ public abstract Object deselectTrack(int index);
/**
* Interface definition for callbacks to be invoked when the player has the corresponding
@@ -1614,16 +1643,6 @@ public abstract class MediaPlayer2 implements AutoCloseable
*/
public static final int CALL_COMPLETED_PREPARE = 6;
- /** The player just completed a call {@link #releaseDrm}.
- * @see EventCallback#onCallCompleted
- */
- public static final int CALL_COMPLETED_RELEASE_DRM = 12;
-
- /** The player just completed a call {@link #restoreDrmKeys}.
- * @see EventCallback#onCallCompleted
- */
- public static final int CALL_COMPLETED_RESTORE_DRM_KEYS = 13;
-
/** The player just completed a call {@link #seekTo}.
* @see EventCallback#onCallCompleted
*/
@@ -1706,6 +1725,12 @@ public abstract class MediaPlayer2 implements AutoCloseable
*/
public static final int CALL_COMPLETED_SET_VIDEO_SCALING_MODE = 32;
+ /** The player just completed a call {@link #setDisplay}.
+ * @see EventCallback#onCallCompleted
+ * @hide
+ */
+ public static final int CALL_COMPLETED_SET_DISPLAY = 33;
+
/**
* The start of the methods which have separate call complete callback.
* @hide
@@ -1736,8 +1761,6 @@ public abstract class MediaPlayer2 implements AutoCloseable
CALL_COMPLETED_PAUSE,
CALL_COMPLETED_PLAY,
CALL_COMPLETED_PREPARE,
- CALL_COMPLETED_RELEASE_DRM,
- CALL_COMPLETED_RESTORE_DRM_KEYS,
CALL_COMPLETED_SEEK_TO,
CALL_COMPLETED_SELECT_TRACK,
CALL_COMPLETED_SET_AUDIO_ATTRIBUTES,
@@ -1754,6 +1777,7 @@ public abstract class MediaPlayer2 implements AutoCloseable
CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES,
CALL_COMPLETED_SET_BUFFERING_PARAMS,
CALL_COMPLETED_SET_VIDEO_SCALING_MODE,
+ CALL_COMPLETED_SET_DISPLAY,
CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED,
CALL_COMPLETED_PREPARE_DRM,
})
@@ -1972,9 +1996,11 @@ public abstract class MediaPlayer2 implements AutoCloseable
* @param uuid The UUID of the crypto scheme. If not known beforehand, it can be retrieved
* from the source through {@code getDrmInfo} or registering a
* {@link DrmEventCallback#onDrmInfo}.
+ *
+ * @return a token which can be used to cancel the operation later with {@link #cancel}.
*/
// This is an asynchronous call.
- public abstract void prepareDrm(@NonNull UUID uuid);
+ public abstract Object prepareDrm(@NonNull UUID uuid);
/**
* Releases the DRM session
@@ -1985,8 +2011,9 @@ public abstract class MediaPlayer2 implements AutoCloseable
*
* @throws NoDrmSchemeException if there is no active DRM session to release
*/
- // This is an asynchronous call.
- public abstract void releaseDrm() throws NoDrmSchemeException;
+ // This is a synchronous call.
+ public abstract void releaseDrm()
+ throws NoDrmSchemeException;
/**
* A key request/response exchange occurs between the app and a license server
@@ -2037,7 +2064,7 @@ public abstract class MediaPlayer2 implements AutoCloseable
* provided to the DRM engine plugin using provideDrmKeyResponse. When the
* response is for an offline key request, a key-set identifier is returned that
* can be used to later restore the keys to a new session with the method
- * {@ link # restoreDrmKeys}.
+ * {@link # restoreDrmKeys}.
* When the response is for a streaming or release request, null is returned.
*
* @param keySetId When the response is for a release request, keySetId identifies
@@ -2061,8 +2088,10 @@ public abstract class MediaPlayer2 implements AutoCloseable
* keys to load, obtained from a prior call to {@link #provideDrmKeyResponse}.
*
* @param keySetId identifies the saved key set to restore
+ *
+ * @throws NoDrmSchemeException if there is no active DRM session
*/
- // This is an asynchronous call.
+ // This is a synchronous call.
public abstract void restoreDrmKeys(@NonNull byte[] keySetId)
throws NoDrmSchemeException;
diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java
index a5eb1fb12674..ef8db1d4dcba 100644
--- a/media/java/android/media/MediaPlayer2Impl.java
+++ b/media/java/android/media/MediaPlayer2Impl.java
@@ -192,8 +192,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* beginning.
*/
@Override
- public void play() {
- addTask(new Task(CALL_COMPLETED_PLAY, false) {
+ public Object play() {
+ return addTask(new Task(CALL_COMPLETED_PLAY, false) {
@Override
void process() {
stayAwake(true);
@@ -213,8 +213,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* buffered.
*/
@Override
- public void prepare() {
- addTask(new Task(CALL_COMPLETED_PREPARE, true) {
+ public Object prepare() {
+ return addTask(new Task(CALL_COMPLETED_PREPARE, true) {
@Override
void process() {
_prepare();
@@ -228,8 +228,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* Pauses playback. Call play() to resume.
*/
@Override
- public void pause() {
- addTask(new Task(CALL_COMPLETED_PAUSE, false) {
+ public Object pause() {
+ return addTask(new Task(CALL_COMPLETED_PAUSE, false) {
@Override
void process() {
stayAwake(false);
@@ -247,8 +247,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalStateException if it is called in an invalid state
*/
@Override
- public void skipToNext() {
- addTask(new Task(CALL_COMPLETED_SKIP_TO_NEXT, false) {
+ public Object skipToNext() {
+ return addTask(new Task(CALL_COMPLETED_SKIP_TO_NEXT, false) {
@Override
void process() {
if (getState() == PLAYER_STATE_PLAYING) {
@@ -307,8 +307,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalArgumentException if the attributes are null or invalid.
*/
@Override
- public void setAudioAttributes(@NonNull AudioAttributes attributes) {
- addTask(new Task(CALL_COMPLETED_SET_AUDIO_ATTRIBUTES, false) {
+ public Object setAudioAttributes(@NonNull AudioAttributes attributes) {
+ return addTask(new Task(CALL_COMPLETED_SET_AUDIO_ATTRIBUTES, false) {
@Override
void process() {
if (attributes == null) {
@@ -332,8 +332,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param dsd the descriptor of data source you want to play
*/
@Override
- public void setDataSource(@NonNull DataSourceDesc dsd) {
- addTask(new Task(CALL_COMPLETED_SET_DATA_SOURCE, false) {
+ public Object setDataSource(@NonNull DataSourceDesc dsd) {
+ return addTask(new Task(CALL_COMPLETED_SET_DATA_SOURCE, false) {
@Override
void process() throws IOException {
checkArgument(dsd != null, "the DataSourceDesc cannot be null");
@@ -358,8 +358,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param dsd the descriptor of data source you want to play after current one
*/
@Override
- public void setNextDataSource(@NonNull DataSourceDesc dsd) {
- addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCE, false) {
+ public Object setNextDataSource(@NonNull DataSourceDesc dsd) {
+ return addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCE, false) {
@Override
void process() {
checkArgument(dsd != null, "the DataSourceDesc cannot be null");
@@ -380,8 +380,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param dsds the list of data sources you want to play after current one
*/
@Override
- public void setNextDataSources(@NonNull List<DataSourceDesc> dsds) {
- addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCES, false) {
+ public Object setNextDataSources(@NonNull List<DataSourceDesc> dsds) {
+ return addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCES, false) {
@Override
void process() {
if (dsds == null || dsds.size() == 0) {
@@ -405,8 +405,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
@Override
- public void clearNextDataSources() {
- addTask(new Task(CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES, false) {
+ public Object clearNextDataSources() {
+ return addTask(new Task(CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES, false) {
@Override
void process() {
synchronized (mSrcLock) {
@@ -433,8 +433,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param loop true if the current data source is meant to loop.
*/
@Override
- public void loopCurrent(boolean loop) {
- addTask(new Task(CALL_COMPLETED_LOOP_CURRENT, false) {
+ public Object loopCurrent(boolean loop) {
+ return addTask(new Task(CALL_COMPLETED_LOOP_CURRENT, false) {
@Override
void process() {
// TODO: set the looping mode, send notification
@@ -455,8 +455,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
*/
@Override
- public void setPlayerVolume(float volume) {
- addTask(new Task(CALL_COMPLETED_SET_PLAYER_VOLUME, false) {
+ public Object setPlayerVolume(float volume) {
+ return addTask(new Task(CALL_COMPLETED_SET_PLAYER_VOLUME, false) {
@Override
void process() {
mVolume = volume;
@@ -532,8 +532,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private native byte[] _invoke(byte[] request);
@Override
- public void notifyWhenCommandLabelReached(Object label) {
- addTask(new Task(CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED, false) {
+ public Object notifyWhenCommandLabelReached(Object label) {
+ return addTask(new Task(CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED, false) {
@Override
void process() {
sendEvent(new EventNotifier() {
@@ -547,57 +547,27 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
});
}
- /**
- * Sets the {@link SurfaceHolder} to use for displaying the video
- * portion of the media.
- *
- * Either a surface holder or surface must be set if a display or video sink
- * is needed. Not calling this method or {@link #setSurface(Surface)}
- * when playing back a video will result in only the audio track being played.
- * A null surface holder or surface will result in only the audio track being
- * played.
- *
- * @param sh the SurfaceHolder to use for video display
- * @throws IllegalStateException if the internal player engine has not been
- * initialized or has been released.
- * @hide
- */
@Override
- public void setDisplay(SurfaceHolder sh) {
- mSurfaceHolder = sh;
- Surface surface;
- if (sh != null) {
- surface = sh.getSurface();
- } else {
- surface = null;
- }
- _setVideoSurface(surface);
- updateSurfaceScreenOn();
+ public Object setDisplay(SurfaceHolder sh) {
+ return addTask(new Task(CALL_COMPLETED_SET_DISPLAY, false) {
+ @Override
+ void process() {
+ mSurfaceHolder = sh;
+ Surface surface;
+ if (sh != null) {
+ surface = sh.getSurface();
+ } else {
+ surface = null;
+ }
+ _setVideoSurface(surface);
+ updateSurfaceScreenOn();
+ }
+ });
}
- /**
- * Sets the {@link Surface} to be used as the sink for the video portion of
- * the media. This is similar to {@link #setDisplay(SurfaceHolder)}, but
- * does not support {@link #setScreenOnWhilePlaying(boolean)}. Setting a
- * Surface will un-set any Surface or SurfaceHolder that was previously set.
- * A null surface will result in only the audio track being played.
- *
- * If the Surface sends frames to a {@link SurfaceTexture}, the timestamps
- * returned from {@link SurfaceTexture#getTimestamp()} will have an
- * unspecified zero point. These timestamps cannot be directly compared
- * between different media sources, different instances of the same media
- * source, or multiple runs of the same program. The timestamp is normally
- * monotonically increasing and is unaffected by time-of-day adjustments,
- * but it is reset when the position is set.
- *
- * @param surface The {@link Surface} to be used for the video portion of
- * the media.
- * @throws IllegalStateException if the internal player engine has not been
- * initialized or has been released.
- */
@Override
- public void setSurface(Surface surface) {
- addTask(new Task(CALL_COMPLETED_SET_SURFACE, false) {
+ public Object setSurface(Surface surface) {
+ return addTask(new Task(CALL_COMPLETED_SET_SURFACE, false) {
@Override
void process() {
if (mScreenOnWhilePlaying && surface != null) {
@@ -630,8 +600,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @hide
*/
@Override
- public void setVideoScalingMode(int mode) {
- addTask(new Task(CALL_COMPLETED_SET_VIDEO_SCALING_MODE, false) {
+ public Object setVideoScalingMode(int mode) {
+ return addTask(new Task(CALL_COMPLETED_SET_VIDEO_SCALING_MODE, false) {
@Override
void process() {
if (!isVideoScalingModeSupported(mode)) {
@@ -648,18 +618,26 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
});
}
- /**
- * Discards all pending commands.
- */
+ @Override
+ public boolean cancelCommand(Object token) {
+ synchronized (mTaskLock) {
+ return mPendingTasks.remove(token);
+ }
+ }
+
@Override
public void clearPendingCommands() {
+ synchronized (mTaskLock) {
+ mPendingTasks.clear();
+ }
}
- private void addTask(Task task) {
+ private Object addTask(Task task) {
synchronized (mTaskLock) {
mPendingTasks.add(task);
processPendingTask_l();
}
+ return task;
}
@GuardedBy("mTaskLock")
@@ -1282,23 +1260,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
@NonNull
public native BufferingParams getBufferingParams();
- /**
- * Sets buffering management params.
- * The object sets its internal BufferingParams to the input, except that the input is
- * invalid or not supported.
- * Call it only after {@code setDataSource} has been called.
- * The input is a hint to MediaPlayer2.
- *
- * @param params the buffering management params.
- *
- * @throws IllegalStateException if the internal player engine has not been
- * initialized or has been released, or {@code setDataSource} has not been called.
- * @throws IllegalArgumentException if params is invalid or not supported.
- * @hide
- */
@Override
- public void setBufferingParams(@NonNull BufferingParams params) {
- addTask(new Task(CALL_COMPLETED_SET_BUFFERING_PARAMS, false) {
+ public Object setBufferingParams(@NonNull BufferingParams params) {
+ return addTask(new Task(CALL_COMPLETED_SET_BUFFERING_PARAMS, false) {
@Override
void process() {
checkArgument(params != null, "the BufferingParams cannot be null");
@@ -1345,24 +1309,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
return params;
}
- /**
- * Sets playback rate using {@link PlaybackParams}. The object sets its internal
- * PlaybackParams to the input, except that the object remembers previous speed
- * when input speed is zero. This allows the object to resume at previous speed
- * when play() is called. Calling it before the object is prepared does not change
- * the object state. After the object is prepared, calling it with zero speed is
- * equivalent to calling pause(). After the object is prepared, calling it with
- * non-zero speed is equivalent to calling play().
- *
- * @param params the playback params.
- *
- * @throws IllegalStateException if the internal player engine has not been
- * initialized or has been released.
- * @throws IllegalArgumentException if params is not supported.
- */
@Override
- public void setPlaybackParams(@NonNull PlaybackParams params) {
- addTask(new Task(CALL_COMPLETED_SET_PLAYBACK_PARAMS, false) {
+ public Object setPlaybackParams(@NonNull PlaybackParams params) {
+ return addTask(new Task(CALL_COMPLETED_SET_PLAYBACK_PARAMS, false) {
@Override
void process() {
checkArgument(params != null, "the PlaybackParams cannot be null");
@@ -1394,8 +1343,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalArgumentException if params are not supported.
*/
@Override
- public void setSyncParams(@NonNull SyncParams params) {
- addTask(new Task(CALL_COMPLETED_SET_SYNC_PARAMS, false) {
+ public Object setSyncParams(@NonNull SyncParams params) {
+ return addTask(new Task(CALL_COMPLETED_SET_SYNC_PARAMS, false) {
@Override
void process() {
checkArgument(params != null, "the SyncParams cannot be null");
@@ -1449,8 +1398,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalArgumentException if the mode is invalid.
*/
@Override
- public void seekTo(final long msec, @SeekMode int mode) {
- addTask(new Task(CALL_COMPLETED_SEEK_TO, true) {
+ public Object seekTo(final long msec, @SeekMode int mode) {
+ return addTask(new Task(CALL_COMPLETED_SEEK_TO, true) {
@Override
void process() {
if (mode < SEEK_PREVIOUS_SYNC || mode > SEEK_CLOSEST) {
@@ -1582,8 +1531,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalArgumentException if the sessionId is invalid.
*/
@Override
- public void setAudioSessionId(int sessionId) {
- addTask(new Task(CALL_COMPLETED_SET_AUDIO_SESSION_ID, false) {
+ public Object setAudioSessionId(int sessionId) {
+ return addTask(new Task(CALL_COMPLETED_SET_AUDIO_SESSION_ID, false) {
@Override
void process() {
_setAudioSessionId(sessionId);
@@ -1617,8 +1566,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param effectId system wide unique id of the effect to attach
*/
@Override
- public void attachAuxEffect(int effectId) {
- addTask(new Task(CALL_COMPLETED_ATTACH_AUX_EFFECT, false) {
+ public Object attachAuxEffect(int effectId) {
+ return addTask(new Task(CALL_COMPLETED_ATTACH_AUX_EFFECT, false) {
@Override
void process() {
_attachAuxEffect(effectId);
@@ -1641,8 +1590,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param level send level scalar
*/
@Override
- public void setAuxEffectSendLevel(float level) {
- addTask(new Task(CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL, false) {
+ public Object setAuxEffectSendLevel(float level) {
+ return addTask(new Task(CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL, false) {
@Override
void process() {
_setAuxEffectSendLevel(level);
@@ -1858,8 +1807,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @see android.media.MediaPlayer2#getTrackInfo
*/
@Override
- public void selectTrack(int index) {
- addTask(new Task(CALL_COMPLETED_SELECT_TRACK, false) {
+ public Object selectTrack(int index) {
+ return addTask(new Task(CALL_COMPLETED_SELECT_TRACK, false) {
@Override
void process() {
selectOrDeselectTrack(index, true /* select */);
@@ -1882,8 +1831,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @see android.media.MediaPlayer2#getTrackInfo
*/
@Override
- public void deselectTrack(int index) {
- addTask(new Task(CALL_COMPLETED_DESELECT_TRACK, false) {
+ public Object deselectTrack(int index) {
+ return addTask(new Task(CALL_COMPLETED_DESELECT_TRACK, false) {
@Override
void process() {
selectOrDeselectTrack(index, false /* select */);
@@ -2526,8 +2475,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
@Override
- public void prepareDrm(@NonNull UUID uuid) {
- addTask(new Task(CALL_COMPLETED_PREPARE_DRM, true) {
+ public Object prepareDrm(@NonNull UUID uuid) {
+ return addTask(new Task(CALL_COMPLETED_PREPARE_DRM, true) {
@Override
void process() {
int status = PREPARE_DRM_STATUS_SUCCESS;
@@ -2682,57 +2631,40 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
} // synchronized
}
-
- private native void _releaseDrm();
-
- /**
- * Releases the DRM session
- * <p>
- * The player has to have an active DRM session and be in stopped, or prepared
- * state before this call is made.
- * A {@code reset()} call will release the DRM session implicitly.
- *
- * @throws NoDrmSchemeException if there is no active DRM session to release
- */
@Override
public void releaseDrm()
- throws NoDrmSchemeException
- {
- addTask(new Task(CALL_COMPLETED_RELEASE_DRM, false) {
- @Override
- void process() throws NoDrmSchemeException {
- synchronized (mDrmLock) {
- Log.v(TAG, "releaseDrm:");
-
- if (!mActiveDrmScheme) {
- Log.e(TAG, "releaseDrm(): No active DRM scheme to release.");
- throw new NoDrmSchemeExceptionImpl(
- "releaseDrm: No active DRM scheme to release.");
- }
+ throws NoDrmSchemeException {
+ synchronized (mDrmLock) {
+ Log.v(TAG, "releaseDrm:");
- try {
- // we don't have the player's state in this layer. The below call raises
- // exception if we're in a non-stopped/prepared state.
+ if (!mActiveDrmScheme) {
+ Log.e(TAG, "releaseDrm(): No active DRM scheme to release.");
+ throw new NoDrmSchemeExceptionImpl(
+ "releaseDrm: No active DRM scheme to release.");
+ }
+
+ try {
+ // we don't have the player's state in this layer. The below call raises
+ // exception if we're in a non-stopped/prepared state.
- // for cleaning native/mediaserver crypto object
- _releaseDrm();
+ // for cleaning native/mediaserver crypto object
+ _releaseDrm();
- // for cleaning client-side MediaDrm object; only called if above has succeeded
- cleanDrmObj();
+ // for cleaning client-side MediaDrm object; only called if above has succeeded
+ cleanDrmObj();
- mActiveDrmScheme = false;
- } catch (IllegalStateException e) {
- Log.w(TAG, "releaseDrm: Exception ", e);
- throw new IllegalStateException(
- "releaseDrm: The player is not in a valid state.");
- } catch (Exception e) {
- Log.e(TAG, "releaseDrm: Exception ", e);
- }
- } // synchronized
+ mActiveDrmScheme = false;
+ } catch (IllegalStateException e) {
+ Log.w(TAG, "releaseDrm: Exception ", e);
+ throw new IllegalStateException(
+ "releaseDrm: The player is not in a valid state.");
+ } catch (Exception e) {
+ Log.e(TAG, "releaseDrm: Exception ", e);
}
- });
+ } // synchronized
}
+ private native void _releaseDrm();
/**
* A key request/response exchange occurs between the app and a license server
@@ -2823,7 +2755,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* provided to the DRM engine plugin using provideDrmKeyResponse. When the
* response is for an offline key request, a key-set identifier is returned that
* can be used to later restore the keys to a new session with the method
- * {@ link # restoreDrmKeys}.
+ * {@link # restoreDrmKeys}.
* When the response is for a streaming or release request, null is returned.
*
* @param keySetId When the response is for a release request, keySetId identifies
@@ -2876,43 +2808,27 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
} // synchronized
}
-
- /**
- * Restore persisted offline keys into a new session. keySetId identifies the
- * keys to load, obtained from a prior call to {@link #provideDrmKeyResponse}.
- *
- * @param keySetId identifies the saved key set to restore
- */
@Override
public void restoreDrmKeys(@NonNull byte[] keySetId)
- throws NoDrmSchemeException
- {
- addTask(new Task(CALL_COMPLETED_RESTORE_DRM_KEYS, false) {
- @Override
- void process() throws NoDrmSchemeException {
- Log.v(TAG, "restoreDrmKeys: keySetId: " + keySetId);
-
- synchronized (mDrmLock) {
-
- if (!mActiveDrmScheme) {
- Log.w(TAG, "restoreDrmKeys NoDrmSchemeException");
- throw new NoDrmSchemeExceptionImpl(
- "restoreDrmKeys: Has to set a DRM scheme first.");
- }
+ throws NoDrmSchemeException {
+ Log.v(TAG, "restoreDrmKeys: keySetId: " + keySetId);
- try {
- mDrmObj.restoreKeys(mDrmSessionId, keySetId);
- } catch (Exception e) {
- Log.w(TAG, "restoreKeys Exception " + e);
- throw e;
- }
+ synchronized (mDrmLock) {
+ if (!mActiveDrmScheme) {
+ Log.w(TAG, "restoreDrmKeys NoDrmSchemeException");
+ throw new NoDrmSchemeExceptionImpl(
+ "restoreDrmKeys: Has to set a DRM scheme first.");
+ }
- } // synchronized
+ try {
+ mDrmObj.restoreKeys(mDrmSessionId, keySetId);
+ } catch (Exception e) {
+ Log.w(TAG, "restoreKeys Exception " + e);
+ throw e;
}
- });
+ } // synchronized
}
-
/**
* Read a DRM engine plugin String property value, given the property name string.
* <p>
@@ -3601,7 +3517,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private void sendCompleteNotification(int status) {
// In {@link #notifyWhenCommandLabelReached} case, a separate callback
// {@link #onCommandLabelReached} is already called in {@code process()}.
- // CALL_COMPLETED_PREPARE_DRM is sent via DrmEventCallback
+ // CALL_COMPLETED_PREPARE_DRM is sent via DrmEventCallback#onDrmPrepared
if (mMediaCallType == CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED
|| mMediaCallType == CALL_COMPLETED_PREPARE_DRM) {
return;
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index e84156716424..0f531c9e61e8 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -81,9 +81,6 @@ cc_library_shared {
"-Wno-error=deprecated-declarations",
"-Wunused",
"-Wunreachable-code",
- // Allow implicit fallthroughs in android_media_MediaScanner.cpp and
- // android_mtp_MtpDatabase.cpp until they are fixed.
- "-Wno-error=implicit-fallthrough",
],
}
@@ -126,14 +123,12 @@ cc_library_shared {
"libcutils",
"libmedia_helper",
"libmedia_player2_util",
- "libmediadrm",
"libmediaextractor",
"libmediametrics",
"libmediaplayer2",
"libmediaplayer2-protos",
"libmediandk_utils",
"libmediautils",
- "libnetd_client", // for setNetworkForUser
"libprotobuf-cpp-lite",
"libstagefright_esds",
"libstagefright_foundation",
@@ -142,7 +137,7 @@ cc_library_shared {
"libstagefright_mpeg2support",
"libstagefright_nuplayer2",
"libstagefright_player2",
- "libstagefright_rtsp",
+ "libstagefright_rtsp_player2",
"libstagefright_timedtext2",
"libmedia2_jni_core",
],
diff --git a/media/jni/android_media_AudioPresentation.h b/media/jni/android_media_AudioPresentation.h
index 71b8dacfbdfa..5306de6f8580 100644
--- a/media/jni/android_media_AudioPresentation.h
+++ b/media/jni/android_media_AudioPresentation.h
@@ -49,7 +49,7 @@ struct JAudioPresentationInfo {
}
constructID = env->GetMethodID(clazz, "<init>",
- "(IILjava/util/Map;Ljava/lang/String;IZZZ)V");
+ "(IILandroid/icu/util/ULocale;IZZZLjava/util/Map;)V");
env->DeleteLocalRef(lclazz);
// list objects
@@ -104,21 +104,26 @@ struct JAudioPresentationInfo {
// don't expose private keys (starting with android._)
continue;
}
-
jobject valueObj = NULL;
-
AString val;
CHECK(msg->findString(key, &val));
-
valueObj = env->NewStringUTF(val.c_str());
-
if (valueObj != NULL) {
- jstring keyObj = env->NewStringUTF(key);
-
- env->CallObjectMethod(hashMap, hashMapPutID, keyObj, valueObj);
-
- env->DeleteLocalRef(keyObj); keyObj = NULL;
+ ScopedLocalRef<jclass> localeClazz(env, env->FindClass("android/icu/util/ULocale"));
+ if (localeClazz.get() == NULL) {
+ return -EINVAL;
+ }
+ jmethodID localeConstructID =
+ env->GetMethodID(localeClazz.get(), "<init>", "(Ljava/lang/String;)V");
+ if (localeConstructID == NULL) {
+ return -EINVAL;
+ }
+ jstring jLanguage = env->NewStringUTF(key);
+ jobject jLocale = env->NewObject(localeClazz.get(), localeConstructID, jLanguage);
+ env->CallObjectMethod(hashMap, hashMapPutID, jLocale, valueObj);
+ env->DeleteLocalRef(jLocale); jLocale = NULL;
env->DeleteLocalRef(valueObj); valueObj = NULL;
+ env->DeleteLocalRef(jLanguage); jLanguage = NULL;
}
}
@@ -142,26 +147,36 @@ struct JAudioPresentationInfo {
if (ConvertMessageToMap(env, labelMessage, &jLabelObject) != OK) {
return NULL;
}
- jstring jLanguage = env->NewStringUTF(ap->mLanguage.string());
-
+ ScopedLocalRef<jclass> localeClazz(env, env->FindClass("android/icu/util/ULocale"));
+ if (localeClazz.get() == NULL) {
+ return NULL;
+ }
+ jmethodID localeConstructID =
+ env->GetMethodID(localeClazz.get(), "<init>", "(Ljava/lang/String;)V");
+ if (localeConstructID == NULL) {
+ return NULL;
+ }
+ jstring jLanguage = env->NewStringUTF(ap->mLanguage.c_str());
+ jobject jLocale = env->NewObject(localeClazz.get(), localeConstructID, jLanguage);
jobject jValueObj = env->NewObject(fields.clazz, fields.constructID,
static_cast<jint>(ap->mPresentationId),
static_cast<jint>(ap->mProgramId),
- jLabelObject,
- jLanguage,
+ jLocale,
static_cast<jint>(ap->mMasteringIndication),
static_cast<jboolean>((ap->mAudioDescriptionAvailable == 1) ?
1 : 0),
static_cast<jboolean>((ap->mSpokenSubtitlesAvailable == 1) ?
1 : 0),
static_cast<jboolean>((ap->mDialogueEnhancementAvailable == 1) ?
- 1 : 0));
+ 1 : 0),
+ jLabelObject);
if (jValueObj == NULL) {
env->DeleteLocalRef(jLanguage); jLanguage = NULL;
return NULL;
}
env->CallBooleanMethod(list, fields.listAddId, jValueObj);
+ env->DeleteLocalRef(jLocale); jLocale = NULL;
env->DeleteLocalRef(jValueObj); jValueObj = NULL;
env->DeleteLocalRef(jLanguage); jLanguage = NULL;
}
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index c0ceb0152271..58044c0307eb 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -27,6 +27,7 @@
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
+#include <android-base/macros.h> // for FALLTHROUGH_INTENDED
using namespace android;
@@ -92,6 +93,7 @@ static bool isValidUtf8(const char* bytes) {
return false;
}
// Fall through to take care of the final byte.
+ FALLTHROUGH_INTENDED;
case 0x0c:
case 0x0d:
// Bit pattern 110x, so there is one additional byte.
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index 4d8c96fadaa9..56b85b5167f5 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -1272,6 +1272,7 @@ MtpProperty* MtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME:
writable = true;
// fall through
+ FALLTHROUGH_INTENDED;
case MTP_DEVICE_PROPERTY_IMAGE_SIZE:
{
result = new MtpProperty(property, MTP_TYPE_STR, writable);
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 24d003b7c2b1..a4306fe1763f 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -62,8 +62,10 @@ cc_library_shared {
"libbinder",
"libui",
"libgui",
+ "libharfbuzz_ng", // Only for including hb.h via minikin
"libsensor",
"libandroid_runtime",
+ "libminikin",
"libnetd_client",
"libhwui",
"libxml2",
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index 9f48bc97e94c..e7e8384c5567 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -224,6 +224,7 @@ LIBANDROID {
ASystemFont_getAxisCount; # introduced=29
ASystemFont_getAxisTag; # introduced=29
ASystemFont_getAxisValue; # introduced=29
+ ASystemFont_matchFamilyStyleCharacter; # introduced=29
ATrace_beginSection; # introduced=23
ATrace_endSection; # introduced=23
ATrace_isEnabled; # introduced=23
diff --git a/native/android/system_fonts.cpp b/native/android/system_fonts.cpp
index 761a475a2773..4d3d1d66ffda 100644
--- a/native/android/system_fonts.cpp
+++ b/native/android/system_fonts.cpp
@@ -29,6 +29,11 @@
#include <sys/stat.h>
#include <unistd.h>
+#include <hwui/MinikinSkia.h>
+#include <minikin/FontCollection.h>
+#include <minikin/LocaleList.h>
+#include <minikin/SystemFonts.h>
+
struct XmlCharDeleter {
void operator()(xmlChar* b) { xmlFree(b); }
};
@@ -192,6 +197,41 @@ void ASystemFontIterator_close(ASystemFontIterator* ite) {
delete ite;
}
+ASystemFont* ASystemFont_matchFamilyStyleCharacter(
+ const char* _Nonnull familyName,
+ uint16_t weight,
+ bool italic,
+ const char* _Nonnull languageTags,
+ const uint16_t* _Nonnull text,
+ uint32_t textLength,
+ uint32_t* _Nullable runLength) {
+ std::shared_ptr<minikin::FontCollection> fc =
+ minikin::SystemFonts::findFontCollection(familyName);
+ std::vector<minikin::FontCollection::Run> runs =
+ fc->itemize(minikin::U16StringPiece(text, textLength),
+ minikin::FontStyle(weight, static_cast<minikin::FontStyle::Slant>(italic)),
+ minikin::registerLocaleList(languageTags),
+ minikin::FamilyVariant::DEFAULT);
+
+ const minikin::Font* font = runs[0].fakedFont.font;
+ std::unique_ptr<ASystemFont> result = std::make_unique<ASystemFont>();
+ const android::MinikinFontSkia* minikinFontSkia =
+ reinterpret_cast<android::MinikinFontSkia*>(font->typeface().get());
+ result->mFilePath = minikinFontSkia->getFilePath();
+ result->mWeight = font->style().weight();
+ result->mItalic = font->style().slant() == minikin::FontStyle::Slant::ITALIC;
+ result->mCollectionIndex = minikinFontSkia->GetFontIndex();
+ const std::vector<minikin::FontVariation>& axes = minikinFontSkia->GetAxes();
+ result->mAxes.reserve(axes.size());
+ for (auto axis : axes) {
+ result->mAxes.push_back(std::make_pair(axis.axisTag, axis.value));
+ }
+ if (runLength != nullptr) {
+ *runLength = runs[0].end;
+ }
+ return result.release();
+}
+
xmlNode* findNextFontNode(const XmlDocUniquePtr& xmlDoc, xmlNode* fontNode) {
if (fontNode == nullptr) {
if (!xmlDoc) {
diff --git a/packages/BackupRestoreConfirmation/res/values-mr/strings.xml b/packages/BackupRestoreConfirmation/res/values-mr/strings.xml
index 4be28db10c3a..b3541717c96e 100644
--- a/packages/BackupRestoreConfirmation/res/values-mr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-mr/strings.xml
@@ -24,10 +24,10 @@
<string name="restore_confirm_text" msgid="7499866728030461776">"कनेक्‍ट केलेल्‍या डेस्‍कटॉप काँप्युटरवरील सर्व डेटाच्या पूर्ण पुनर्संचयनाची विनंती केली गेली आहे. तुम्ही असे होण्यासाठी अनुमती देऊ इच्‍छिता?\n\nतुम्ही स्‍वत: पुनर्संचयनाची विनंती केली नसल्‍यास, कार्य पुढे सुरु राहण्‍यास अनुमती देऊ नका. हे आपल्‍या डिव्‍हाइसवरील कोणत्याही वर्तमान डेटास पुनर्स्‍थित करेल!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"माझा डेटा पुनर्संचयित करा"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"पुनर्संचयित करू नका"</string>
- <string name="current_password_text" msgid="8268189555578298067">"कृपया आपला वर्तमान बॅकअप संकेतशब्‍द खाली प्रविष्‍ट करा:"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"कृपया तुमचा वर्तमान बॅकअप संकेतशब्‍द खाली प्रविष्‍ट करा:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया तुमचे डिव्हाइस एंक्रिप्शन पासवर्ड खाली एंटर करा."</string>
<string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया तुमचे डिव्हाइस एंक्रिप्शन पासवर्ड खाली एंटर करा. हा बॅकअप संग्रह एंक्रिप्ट करण्‍यासाठी देखील वापरला जाईल."</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"कृपया पूर्ण बॅकअप डेटा एंक्रिप्ट करण्‍यासाठी वापरण्याकरिता पासवर्ड एंटर करा. हे रिक्त सोडल्‍यास, आपला वर्तमान बॅकअप पासवर्ड वापरला जाईल:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"कृपया पूर्ण बॅकअप डेटा एंक्रिप्ट करण्‍यासाठी वापरण्याकरिता पासवर्ड एंटर करा. हे रिक्त सोडल्‍यास, तुमचा वर्तमान बॅकअप पासवर्ड वापरला जाईल:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"तुम्ही पूर्ण बॅकअप डेटा एंक्रिप्ट करू इच्‍छित असल्‍यास, खालील पासवर्ड एंटर करा:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"तुमचे डिव्हाइस एंक्रिप्ट केले असल्यामुळे, तुम्हाला तुमचा बॅक अप एंक्रिप्ट करणे आवश्यक आहे. कृपया खाली एक पासवर्ड एंटर करा:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"पुनर्स्टोअर केलेला डेटा एंक्रिप्ट केला असल्‍यास, कृपया पासवर्ड खाली एंटर करा:"</string>
diff --git a/packages/CarrierDefaultApp/res/values-mr/strings.xml b/packages/CarrierDefaultApp/res/values-mr/strings.xml
index e1442c2ca48e..79cc4aa03cfc 100644
--- a/packages/CarrierDefaultApp/res/values-mr/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-mr/strings.xml
@@ -4,7 +4,7 @@
<string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
<string name="android_system_label" msgid="2797790869522345065">"मोबाइल वाहक"</string>
<string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा संपला आहे"</string>
- <string name="no_data_notification_id" msgid="668400731803969521">"आपला मोबाइल डेटा निष्क्रिय केला गेला"</string>
+ <string name="no_data_notification_id" msgid="668400731803969521">"तुमचा मोबाइल डेटा निष्क्रिय केला गेला"</string>
<string name="portal_notification_detail" msgid="2295729385924660881">"%s वेबसाइटला भेट देण्‍यासाठी टॅप करा"</string>
<string name="no_data_notification_detail" msgid="3112125343857014825">"कृपया आपल्या %s सेवा प्रदात्याशी संपर्क साधा"</string>
<string name="no_mobile_data_connection_title" msgid="7449525772416200578">"मोबाइल डेटा कनेक्‍शन नाही"</string>
diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
index 8f33a7016b39..ddc00e37b8dc 100644
--- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java
+++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
@@ -38,6 +38,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.provider.Settings;
@@ -77,6 +78,10 @@ import java.util.Map;
public class Assistant extends NotificationAssistantService {
private static final String TAG = "ExtAssistant";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ public static final boolean AUTO_DEMOTE_NOTIFICATIONS = SystemProperties.getBoolean(
+ "debug.demote_notifs", false);
+ public static final boolean AGE_NOTIFICATIONS = SystemProperties.getBoolean(
+ "debug.age_notifs", false);
private static final String TAG_ASSISTANT = "assistant";
private static final String TAG_IMPRESSION = "impression-set";
@@ -230,16 +235,19 @@ public class Assistant extends NotificationAssistantService {
@NonNull ArrayList<Notification.Action> smartActions,
@NonNull ArrayList<CharSequence> smartReplies) {
Bundle signals = new Bundle();
- if (!smartActions.isEmpty()) {
- signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
- }
- if (!smartReplies.isEmpty()) {
- signals.putCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES, smartReplies);
- }
- if (mNotificationCategorizer.shouldSilence(entry)) {
- final int importance = entry.getImportance() < IMPORTANCE_LOW ? entry.getImportance()
- : IMPORTANCE_LOW;
- signals.putInt(KEY_IMPORTANCE, importance);
+
+ if (AUTO_DEMOTE_NOTIFICATIONS) {
+ if (!smartActions.isEmpty()) {
+ signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
+ }
+ if (!smartReplies.isEmpty()) {
+ signals.putCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES, smartReplies);
+ }
+ if (mNotificationCategorizer.shouldSilence(entry)) {
+ final int importance = entry.getImportance() < IMPORTANCE_LOW
+ ? entry.getImportance() : IMPORTANCE_LOW;
+ signals.putInt(KEY_IMPORTANCE, importance);
+ }
}
return new Adjustment(
@@ -445,13 +453,15 @@ public class Assistant extends NotificationAssistantService {
protected final class AgingCallback implements Callback {
@Override
public void sendAdjustment(String key, int newImportance) {
- NotificationEntry entry = mLiveNotifications.get(key);
- if (entry != null) {
- Bundle bundle = new Bundle();
- bundle.putInt(KEY_IMPORTANCE, newImportance);
- Adjustment adjustment = new Adjustment(entry.getSbn().getPackageName(), key, bundle,
- "aging", entry.getSbn().getUserId());
- adjustNotification(adjustment);
+ if (AGE_NOTIFICATIONS) {
+ NotificationEntry entry = mLiveNotifications.get(key);
+ if (entry != null) {
+ Bundle bundle = new Bundle();
+ bundle.putInt(KEY_IMPORTANCE, newImportance);
+ Adjustment adjustment = new Adjustment(entry.getSbn().getPackageName(), key,
+ bundle, "aging", entry.getSbn().getUserId());
+ adjustNotification(adjustment);
+ }
}
}
}
diff --git a/packages/OsuLogin/Android.mk b/packages/OsuLogin/Android.mk
index f04227bda263..2c076159ec12 100644
--- a/packages/OsuLogin/Android.mk
+++ b/packages/OsuLogin/Android.mk
@@ -3,6 +3,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_USE_AAPT2 := true
+LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/packages/OsuLogin/AndroidManifest.xml b/packages/OsuLogin/AndroidManifest.xml
index bc32d103bdd4..123559adf6fd 100644
--- a/packages/OsuLogin/AndroidManifest.xml
+++ b/packages/OsuLogin/AndroidManifest.xml
@@ -17,10 +17,10 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.hotspot2">
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.INTERNET" />
+ package="com.android.hotspot2">
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
<application
android:networkSecurityConfig="@xml/network_security_config"
@@ -28,7 +28,10 @@
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation|screenSize"
android:supportsRtl="true">
- <activity android:name="com.android.hotspot2.osu.OsuLoginActivity">
+ <activity android:name="com.android.hotspot2.osu.OsuLoginActivity"
+ android:label="@string/action_bar_label"
+ android:theme="@style/AppTheme"
+ android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
diff --git a/packages/OsuLogin/res/layout/osu_web_view.xml b/packages/OsuLogin/res/layout/osu_web_view.xml
index 4eafb39d1713..fb3c06513430 100644
--- a/packages/OsuLogin/res/layout/osu_web_view.xml
+++ b/packages/OsuLogin/res/layout/osu_web_view.xml
@@ -1,13 +1,38 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/container"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <WebView
- android:id="@+id/webview"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="com.android.hotspot2.osu.OsuLoginActivity">
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_alignParentBottom="true"
- android:layout_alignParentRight="true" />
+ android:orientation="vertical">
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="4dp">
+ <!-- Eliminates ProgressBar padding by boxing it into a 4dp high container -->
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.Light.ProgressBar.Horizontal"
+ android:indeterminate="false"
+ android:max="100"
+ android:progress="0"
+ android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+ </FrameLayout>
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/swipe_refresh"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <WebView
+ android:id="@+id/webview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentBottom="false"
+ android:layout_alignParentRight="false"/>
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+ </LinearLayout>
</FrameLayout>
diff --git a/packages/OsuLogin/res/values/strings.xml b/packages/OsuLogin/res/values/strings.xml
index 9fafeeff4348..06fa8c7b1e8f 100644
--- a/packages/OsuLogin/res/values/strings.xml
+++ b/packages/OsuLogin/res/values/strings.xml
@@ -1,4 +1,6 @@
<resources>
<!-- application name [CHAR LIMIT=32] -->
<string name="app_name">OsuLogin</string>
+ <!-- action bar label [CHAR LIMIT=32] -->
+ <string name="action_bar_label">Online Sign Up</string>
</resources>
diff --git a/packages/OsuLogin/src/com/android/hotspot2/osu/OsuLoginActivity.java b/packages/OsuLogin/src/com/android/hotspot2/osu/OsuLoginActivity.java
index 6a4890467686..0312b81493be 100644
--- a/packages/OsuLogin/src/com/android/hotspot2/osu/OsuLoginActivity.java
+++ b/packages/OsuLogin/src/com/android/hotspot2/osu/OsuLoginActivity.java
@@ -16,9 +16,12 @@
package com.android.hotspot2.osu;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
+
import android.annotation.Nullable;
import android.app.Activity;
import android.content.Context;
+import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -27,17 +30,22 @@ import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.View;
+import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
+import android.widget.ProgressBar;
import com.android.hotspot2.R;
import java.net.MalformedURLException;
import java.net.URL;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
/**
* Online Sign Up Login Web View launched during Provision Process of Hotspot 2.0 rel2.
*/
@@ -52,6 +60,8 @@ public class OsuLoginActivity extends Activity {
private ConnectivityManager.NetworkCallback mNetworkCallback;
private WifiManager mWifiManager;
private WebView mWebView;
+ private SwipeRefreshLayout mSwipeRefreshLayout;
+ private ProgressBar mProgressBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -117,6 +127,9 @@ public class OsuLoginActivity extends Activity {
}
getActionBar().setDisplayShowHomeEnabled(false);
+ getActionBar().setElevation(0); // remove shadow
+ getActionBar().setTitle(getString(R.string.action_bar_label));
+ getActionBar().setSubtitle("");
setContentView(R.layout.osu_web_view);
// Exit this app if network disappeared.
@@ -134,7 +147,8 @@ public class OsuLoginActivity extends Activity {
mCm.registerNetworkCallback(
new NetworkRequest.Builder().addTransportType(
- NetworkCapabilities.TRANSPORT_WIFI).build(),
+ NetworkCapabilities.TRANSPORT_WIFI).removeCapability(
+ NET_CAPABILITY_TRUSTED).build(),
mNetworkCallback);
mWebView = findViewById(R.id.webview);
@@ -147,12 +161,25 @@ public class OsuLoginActivity extends Activity {
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
-
+ mProgressBar = findViewById(R.id.progress_bar);
mWebView.setWebViewClient(new OsuWebViewClient());
+ mWebView.setWebChromeClient(new WebChromeClient() {
+ @Override
+ public void onProgressChanged(WebView view, int newProgress) {
+ mProgressBar.setProgress(newProgress);
+ }
+ });
+
if (DBG) {
Log.d(TAG, "OSU Web View to " + mUrl);
}
+
mWebView.loadUrl(mUrl);
+ mSwipeRefreshLayout = findViewById(R.id.swipe_refresh);
+ mSwipeRefreshLayout.setOnRefreshListener(() -> {
+ mWebView.reload();
+ mSwipeRefreshLayout.setRefreshing(true);
+ });
}
@Override
@@ -191,11 +218,31 @@ public class OsuLoginActivity extends Activity {
return null;
}
+ private String getHeaderSubtitle(String urlString) {
+ try {
+ URL url = new URL(urlString);
+ return url.getProtocol() + "://" + url.getHost();
+ } catch (MalformedURLException e) {
+ Log.e(TAG, "Invalid URL " + urlString);
+ }
+ return "";
+ }
+
private class OsuWebViewClient extends WebViewClient {
boolean mPageError = false;
@Override
+ public void onPageStarted(WebView view, String urlString, Bitmap favicon) {
+ String subtitle = getHeaderSubtitle(urlString);
+ getActionBar().setSubtitle(subtitle);
+ mProgressBar.setVisibility(View.VISIBLE);
+ }
+
+ @Override
public void onPageFinished(WebView view, String url) {
+ mProgressBar.setVisibility(View.INVISIBLE);
+ mSwipeRefreshLayout.setRefreshing(false);
+
// Do not show the page error on UI.
if (mPageError) {
finishAndRemoveTask();
@@ -213,4 +260,5 @@ public class OsuLoginActivity extends Activity {
}
}
}
+
}
diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml
index 2e7c4aa3dc2f..dfee4e83d7a3 100644
--- a/packages/PackageInstaller/res/values-af/strings.xml
+++ b/packages/PackageInstaller/res/values-af/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Gaan voort"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Instellings"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installeer/deïnstalleer Wear-programme"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Kennisgewing dat program geïnstalleer is"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Suksesvol geïnstalleer"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” is suksesvol geïnstalleer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index 4c3d60d9871e..cfdeb59d0b83 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ቀጥል"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ቅንብሮች"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"የWear መተግበሪያዎችን መጫን/ማራገፍ"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"የመተግበሪያ ተጭኗል ማሳወቂያ"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"በተሳካ ሁኔታ ተጭኗል"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» በተሳካ ሁኔታ ተጭኗል"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 1721bf53bd34..da919830c761 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"متابعة"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"الإعدادات"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"‏تثبيت / إلغاء تثبيت تطبيقات Android Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"إشعار \"تم تثبيت التطبيق\""</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"تم التثبيت بنجاح."</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"تم تثبيت \"<xliff:g id="APPNAME">%1$s</xliff:g>\" بنجاح."</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
new file mode 100644
index 000000000000..172e03143d57
--- /dev/null
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for app_name (7488448184431507488) -->
+ <skip />
+ <!-- no translation found for install (711829760615509273) -->
+ <skip />
+ <!-- no translation found for done (6632441120016885253) -->
+ <skip />
+ <!-- no translation found for cancel (1018267193425558088) -->
+ <skip />
+ <!-- no translation found for installing (4921993079741206516) -->
+ <skip />
+ <!-- no translation found for installing_app (1165095864863849422) -->
+ <skip />
+ <!-- no translation found for install_done (5987363587661783896) -->
+ <skip />
+ <!-- no translation found for install_confirm_question (8176284075816604590) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update (7942235418781274635) -->
+ <skip />
+ <!-- no translation found for install_confirm_question_update_system (4713001702777910263) -->
+ <skip />
+ <!-- no translation found for install_failed (5777824004474125469) -->
+ <skip />
+ <!-- no translation found for install_failed_blocked (8512284352994752094) -->
+ <skip />
+ <!-- no translation found for install_failed_conflict (3493184212162521426) -->
+ <skip />
+ <!-- no translation found for install_failed_incompatible (6019021440094927928) -->
+ <skip />
+ <!-- no translation found for install_failed_incompatible (2890001324362291683) -->
+ <skip />
+ <!-- no translation found for install_failed_incompatible (7254630419511645826) -->
+ <skip />
+ <!-- no translation found for install_failed_invalid_apk (8581007676422623930) -->
+ <skip />
+ <!-- no translation found for install_failed_msg (6298387264270562442) -->
+ <skip />
+ <!-- no translation found for install_failed_msg (1920009940048975221) -->
+ <skip />
+ <!-- no translation found for install_failed_msg (6484461562647915707) -->
+ <skip />
+ <!-- no translation found for launch (3952550563999890101) -->
+ <skip />
+ <!-- no translation found for unknown_apps_admin_dlg_text (4456572224020176095) -->
+ <skip />
+ <!-- no translation found for unknown_apps_user_restriction_dlg_text (151020786933988344) -->
+ <skip />
+ <!-- no translation found for install_apps_user_restriction_dlg_text (2154119597001074022) -->
+ <skip />
+ <!-- no translation found for ok (7871959885003339302) -->
+ <skip />
+ <!-- no translation found for manage_applications (5400164782453975580) -->
+ <skip />
+ <!-- no translation found for out_of_space_dlg_title (4156690013884649502) -->
+ <skip />
+ <!-- no translation found for out_of_space_dlg_text (8727714096031856231) -->
+ <skip />
+ <!-- no translation found for app_not_found_dlg_title (5107924008597470285) -->
+ <skip />
+ <!-- no translation found for app_not_found_dlg_text (5219983779377811611) -->
+ <skip />
+ <!-- no translation found for user_is_not_allowed_dlg_title (6915293433252210232) -->
+ <skip />
+ <!-- no translation found for user_is_not_allowed_dlg_text (3468447791330611681) -->
+ <skip />
+ <!-- no translation found for generic_error_dlg_title (5863195085927067752) -->
+ <skip />
+ <!-- no translation found for generic_error_dlg_text (5287861443265795232) -->
+ <skip />
+ <!-- no translation found for uninstall_application_title (4045420072401428123) -->
+ <skip />
+ <!-- no translation found for uninstall_update_title (824411791011583031) -->
+ <skip />
+ <!-- no translation found for uninstall_activity_text (1928194674397770771) -->
+ <skip />
+ <!-- no translation found for uninstall_application_text (3816830743706143980) -->
+ <skip />
+ <!-- no translation found for uninstall_application_text_all_users (575491774380227119) -->
+ <skip />
+ <!-- no translation found for uninstall_application_text_user (498072714173920526) -->
+ <skip />
+ <!-- no translation found for uninstall_update_text (863648314632448705) -->
+ <skip />
+ <!-- no translation found for uninstall_update_text_multiuser (8992883151333057227) -->
+ <skip />
+ <!-- no translation found for uninstalling_notification_channel (840153394325714653) -->
+ <skip />
+ <!-- no translation found for uninstall_failure_notification_channel (1136405866767576588) -->
+ <skip />
+ <!-- no translation found for uninstalling (8709566347688966845) -->
+ <skip />
+ <!-- no translation found for uninstalling_app (8866082646836981397) -->
+ <skip />
+ <!-- no translation found for uninstall_done (439354138387969269) -->
+ <skip />
+ <!-- no translation found for uninstall_done_app (4588850984473605768) -->
+ <skip />
+ <!-- no translation found for uninstall_failed (1847750968168364332) -->
+ <skip />
+ <!-- no translation found for uninstall_failed_app (5506028705017601412) -->
+ <skip />
+ <!-- no translation found for uninstall_failed_device_policy_manager (785293813665540305) -->
+ <skip />
+ <!-- no translation found for uninstall_failed_device_policy_manager_of_user (4813104025494168064) -->
+ <skip />
+ <!-- no translation found for uninstall_all_blocked_profile_owner (2009393666026751501) -->
+ <skip />
+ <!-- no translation found for uninstall_blocked_profile_owner (6373897407002404848) -->
+ <skip />
+ <!-- no translation found for uninstall_blocked_device_owner (6724602931761073901) -->
+ <skip />
+ <!-- no translation found for manage_device_administrators (3092696419363842816) -->
+ <skip />
+ <!-- no translation found for manage_users (1243995386982560813) -->
+ <skip />
+ <!-- no translation found for uninstall_failed_msg (2176744834786696012) -->
+ <skip />
+ <!-- no translation found for Parse_error_dlg_text (1661404001063076789) -->
+ <skip />
+ <!-- no translation found for wear_not_allowed_dlg_title (8664785993465117517) -->
+ <skip />
+ <!-- no translation found for wear_not_allowed_dlg_text (704615521550939237) -->
+ <skip />
+ <!-- no translation found for message_staging (8032722385658438567) -->
+ <skip />
+ <!-- no translation found for app_name_unknown (6881210203354323926) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (6539403649459942547) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (1206648674551321364) -->
+ <skip />
+ <!-- no translation found for untrusted_external_source_warning (7279739265754475165) -->
+ <skip />
+ <!-- no translation found for anonymous_source_warning (2784902545920822500) -->
+ <skip />
+ <!-- no translation found for anonymous_source_warning (3939101621438855516) -->
+ <skip />
+ <!-- no translation found for anonymous_source_warning (5599483539528168566) -->
+ <skip />
+ <!-- no translation found for anonymous_source_continue (4375745439457209366) -->
+ <skip />
+ <!-- no translation found for external_sources_settings (4046964413071713807) -->
+ <skip />
+ <!-- no translation found for wear_app_channel (1960809674709107850) -->
+ <skip />
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"এপ্ ইনষ্টল কৰাৰ জাননী"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
+</resources>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index 2248c6d6a80d..478322a1dfff 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Davam edin"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ayarlar"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear tətbiqləri quraşdırılır/sistemdən silinir"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tətbiq quraşdırma bildirişi"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Quraşdırıldı"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" quraşdırıldı"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index 6cd1f40aa6ea..cab6be5d9902 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Nastavi"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Podešavanja"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instaliranje/deinstaliranje Wear aplikac."</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obaveštenje o instaliranju aplikacije"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Instalirana je"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija „<xliff:g id="APPNAME">%1$s</xliff:g>“ je instalirana"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index d432eb7d0140..4433b73de0b0 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Далей"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Налады"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Усталяванне і выдаленне праграм Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апавяшчэнне пра завяршэнне ўсталявання"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Усталявана"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Усталявана праграма \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml
index a1ae85c763da..2b76bddce579 100644
--- a/packages/PackageInstaller/res/values-bg/strings.xml
+++ b/packages/PackageInstaller/res/values-bg/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Напред"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Настройки"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Инсталир./деинсталир. на прилож. за Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известие, че приложението е инсталирано"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирането бе успешно"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Приложението <xliff:g id="APPNAME">%1$s</xliff:g> бе инсталирано успешно"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index 0afcb817b8c5..ee264d91b944 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -24,11 +24,11 @@
<string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ইনস্টল করা হচ্ছে…"</string>
<string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string>
<string name="install_confirm_question" msgid="8176284075816604590">"আপনি কি এই অ্যাপ্লিকেশনটি ইনস্টল করতে চান?"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"আগে থেকেই আছে এই অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকেই আছে এমন ডেটা মুছে যাবে না।"</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"এই বিল্ট-ইন অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকেই আছে এমন ডেটা মুছে যাবে না।"</string>
+ <string name="install_confirm_question_update" msgid="7942235418781274635">"আগে থেকেই থাকা এই অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string>
+ <string name="install_confirm_question_update_system" msgid="4713001702777910263">"এই বিল্ট-ইন অ্যাপ্লিকেশনটির একটি আপডেট কি আপনি ইনস্টল করতে চান? আপনার আগে থেকে থাকা ডেটা মুছে যাবে না।"</string>
<string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string>
- <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই আছে এমন একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
+ <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
<string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"আপনার ট্যাবলেটের সাথে মানানসই না হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
<string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"এই অ্যাপটি আপনার টিভির সাথে মানানসই নয়।"</string>
<string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"আপনার ফোনের সাথে মানানসই না হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string>
@@ -70,7 +70,7 @@
<string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g>-এর চালু থাকা ডিভাইস অ্যাডমিন অ্যাপটি আনইনস্টল করা যাচ্ছে না"</string>
<string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"কিছু ব্যবহারকারী বা প্রোফাইলের জন্য এই অ্যাপটি প্রয়োজন কিন্তু অন্যদের জন্য এটি আনইনস্টল করা হয়ে গেছে"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"এই অ্যাপটি আপনার প্রোফাইলের জন্য প্রয়োজন বলে এটি আনইনস্টল করা যাবে না।"</string>
- <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"এই অ্যাপটি আপনার ডিভাইস অ্যাডমিনিস্ট্রেটরের জন্য প্রয়োজন বলে এটি আনইনস্টল করা যাবে না।"</string>
+ <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"অ্যাপটি আপনার ডিভাইস অ্যাডমিনিস্ট্রেটরের প্রয়োজন বলে এটি আনইনস্টল করা যাবে না।"</string>
<string name="manage_device_administrators" msgid="3092696419363842816">"ডিভাইস অ্যাডমিন অ্যাপ পরিচালনা করুন"</string>
<string name="manage_users" msgid="1243995386982560813">"ব্যবহারকারীদের পরিচালনা করুন"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> আনইনস্টল করা যায়নি।"</string>
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"চালিয়ে যান"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"সেটিংস"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear অ্যাপ ইনস্টল/আনইনস্টল করা হচ্ছে"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"\'অ্যাপ ইনস্টল করা হয়েছে\' বিজ্ঞপ্তি"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ইনস্টল করা হয়েছে"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ইনস্টল করা হয়েছে"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index 1cb8b372d517..97ba693322e1 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Nastavi"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Postavke"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instaliranje/deinstaliranje Wear aplik."</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavještenje o instaliranoj aplikaciji"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" je uspješno instalirana"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index f9ca13936ef5..a0908081e3cf 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continua"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Configuració"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instal·lant o desinstal·lant apps de Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificació d\'aplicació instal·lada"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"S\'ha instal·lat correctament"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"S\'ha instal·lat <xliff:g id="APPNAME">%1$s</xliff:g> correctament"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index 6f681330dd4e..1e46214b4b0c 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Pokračovat"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Nastavení"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalace/odinstalace aplikací pro Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Oznámení o nainstalované aplikaci"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Úspěšně nainstalováno"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikace <xliff:g id="APPNAME">%1$s</xliff:g> byla úspěšně nainstalována"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index 4b4034190dcf..d35fb9caa6f1 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Fortsæt"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Indstillinger"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installerer/afinstallerer Wear-apps"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Underretning om appinstallation"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Appen er installeret"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" er installeret"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index 27c19b88c1fd..367eb243e1e9 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Weiter"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Einstellungen"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear-Apps installieren/deinstallieren"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Installationsbenachrichtigung für App"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Erfolgreich installiert"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" wurde erfolgreich installiert"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index fea35564d0c6..d179acb0dbb9 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Συνέχεια"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ρυθμίσεις"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Εγκατάσταση/απεγκατάσταση εφαρμογών Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ειδοποίηση εγκατάστασης εφαρμογής"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Εγκαταστάθηκε επιτυχώς"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Η εφαρμογή \"<xliff:g id="APPNAME">%1$s</xliff:g>\" εγκαταστάθηκε επιτυχώς"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml
index ff926ac70c0b..4016288a420d 100644
--- a/packages/PackageInstaller/res/values-en-rAU/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continue"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Settings"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installing/uninstalling Wear apps"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml
index ff926ac70c0b..4016288a420d 100644
--- a/packages/PackageInstaller/res/values-en-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continue"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Settings"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installing/uninstalling Wear apps"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml
index ff926ac70c0b..4016288a420d 100644
--- a/packages/PackageInstaller/res/values-en-rGB/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continue"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Settings"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installing/uninstalling Wear apps"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml
index ff926ac70c0b..4016288a420d 100644
--- a/packages/PackageInstaller/res/values-en-rIN/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continue"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Settings"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installing/uninstalling Wear apps"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml
index 1dc8cee3815a..68332630acff 100644
--- a/packages/PackageInstaller/res/values-en-rXC/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎Continue‎‏‎‎‏‎"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎Settings‎‏‎‎‏‎"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎Installing/uninstalling wear apps‎‏‎‎‏‎"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎App installed notification‎‏‎‎‏‎"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎Successfully installed‎‏‎‎‏‎"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎Successfully installed “‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎”‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 887f380bfe7e..dd45a791040c 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Configuración"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalando/desinstalando apps para Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de app instalada"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Se instaló correctamente"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Se instaló correctamente \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index 26203b039b74..7aef3333c13a 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ajustes"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalando/desinstalando apps para Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de aplicación instalada"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Se ha instalado correctamente"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> se ha instalado correctamente"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index cf9dd568e693..873ac48343ed 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Jätka"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Seaded"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Weari rak. installimine/desinstallimine"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Rakenduse installimise märguanne"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Installimine õnnestus"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Rakenduse „<xliff:g id="APPNAME">%1$s</xliff:g>” installimine õnnestus"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index a73a99c1bbdb..6e79ac86a957 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -54,10 +54,10 @@
<string name="uninstall_update_title" msgid="824411791011583031">"Desinstalatu eguneratzea"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> aplikazio honen zati da:"</string>
<string name="uninstall_application_text" msgid="3816830743706143980">"Aplikazioa desinstalatu nahi duzu?"</string>
- <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Erabiltzaile "<b>"guztiei"</b>" desinstalatu nahi diezu aplikazioa? Aplikazioa eta bere datu guztiak ezabatuko zaizkie gailuko erabiltzaile "<b>"guztiei"</b>"."</string>
+ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Erabiltzaile "<b>"guztiei"</b>" desinstalatu nahi diezu aplikazioa? Aplikazioa eta haren datu guztiak ezabatuko zaizkie gailuko erabiltzaile "<b>"guztiei"</b>"."</string>
<string name="uninstall_application_text_user" msgid="498072714173920526">"<xliff:g id="USERNAME">%1$s</xliff:g> erabiltzaileari desinstalatu nahi diozu aplikazioa?"</string>
<string name="uninstall_update_text" msgid="863648314632448705">"Aplikazio hau jatorrizko bertsioarekin ordeztu nahi duzu? Datu guztiak ezabatuko dira."</string>
- <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Aplikazio hau jatorrizko bertsioarekin ordeztu nahi duzu? Datu guztiak ezabatuko dira. Gailuaren erabiltzaile guztiengan izango du eragina, laneko profilak dituztenengan barne."</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Aplikazio hau jatorrizko bertsioarekin ordeztu nahi duzu? Datu guztiak ezabatuko dira. Gailuaren erabiltzaile guztiengan izango du eragina, laneko profilak dituztenak barne."</string>
<string name="uninstalling_notification_channel" msgid="840153394325714653">"Abian diren desinstalatze-eragiketak"</string>
<string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"Desinstalatu ezin izan direnak"</string>
<string name="uninstalling" msgid="8709566347688966845">"Desinstalatzen…"</string>
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Egin aurrera"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ezarpenak"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear aplikazioak instalatzea/desinstalatzea"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Aplikazioa instalatu izanaren jakinarazpena"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Instalatu da"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Instalatu da \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml
index be685a95a8bd..7a36387c968c 100644
--- a/packages/PackageInstaller/res/values-fa/strings.xml
+++ b/packages/PackageInstaller/res/values-fa/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ادامه"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"تنظیمات"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"نصب/حذف نصب برنامه‌های پوشیدنی"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"اعلان نصب برنامه"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"نصب موفقیت‌آمیز بود"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> باموفقیت نصب شد"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index df73ed77f08d..b73c50b8f370 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Jatka"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Asetukset"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear-sovellusten asennus/poistaminen"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Sovellus asennettu ‑ilmoitus"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Asennus onnistui"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g>: asennus onnistui"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index 809d20c38fab..a6cd289223ee 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuer"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Paramètres"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installer/désinstaller applis Google Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Installation réussie"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Installation de « <xliff:g id="APPNAME">%1$s</xliff:g> » réussie"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index 6bbd7e88a665..d36322ad065c 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuer"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Paramètres"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installer/Désinstaller les applis Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"L\'application a été installée"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"L\'application <xliff:g id="APPNAME">%1$s</xliff:g> a bien été installée"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 4f2841103678..a7b42789cf3a 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Configuración"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalando/desinstalando apps para Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación da aplicación instalada"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Instalouse correctamente"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Instalouse correctamente a aplicación <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index 4aa04d3a21db..66e6fd166a8c 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"આગળ વધો"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"સેટિંગ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"એમ્બેડ ઍપ્લિકેશનો ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ઍપ ઇન્સ્ટૉલ થવાનું નોટિફિકેશન"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index 0a51a0011171..3c6031c92ad8 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"जारी रखें"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"सेटिंग"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear ऐप्लिकेशन इंस्टॉल/अनइंस्टॉल हो रहे हैं"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ऐप्लिकेशन इंस्टॉल होने की सूचना"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"पूरी तरह से इंस्टॉल हो गया है"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” पूरी तरह से इंस्टॉल हो गया है"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml
index 3169f3a42fbf..380df4a67327 100644
--- a/packages/PackageInstaller/res/values-hr/strings.xml
+++ b/packages/PackageInstaller/res/values-hr/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Nastavi"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Postavke"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instaliranje/deinstaliranje Wear apl."</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavijest o instaliranoj aplikaciji"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" uspješno je instalirana"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index 1971ea76369b..9cbff8b831c6 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Tovább"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Beállítások"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear-alkalmazások telepítése/törlése"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Alkalmazás telepítve értesítés"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Sikeresen telepítve"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> alkalmazás sikeresen telepítve"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index 4892ddd0bc71..2e2c8559bff8 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -51,7 +51,7 @@
<string name="generic_error_dlg_title" msgid="5863195085927067752">"Սխալ"</string>
<string name="generic_error_dlg_text" msgid="5287861443265795232">"Չհաջողվեց ապատեղադրել հավելվածը:"</string>
<string name="uninstall_application_title" msgid="4045420072401428123">"Հավելվածի ապատեղադրում"</string>
- <string name="uninstall_update_title" msgid="824411791011583031">"Թարմացման ապատեղադրում"</string>
+ <string name="uninstall_update_title" msgid="824411791011583031">"Ապատեղադրել թարմացումը"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> գործողությունը հետևյալ հավելվածի մասն է`"</string>
<string name="uninstall_application_text" msgid="3816830743706143980">"Ուզո՞ւմ եք ապատեղադրել այս հավելվածը։"</string>
<string name="uninstall_application_text_all_users" msgid="575491774380227119">"Ապատեղադրե՞լ այս հավելվածը "<b>"բոլոր"</b>" օգտատերերի համար: Հավելվածը և դրա տվյալները կհեռացվեն սարքի "<b>"բոլոր"</b>" օգտատերերից:"</string>
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Շարունակել"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Կարգավորումներ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear հավելվածների տեղադրում/ապատեղադրում"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ծանուցում հավելվածի տեղադրման մասին"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Տեղադրվեց"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը տեղադրվեց"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index 212eeb13b223..fadff6148bc5 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Lanjutkan"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Setelan"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Melakukan instal/uninstal aplikasi Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikasi penginstalan aplikasi"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Berhasil diinstal"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Berhasil menginstal “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index 6921b7b38df8..a50714fe3be6 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Áfram"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Stillingar"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Uppsetning/fjarlæging Wear forrita"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tilkynning um uppsett forrit"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Uppsetning tókst"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sett upp"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml
index b44d6ea24d72..5ca7edafb30d 100644
--- a/packages/PackageInstaller/res/values-it/strings.xml
+++ b/packages/PackageInstaller/res/values-it/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continua"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Impostazioni"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installazione/disinstallazione app Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifica relativa alle app installate"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Installata"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"App \"<xliff:g id="APPNAME">%1$s</xliff:g>\" installata"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 573f12a3d7e4..cd94cdaeae9b 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"המשך"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"הגדרות"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"‏מתקין/מסיר התקנה של אפליקציות Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"התראה על התקנת האפליקציה"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"הותקנה בהצלחה"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"האפליקציה \"<xliff:g id="APPNAME">%1$s</xliff:g>\" הותקנה בהצלחה"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 42f1b3f66133..7496016e41ea 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"次へ"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"設定"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wearアプリ インストール/アンインストール"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"アプリのインストールに関する通知"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"インストールしました"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」をインストールしました"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index 4b2ae75067d1..aac14dca4d16 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"გაგრძელება"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"პარამეტრები"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear აპების ინსტალაცია/დეინსტალაცია"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"შეტყობინება აპის ინსტალაციის შესახებ"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"წარმატებით დაინსტალირდა"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ წარმატებით დაინსტალირდა"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index 708411c4a575..a105a005f00f 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Жалғастыру"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Параметрлер"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear қолданбасын орнату/жою"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Қолданба орнатылғаны туралы хабарландыру"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Орнатылды"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнатылды"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index 78b04a01c0aa..ce0db9108813 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"បន្ត"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ការកំណត់"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"ការដំឡើង/ការលុបកម្មវិធីឧបករណ៍​ពាក់​"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ការជូនដំណឹង​អំពីកម្មវិធីដែល​បានដំឡើង"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"បាន​ដំឡើង​ដោយ​ជោគជ័យ​ហើយ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"បាន​ដំឡើង \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ដោយ​ជោគជ័យ​ហើយ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index 5b9698ad1266..4c5373eb010b 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ಮುಂದುವರಿಸಿ"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"wear ಆ್ಯಪ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌/ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ಆ್ಯಪ್ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿರುವ ಕುರಿತು ಅಧಿಸೂಚನೆ"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ಯಶಸ್ವಿಯಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಆಗಿದೆ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ಆ್ಯಪ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 50f81578b8b4..1741b6e813e9 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"계속"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"설정"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear 앱 설치/제거"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"앱 설치 완료 알림"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"설치 완료"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' 설치 완료"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index 94da72f365a3..6b4abb9b898e 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Улантуу"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Жөндөөлөр"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Тагынма колдонмолорду орнотуу/чыгаруу"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Колдонмолорду орноткучтун билдирмелери"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Ийгиликтүү орнотулду"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнотулду"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index dba0dcc83cde..aa55e3cb3200 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ສືບຕໍ່"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ການຕັ້ງຄ່າ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"ການຕິດຕັ້ງ/ຖອນການຕິດຕັ້ງແອັບ Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ການແຈ້ງເຕືອນແອັບທີ່ຕິດຕັ້ງແລ້ວ"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ຕິດຕັ້ງສຳເລັດແລ້ວ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"ຕິດຕັ້ງ \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ສຳເລັດແລ້ວ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml
index 73b0bff0d46f..aec94c49825f 100644
--- a/packages/PackageInstaller/res/values-lt/strings.xml
+++ b/packages/PackageInstaller/res/values-lt/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Tęsti"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Nustatymai"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Įdiegiamos / pašalinamos „Wear“ program."</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pranešimas apie įdiegtą programą"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Sėkmingai įdiegta"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sėkmingai įdiegta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index d51a0aa07e21..76840cb35ea4 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Tālāk"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Iestatījumi"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear lietotņu instalēšana/atinstalēšana"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Paziņojums par instalētu lietotni"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Sekmīgi instalēta"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Lietotne “<xliff:g id="APPNAME">%1$s</xliff:g>” sekmīgi instalēta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index 4dd948bd2da0..998850eb76ac 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Продолжи"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Поставки"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Се инсталираат/деинсталираат аплик. Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известување за инсталирана апликација"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Успешно инсталирана"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> е успешно инсталирана"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index bb0d39cfb343..d2dbdcfef36f 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"തുടരുക"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ക്രമീകരണം"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear ആപ്പ് ഇൻസ്‌റ്റാൾ/അൺ ഇൻസ്‌റ്റാൾ ചെയ്യുന്നു"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്‌ത അറിയിപ്പ്"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ഇൻസ്‌റ്റാൾ ചെയ്‌തു"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ഇൻസ്‌റ്റാൾ ചെയ്‌തു"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index 5b9373625092..56a2128499f2 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Үргэлжлүүлэх"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Тохиргоо"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear аппуудыг суулгаж/устгаж байна"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апп суулгасны мэдэгдэл"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Амжилттай суулгасан"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”-г амжилттай суулгасан"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index 5bbf7b9c5cfe..d751c42a2df7 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"सुरू ठेवा"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"सेटिंग्ज"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"wear अ‍ॅप्स इंस्टॉल/अनइंस्टॉल करत आहे"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"अॅप इंस्टॉल सूचना"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"यशस्वीरित्या इंस्टॉल केले"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" यशस्वीरित्या इंस्टॉल झाले"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index 620dc3ff3258..674f55b86b38 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Teruskan"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Tetapan"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Memasang/menyahpasang apl wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pemberitahuan apl dipasang"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Berjaya dipasang"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Berjaya memasang \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index c115cad39444..9c9295712b25 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ရှေ့ဆက်ရန်"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ဆက်တင်များ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"wear အက်ပ်ကိုထည့်သွင်းခြင်း/ဖယ်ရှားခြင်း"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"အက်ပ်ထည့်သွင်းခြင်း အကြောင်းကြားချက်"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ထည့်သွင်းပြီးပြီ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ကို ထည့်သွင်းပြီးပြီ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index f39bf2da56c1..0d3384eac5a0 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Fortsett"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Innstillinger"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Installerer/avinstallerer Wear-apper"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Varsel om at appen er installert"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Installert"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» er installert"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index 4d17a3e18d52..a7abc17f538d 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"जारी राख्नुहोस्"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"सेटिङहरू"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"वेयर एपहरूको स्थापना/स्थापना रद्द गर्दै"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"अनुप्रयोगको स्थापना गरिएको सूचना"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"सफलतापूर्वक स्थापना गरियो"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” सफलतापूर्वक स्थापना गरियो"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index 39fb8f0ed95c..a7a5a34b2e3a 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Doorgaan"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Instellingen"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear-apps installeren/verwijderen"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Melding dat app is geïnstalleerd"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Installatie voltooid"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' is geïnstalleerd"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
new file mode 100644
index 000000000000..348cc6109fa4
--- /dev/null
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7488448184431507488">"ପ୍ୟାକେଜ୍‌ ଇନଷ୍ଟଲର୍‍"</string>
+ <string name="install" msgid="711829760615509273">"ଇନଷ୍ଟଲ୍‍ କରନ୍ତୁ"</string>
+ <string name="done" msgid="6632441120016885253">"ହୋଇଗଲା"</string>
+ <string name="cancel" msgid="1018267193425558088">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
+ <string name="installing" msgid="4921993079741206516">"ଇନଷ୍ଟଲ୍‌ କରାଯାଉଛି…"</string>
+ <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଇନଷ୍ଟଲ୍‌ କରାଯାଉଛି…"</string>
+ <string name="install_done" msgid="5987363587661783896">"ଆପ୍‍ ଇନଷ୍ଟଲ୍‌ ହୋଇଗଲା।"</string>
+ <string name="install_confirm_question" msgid="8176284075816604590">"ଆପଣ ଏହି ଆପ୍ଲିକେଶନ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି?"</string>
+ <string name="install_confirm_question_update" msgid="7942235418781274635">"ପୂର୍ବରୁ ରହିଥିବା ଏହି ଆପ୍ଲିକେଶନ୍‌ରେ ଆପଣ ଅପ୍‌ଡେଟ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string>
+ <string name="install_confirm_question_update_system" msgid="4713001702777910263">"ଏହି ବିଲ୍ଟ-ଇନ୍ ଆପ୍ଲିକେଶନ୍‌ରେ ଆପଣ ଏକ ଅପ୍‌ଡେଟ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି? ନିଜର ବିଦ୍ୟମାନ ଡାଟାକୁ ଆପଣ ହରାଇବେ ନାହିଁ।"</string>
+ <string name="install_failed" msgid="5777824004474125469">"ଆପ୍‍ ଇନଷ୍ଟଲ୍‌ ହୋଇନାହିଁ।"</string>
+ <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍‌କୁ ଇନଷ୍ଟଲ୍‍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string>
+ <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍‍ ସହ ଏହି ପ୍ୟାକେଜ୍‌ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ ହୋଇପାରିଲା ନାହିଁ।"</string>
+ <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"ଆପ୍‍ ଆପଣଙ୍କ ଟାବଲେଟ୍‌ ସହ କମ୍ପାଟିବଲ୍‍ ନଥିବା ହେତୁ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ ହୋଇପାରିଲା ନାହିଁ।"</string>
+ <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"ଏହି ଆପ୍‍ ଆପଣଙ୍କ ଟିଭି ସହ କମ୍ପାଟିବଲ୍‍ ନୁହେଁ।"</string>
+ <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"ଆପ୍‍ ଆପଣଙ୍କ ଫୋନ୍‌ ସହ କମ୍ପାଟିବଲ୍‍ ନଥିବା ହେତୁ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ ହୋଇପାରିଲା ନାହିଁ।"</string>
+ <string name="install_failed_invalid_apk" msgid="8581007676422623930">"ପ୍ୟାକେଜ୍‍ ଅମାନ୍ୟ ଥିବା ପରି ଜଣାପଡ଼ିବାରୁ ଆପ୍‍ ଇନ୍‌ଷ୍ଟଲ୍‍ ହୋଇପାରିଲା ନାହିଁ।"</string>
+ <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଟାବଲେଟ୍‍ରେ ଇନ୍‌ଷ୍ଟଲ୍‌ କରିହେଲା ନାହିଁ।"</string>
+ <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଟିଭିରେ ଇନ୍‌ଷ୍ଟଲ୍‍ କରିହେଲା ନାହିଁ।"</string>
+ <string name="install_failed_msg" product="default" msgid="6484461562647915707">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଫୋନ୍‌ରେ ଇନ୍‌ଷ୍ଟଲ୍‌ କରିହେଲା ନାହିଁ।"</string>
+ <string name="launch" msgid="3952550563999890101">"ଖୋଲନ୍ତୁ"</string>
+ <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"ଅଜଣା ସୋର୍ସରୁ ଆସିଥିବା ଆପଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍‌ କରିବାକୁ ଆପଣଙ୍କ ଆଡମିନ୍‍ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
+ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"ଏହି ୟୁଜରଙ୍କ ଦ୍ୱାରା ଅଜଣା ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"ଏହି ୟୁଜର୍‌ ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିପାରିବେ ନାହିଁ"</string>
+ <string name="ok" msgid="7871959885003339302">"ଠିକ୍ ଅଛି"</string>
+ <string name="manage_applications" msgid="5400164782453975580">"ଆପ୍‌ଗୁଡ଼ିକର ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="out_of_space_dlg_title" msgid="4156690013884649502">"ଆଉ ସ୍ଥାନ ନାହିଁ"</string>
+ <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଇନଷ୍ଟଲ୍‌ କରାଯାଇପାରିଲା ନାହିଁ। କିଛି ସ୍ଥାନ ଖାଲିକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="app_not_found_dlg_title" msgid="5107924008597470285">"ଆପ୍‍ ମିଳିଲା ନାହିଁ"</string>
+ <string name="app_not_found_dlg_text" msgid="5219983779377811611">"ଇନଷ୍ଟଲ୍‌ କରାଯାଇଥିବା ଆପ୍‍ ତାଲିକାରେ ଆପ୍‍ଟି ମିଳିଲା ନାହିଁ।"</string>
+ <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"ଅନୁମତି ନାହିଁ"</string>
+ <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"ଏହି ଅନଇନଷ୍ଟଲେଶନ୍‍ କରିବାକୁ ବର୍ତ୍ତମାନର ୟୁଜରଙ୍କୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
+ <string name="generic_error_dlg_title" msgid="5863195085927067752">"ତ୍ରୁଟି"</string>
+ <string name="generic_error_dlg_text" msgid="5287861443265795232">"ଆପ୍‌କୁ ଅନଇନଷ୍ଟଲ୍‍ କରାହେବ ନାହିଁ"</string>
+ <string name="uninstall_application_title" msgid="4045420072401428123">"ଆପ୍‌କୁ ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="uninstall_update_title" msgid="824411791011583031">"ଅପଡେଟ୍‍ ଅନଇନଷ୍ଟଲ୍‌ କରନ୍ତୁ"</string>
+ <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> ହେଉଛି ନିମ୍ନ ଆପ୍‍ର ଏକ ଅଂଶ।"</string>
+ <string name="uninstall_application_text" msgid="3816830743706143980">"ଆପଣ ଏହି ଆପ୍‍ ଅନଇନଷ୍ଟଲ୍‌ କରିବାକୁ ଚାହାଁନ୍ତି କି?"</string>
+ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"ଆପଣ "<b>"ସମସ୍ତ"</b>" ୟୁଜର୍‌ଙ୍କ ପାଇଁ ଏହି ଆପ୍‌କୁ ଅନଷ୍ଟଲ୍‍ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ଡିଭାଇସ୍‌ରେ ଥିବା "<b>"ସମସ୍ତ"</b>" ୟୁଜର୍‌ ଆପ୍ଲିକେଶନ୍‍ ଏବଂ ତାହାର ଡାଟା ବାହାର କରିଦିଆଯିବ।"</string>
+ <string name="uninstall_application_text_user" msgid="498072714173920526">"ୟୁଜର୍‌ <xliff:g id="USERNAME">%1$s</xliff:g>ଙ୍କ ପାଇଁ ଆପଣ ଏହି ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିବେ କି?"</string>
+ <string name="uninstall_update_text" msgid="863648314632448705">"ଏହି ଆପ୍‍ ଫ୍ୟାକ୍ଟୋରୀ ଭର୍ସନ୍‍‍ ସହ ବଦଳାଇବେ? ସମସ୍ତ ଡାଟା କାଢ଼ିଦିଆଯିବ।"</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"ଏହି ଆପ୍‍ ଫ୍ୟାକ୍ଟୋରୀ ଭର୍ସନ୍‍‍ ସହ ବଦଳାଇବେ? ସମସ୍ତ ଡାଟା ବାହାର କରିଦିଆଯିବ। ୱର୍କ ପ୍ରୋଫାଇଲ୍‍ ଥିବା ସମେତ, ଏହାଦ୍ୱାରା ଡିଭାଇସରେ ଥିବା ସମସ୍ତ ୟୁଜର୍‌ ପ୍ରଭାବିତ ହେବେ।"</string>
+ <string name="uninstalling_notification_channel" msgid="840153394325714653">"ଅନଇନଷ୍ଟଲ୍‌ ଚାଲୁଛି"</string>
+ <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"ବିଫଳ ହୋଇଥିବା ଅନଇନଷ୍ଟଲ୍‌"</string>
+ <string name="uninstalling" msgid="8709566347688966845">"ଅନ୍‌ଇନଷ୍ଟଲ୍‌ କରାଯାଉଛି…"</string>
+ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଅନଇନଷ୍ଟଲ୍‍ କରାଯାଉଛି…"</string>
+ <string name="uninstall_done" msgid="439354138387969269">"ଅନଇନଷ୍ଟଲ୍‌ ହୋଇଗଲା।"</string>
+ <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>କୁ ଅନଇନଷ୍ଟଲ୍‌ କରାଗଲା"</string>
+ <string name="uninstall_failed" msgid="1847750968168364332">"ଅନଇନଷ୍ଟଲ୍‌ କରିହେଲା ନାହିଁ।"</string>
+ <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଅନଇନଷ୍ଟଲ୍‍ କରିବା ସଫଳ ହେଲାନାହିଁ।"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"ସକ୍ରିୟ ଡିଭାଇସ୍‍ ଆପ୍‍ ଅନଇନଷ୍ଟଲ୍‌ କରିହେବ ନାହିଁ"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g>ଙ୍କ ପାଇଁ ସକ୍ରିୟ ଡିଭାଇସ୍‍ ଆଡମିନ୍‍ ଆପ୍‍ ଅନଇନଷ୍ଟଲ୍‍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"କିଛି ୟୁଜର୍‌ କିମ୍ବା ପ୍ରୋଫାଇଲ୍‍ ପାଇଁ ଏହି ଆପ୍‍ ଆବଶ୍ୟକ ଏବଂ ଅନ୍ୟ ସମସ୍ତଙ୍କ ପାଇଁ ଅନଇନଷ୍ଟଲ୍‍ କରାଯାଇଥିଲା"</string>
+ <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"ଏହି ଆପ୍‍ ଆପଣଙ୍କ ପ୍ରୋଫାଇଲ୍‍ ପାଇଁ ଆବଶ୍ୟକ ଅଟେ ଏବଂ ଅନଇନଷ୍ଟଲ୍‍ କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"ଆପଣଙ୍କ ଡିଭାଇସ୍‍ ଆଡମିନିଷ୍ଟ୍ରେଟର୍‍ ଦ୍ୱାରା ଏହି ଆପ୍‍ ଆବଶ୍ୟକ କରାଯାଇଥାଏ ଏବଂ ଏହାକୁ ଅନ୍‍ଇନଷ୍ଟଲ୍‍ କରିହେବ ନାହିଁ।"</string>
+ <string name="manage_device_administrators" msgid="3092696419363842816">"ଡିଭାଇସ୍‌ ଆଡମିନ୍‌ ଆପ୍‌ ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="manage_users" msgid="1243995386982560813">"ୟୁଜର୍‌ଙ୍କୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଅନଇନଷ୍ଟଲ୍‍ କରିହେଲା ନାହିଁ।"</string>
+ <string name="Parse_error_dlg_text" msgid="1661404001063076789">"ଏହି ପ୍ୟାକେଜ୍‍ ପାର୍ସ କରିବାରେ ସମସ୍ୟା ଥିଲା।"</string>
+ <string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string>
+ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"ୱିଅର୍‌ରେ ଇନଷ୍ଟଲ୍‍/ଅନଇନଷ୍ଟଲ୍‍ କାର୍ଯ୍ୟ ସପୋର୍ଟ କରେନାହିଁ।"</string>
+ <string name="message_staging" msgid="8032722385658438567">"ଆପ୍‍ ପର୍ଯ୍ୟାୟଭୁକ୍ତ କରାଯାଉଛି…"</string>
+ <string name="app_name_unknown" msgid="6881210203354323926">"ଅଜଣା"</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟାବ୍‌ଲେଟ୍‌କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଟିଭିକୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଆପଣଙ୍କ ଫୋନ୍‌କୁ ଏହି ସୋର୍ସରୁ ଆସିଥିବା ଅଜଣା ଆପ୍‍ ଇନଷ୍ଟଲ୍‍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"ଅଜଣା ଆପ୍‌ ଦ୍ୱାରା ଆପଣଙ୍କ ଫୋନ୍‍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍‌କୁ ଇନଷ୍ଟଲ୍‌ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଫୋନ୍‌ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"ଅଜଣା ଆପ୍‌ ଦ୍ୱାରା ଆପଣଙ୍କ ଟାବଲେଟ୍‍ ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍‌କୁ ଇନଷ୍ଟଲ୍‌ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟାବ୍‌ଲେଟ୍‌ରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"ଅଜଣା ଆପ୍‌ ଦ୍ୱାରା ଆପଣଙ୍କ ଟିଭି ଏବଂ ବ୍ୟକ୍ତିଗତ ଡାଟାକୁ ନଷ୍ଟ କରାଯାଇପାରିବାର ସମ୍ଭାବନା ବହୁତ ଅଧିକ। ଏହି ଆପ୍‌କୁ ଇନଷ୍ଟଲ୍‌ କରିବାର ଅର୍ଥ ହେଉଛି ଆପଣଙ୍କ ଟିଭିରେ ଘଟିବା କୌଣସି ପ୍ରକାର କ୍ଷତି କିମ୍ବା ସେଗୁଡ଼ିକର ବ୍ୟବହାରରୁ ହେବା କୌଣସି ପ୍ରକାର ଡାଟାର ହାନୀ ପାଇଁ ଆପଣ ଦାୟୀ ରହିବାକୁ ରାଜି ହୁଅନ୍ତି।"</string>
+ <string name="anonymous_source_continue" msgid="4375745439457209366">"ଜାରି ରଖନ୍ତୁ"</string>
+ <string name="external_sources_settings" msgid="4046964413071713807">"ସେଟିଙ୍ଗ"</string>
+ <string name="wear_app_channel" msgid="1960809674709107850">"ୱିଅର୍‍ ଆପ୍‍ ଇନଷ୍ଟଲ୍‌/ଅନଇନଷ୍ଟଲ୍‍ କରାଯାଉଛି"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ଆପ୍ ଇନ୍‌ଷ୍ଟଲ୍‌ କରାଯାଇଥିବା ବିଜ୍ଞପ୍ତି"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ସଫଳତାପୂର୍ବକ ଇନ୍‌ଷ୍ଟଲ୍‌ କରାଗଲା"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” ସଫଳତାପୂର୍ବକ ଇନ୍‌ଷ୍ଚଲ୍ କରାଗଲା"</string>
+</resources>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index 6a1d7eb091e6..7c519a036e04 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ਜਾਰੀ ਰੱਖੋ"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"ਸੈਟਿੰਗਾਂ"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"ਵੀਅਰ ਐਪਾਂ ਸਥਾਪਤ ਜਾਂ ਅਣਸਥਾਪਤ ਕਰਨਾ"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ਐਪ ਸਥਾਪਨਾ ਦੀ ਸੂਚਨਾ"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤੀ ਗਈ"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index 01b2db991356..19b05a928e34 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Dalej"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ustawienia"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalacja/usuwanie aplikacji na Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Powiadomienie o zainstalowaniu aplikacji"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Zainstalowano"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Zainstalowano aplikację „<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index 47289f92975d..1a318374e2dc 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Configurações"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalando/desinstalando apps do Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index 871b0a17d0a1..d45dc1cfd49b 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Definições"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalar/desinstalar aplicações Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de aplicação instalada"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Aplicação instalada com êxito"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplicação \"<xliff:g id="APPNAME">%1$s</xliff:g>\" instalada com êxito"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index 47289f92975d..1a318374e2dc 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Configurações"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalando/desinstalando apps do Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index 43b0dead3341..8bcc96919580 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Continuați"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Setări"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Se (dez)instalează aplicațiile Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificare de aplicație instalată"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Aplicația a fost instalată"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>” a fost instalată"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index 63287f446232..4e5d1ac0d72f 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Продолжить"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Настройки"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Установка/удаление прилож. для Wear OS"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Уведомление об установке приложения"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" установлено"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index 2e926afb26f0..7d854dc41bca 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ඉදිරියට යන්න"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"සැකසීම්"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear යෙදුම් ස්ථාපනය/අස්ථාපනය කරමින්"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"යෙදුම් ස්ථාපනය කළ දැනුම්දීම"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"සාර්ථකව ස්ථාපනය කරන ලදී"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" සාර්ථකව ස්ථාපනය කරන ලදි"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index f8e1e019848c..36614bcc41c3 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Pokračovať"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Nastavenia"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Inštalácia/odinštalovanie aplikácií Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Upozornenie na inštaláciu aplikácie"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Úspešne nainštalovaná"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikácia <xliff:g id="APPNAME">%1$s</xliff:g> bola nainštalovaná"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index d67edd503a6f..a679e089d188 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Naprej"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Nastavitve"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Nameščanje/odstranjev. aplikacij za Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obvestilo o namestitvi aplikacije"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Uspešno nameščeno"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Uspešno nameščeno: »<xliff:g id="APPNAME">%1$s</xliff:g>«"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index 7c0665625f6b..dd35024c7b37 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Vazhdo"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Cilësimet"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Instalimi/çinstalimi i aplikacioneve të Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Njoftimi për aplikacionin e instaluar"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"U instalua me sukses"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” u instalua me sukses"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 9ff859a16453..c25b8e0fd422 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Настави"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Подешавања"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Инсталирање/деинсталирање Wear апликац."</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Обавештење о инсталирању апликације"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирана је"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Апликација „<xliff:g id="APPNAME">%1$s</xliff:g>“ је инсталирана"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index 43c2aadba049..0c66b53cf987 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Fortsätt"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Inställningar"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear-appar installeras/avinstalleras"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Avisering om installerad app"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Appen har installerats"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> har installerats"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index 1c07291a6269..4557f662bec4 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Endelea"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Mipangilio"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Inasakinisha/inaondoa programu za Android Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Arifa ya kusakinishwa kwa programu"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Imesakinishwa"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> imesakinishwa"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index c067bd29f093..dab459a35606 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -29,9 +29,9 @@
<string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string>
- <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"ஆப்ஸ் உங்கள் டேப்லெட்டுடன் இணக்கமற்றதாக உள்ளதால் நிறுவப்படவில்லை."</string>
- <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"இந்த ஆப்ஸ் உங்கள் டிவியுடன் இணக்கமற்றதாக உள்ளது."</string>
- <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"ஆப்ஸ் உங்கள் மொபைலுடன் இணக்கமற்றதாக உள்ளதால் நிறுவப்படவில்லை."</string>
+ <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"ஆப்ஸ் உங்கள் டேப்லெட்டில் இயங்குமாறு இல்லாததால் நிறுவப்படவில்லை."</string>
+ <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"இந்த ஆப்ஸ் உங்கள் டிவியில் இயங்காது."</string>
+ <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"ஆப்ஸ் உங்கள் மொபைலில் இயங்குமாறு இல்லாததால் நிறுவப்படவில்லை."</string>
<string name="install_failed_invalid_apk" msgid="8581007676422623930">"இந்தத் தொகுப்பு செல்லாததுபோல் இருப்பதால் ஆப்ஸ் நிறுவப்படவில்லை."</string>
<string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை உங்கள் டேப்லெட்டில் நிறுவ இயலவில்லை."</string>
<string name="install_failed_msg" product="tv" msgid="1920009940048975221">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை உங்கள் டிவியில் நிறுவ இயலவில்லை."</string>
@@ -51,7 +51,7 @@
<string name="generic_error_dlg_title" msgid="5863195085927067752">"பிழை"</string>
<string name="generic_error_dlg_text" msgid="5287861443265795232">"ஆப்ஸை நிறுவல் நீக்க இயலவில்லை."</string>
<string name="uninstall_application_title" msgid="4045420072401428123">"ஆப்ஸை நிறுவல் நீக்குதல்"</string>
- <string name="uninstall_update_title" msgid="824411791011583031">"புதுப்பிப்பை நிறுவல் நீக்கு"</string>
+ <string name="uninstall_update_title" msgid="824411791011583031">"புதுப்பிப்பை நிறுவல் நீக்குதல்"</string>
<string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> என்பது பின்வரும் ஆப்ஸின் பகுதியாகும்:"</string>
<string name="uninstall_application_text" msgid="3816830743706143980">"இந்த ஆப்ஸை நிறுவல் நீக்க விரும்புகிறீர்களா?"</string>
<string name="uninstall_application_text_all_users" msgid="575491774380227119">"இந்த ஆப்ஸை "<b>"அனைத்துப்"</b>" பயனர்களுக்கும் நிறுவல் நீக்க விரும்புகிறீர்களா? ஆப்ஸும் அதன் தரவும் சாதனத்திலுள்ள "<b>"அனைத்துப்"</b>" பயனர்களிடமிருந்தும் அகற்றப்படும்."</string>
@@ -68,24 +68,27 @@
<string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ஐ நிறுவல் நீக்குவதில் தோல்வி."</string>
<string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"செயலிலுள்ள \'சாதன நிர்வாகி ஆப்ஸை\' நிறுவல் நீக்க இயலாது"</string>
<string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> என்பவருக்குச் \'செயலிலுள்ள சாதன நிர்வாகி ஆப்ஸை’ நிறுவல் நீக்க இயலாது"</string>
- <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"இந்த ஆப்ஸ் சில பயனர்களுக்கோ சுயவிவரங்களுக்கோ தேவைப்படுகிறது. மற்றவர்களுக்கு இது நிறுவல் நீக்கப்பட்டது"</string>
- <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"உங்கள் சுயவிவரத்திற்கு இந்த ஆப்ஸ் தேவைப்படுவதால் இதை நிறுவல் நீக்க இயலாது."</string>
+ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"இந்த ஆப்ஸ் சில பயனர்களுக்கோ கணக்குகளுக்கோ தேவைப்படுகிறது. மற்றவர்களுக்கு இது நிறுவல் நீக்கப்பட்டது"</string>
+ <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"உங்கள் கணக்கிற்கு இந்த ஆப்ஸ் தேவைப்படுவதால் இதை நிறுவல் நீக்க இயலாது."</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"உங்கள் சாதன நிர்வாகிக்கு இந்த ஆப்ஸ் தேவைப்படுவதால் இதை நிறுவல் நீக்க இயலாது."</string>
<string name="manage_device_administrators" msgid="3092696419363842816">"’சாதன நிர்வாகி ஆப்ஸை’ நிர்வகி"</string>
<string name="manage_users" msgid="1243995386982560813">"\'பயனர்களை\' நிர்வகி"</string>
<string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை நிறுவல் நீக்க இயலவில்லை."</string>
<string name="Parse_error_dlg_text" msgid="1661404001063076789">"தொகுப்பைப் பாகுபடுத்திப் பார்ப்பதில் சிக்கல் ஏற்பட்டது."</string>
<string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"நிறுவல்கள்/நிறுவல் நீக்கங்கள் Wearரில் செய்ய இயலாது"</string>
+ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"Wearரில் நிறுவல்கள்/நிறுவல் நீக்கங்கள் செய்ய இயலாது"</string>
<string name="message_staging" msgid="8032722385658438567">"ஆப்ஸ் தயாராகிறது…"</string>
<string name="app_name_unknown" msgid="6881210203354323926">"அறியப்படாதது"</string>
- <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"உங்கள் சாதனத்தின் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டேப்லெட்டில் நிறுவ அனுமதியில்லை."</string>
- <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"உங்கள் சாதனத்தின் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டிவியில் நிறுவ அனுமதியில்லை."</string>
- <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"உங்கள் சாதனத்தின் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை மொபைலில் நிறுவ அனுமதியில்லை."</string>
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"அறியப்படாத ஆப்ஸால் உங்கள் மொபைலும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகும். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது மொபைலில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
- <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"அறியப்படாத ஆப்ஸால் உங்கள் டேப்லெட்டும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகும். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டேப்லெட்டில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
- <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"அறியப்படாத ஆப்ஸால் உங்கள் டிவியும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகும். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டிவியில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டேப்லெட்டில் நிறுவ அனுமதியில்லை."</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை டிவியில் நிறுவ அனுமதியில்லை."</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"உங்கள் பாதுகாப்பிற்காக, இந்த மூலத்திலிருந்து பெற்ற அறியப்படாத ஆப்ஸை மொபைலில் நிறுவ அனுமதியில்லை."</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"அறியப்படாத ஆப்ஸால் உங்கள் மொபைலும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது மொபைலில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"அறியப்படாத ஆப்ஸால் உங்கள் டேப்லெட்டும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டேப்லெட்டில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"அறியப்படாத ஆப்ஸால் உங்கள் டிவியும் தனிப்பட்ட தரவும் மிக எளிதாகப் பாதிப்புக்குள்ளாகலாம். இந்த ஆப்ஸை நிறுவுவதன் மூலம், இதைப் பயன்படுத்தும்போது டிவியில் ஏதேனும் சிக்கல் ஏற்பட்டாலோ உங்களது தரவை இழந்தாலோ அதற்கு நீங்களே பொறுப்பாவீர்கள் என்பதை ஏற்கிறீர்கள்."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"தொடர்க"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"அமைப்புகள்"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear ஆப்ஸை நிறுவுதல்/நிறுவல் நீக்குதல்"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ஆப்ஸ் நிறுவப்பட்டது குறித்த அறிவிப்பு"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"வெற்றிகரமாக நிறுவப்பட்டது"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" வெற்றிகரமாக நிறுவப்பட்டது"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index fd0a63f6befe..64c5da7ef36d 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"కొనసాగించు"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"సెట్టింగ్‌లు"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear యాప్‌లను ఇన్‌స్టాల్/అన్‌ఇన్‌స్టాల్ చేస్తోంది"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"యాప్ ఇన్‌స్టాల్ చేయబడిందనే నోటిఫికేషన్"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"విజయవంతంగా ఇన్‌స్టాల్ చేయబడింది"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” విజయవంతంగా ఇన్‌స్టాల్ చేయబడింది"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index a1f537f5bbe2..b6595d0bd0c7 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"ดำเนินการต่อ"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"การตั้งค่า"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"กำลังติดตั้ง/ถอนการติดตั้งแอป Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"การแจ้งเตือนว่าติดตั้งแอปแล้ว"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"ติดตั้งเรียบร้อยแล้ว"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"ติดตั้ง “<xliff:g id="APPNAME">%1$s</xliff:g>” สำเร็จแล้ว"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index eace11e4e748..e7b15fa2688f 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Magpatuloy"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Mga Setting"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Ini-install/ina-uninstall ang wear app"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification na na-install ang app"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Matagumpay na na-install"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Matagumpay na na-install ang “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml
index 99575e0057e1..33dbc3a9161d 100644
--- a/packages/PackageInstaller/res/values-tr/strings.xml
+++ b/packages/PackageInstaller/res/values-tr/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Devam"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ayarlar"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear uygulamalarını yükleme/kaldırma"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Uygulama yükleme bildirimi"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Başarıyla yüklendi"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" başarıyla yüklendi"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index b3bebf11d61d..d9cb954786a8 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Продовжити"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Налаштування"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Встановлення або видалення додатків Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Сповіщення: додаток установлено"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Додаток <xliff:g id="APPNAME">%1$s</xliff:g> установлено"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
new file mode 100644
index 000000000000..61b15790c3d9
--- /dev/null
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7488448184431507488">"پیکیج انسٹالر"</string>
+ <string name="install" msgid="711829760615509273">"انسٹال کریں"</string>
+ <string name="done" msgid="6632441120016885253">"ہو گیا"</string>
+ <string name="cancel" msgid="1018267193425558088">"منسوخ کریں"</string>
+ <string name="installing" msgid="4921993079741206516">"انسٹال ہو رہی ہے…"</string>
+ <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کو انسٹال کیا جا رہا ہے…"</string>
+ <string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string>
+ <string name="install_confirm_question" msgid="8176284075816604590">"کیا آپ یہ ایپلیکیشن انسٹال کرنا چاہتے ہیں؟"</string>
+ <string name="install_confirm_question_update" msgid="7942235418781274635">"کیا آپ اس موجودہ ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string>
+ <string name="install_confirm_question_update_system" msgid="4713001702777910263">"کیا آپ پہلے سے شامل اس ایپلیکیشن میں ایک اپ ڈیٹ انسٹال کرنا چاہتے ہیں؟ آپ کا موجودہ ڈیٹا ضائع نہیں ہوگا۔"</string>
+ <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string>
+ <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string>
+ <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string>
+ <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"ایپ انسٹال نہیں ہوئی کیونکہ ایپ آپ کے ٹیبلیٹ کے ساتھ مطابقت پذیر نہیں ہے۔"</string>
+ <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"‏یہ ایپ آپ کے TV کے ساتھ مطابقت پذیر نہیں ہے۔"</string>
+ <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"ایپ انسٹال نہیں ہوئی کیونکہ ایپ آپ کے فون کے ساتھ مطابقت پذیر نہیں ہے۔"</string>
+ <string name="install_failed_invalid_apk" msgid="8581007676422623930">"ایپ انسٹال نہیں ہوئی کیونکہ پیکیج غلط معلوم ہوتا ہے۔"</string>
+ <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو آپ کے ٹیبلیٹ پر انسٹال نہیں کیا جا سکا۔"</string>
+ <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"‏<xliff:g id="APP_NAME">%1$s</xliff:g> کو آپ کے TV پر انسٹال نہیں کیا جا سکا۔"</string>
+ <string name="install_failed_msg" product="default" msgid="6484461562647915707">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو آپ کے فون پر انسٹال نہیں کیا جا سکا۔"</string>
+ <string name="launch" msgid="3952550563999890101">"کھولیں"</string>
+ <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"آپ کا منتظم نامعلوم ذرائع سے حاصل شدہ ایپس کو انسٹال کرنے کی اجازت نہیں دیتا ہے"</string>
+ <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"یہ صارف نامعلوم ایپس کو انسٹال نہیں کر سکتا"</string>
+ <string name="install_apps_user_restriction_dlg_text" msgid="2154119597001074022">"اس صارف کو ایپس انسٹال کرنے کی اجازت نہیں ہے"</string>
+ <string name="ok" msgid="7871959885003339302">"ٹھیک ہے"</string>
+ <string name="manage_applications" msgid="5400164782453975580">"ایپس منظم کریں"</string>
+ <string name="out_of_space_dlg_title" msgid="4156690013884649502">"جگہ نہیں ہے"</string>
+ <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو انسٹال نہیں کیا جا سکا۔ کچھ جگہ خالی کریں اور دوبارہ کوشش کریں۔"</string>
+ <string name="app_not_found_dlg_title" msgid="5107924008597470285">"ایپ نہیں ملی"</string>
+ <string name="app_not_found_dlg_text" msgid="5219983779377811611">"ایپ انسٹال کردہ ایپس کی فہرست میں نہیں ملی۔"</string>
+ <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"اجازت نہیں ہے"</string>
+ <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"موجودہ صارف کو اس اَن انسٹالیشن کو انجام دینے کی اجازت نہیں ہے۔"</string>
+ <string name="generic_error_dlg_title" msgid="5863195085927067752">"خرابی"</string>
+ <string name="generic_error_dlg_text" msgid="5287861443265795232">"ایپ اَن انسٹال نہیں ہو سکی۔"</string>
+ <string name="uninstall_application_title" msgid="4045420072401428123">"ایپ کو اَن انسٹال کریں"</string>
+ <string name="uninstall_update_title" msgid="824411791011583031">"اپ ڈیٹ اَن انسٹال کریں"</string>
+ <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> درج ذیل ایپ کا حصہ ہے:"</string>
+ <string name="uninstall_application_text" msgid="3816830743706143980">"کیا آپ اس ایپ کو اَن انسٹال کرنا چاہتے ہیں؟"</string>
+ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"کیا آپ "<b>"سبھی"</b>" صارفین کیلئے اس ایپ کو اَن انسٹال کرنا چاہتے ہیں؟ ایپلیکیشن اور اس کا ڈیٹا آلہ پر موجود "<b>"سبھی"</b>" صارفین سے ہٹا دیا جائے گا۔"</string>
+ <string name="uninstall_application_text_user" msgid="498072714173920526">"کیا آپ اس ایپ کو صارف <xliff:g id="USERNAME">%1$s</xliff:g> کیلئے اَن انسٹال کرنا چاہتے ہیں؟"</string>
+ <string name="uninstall_update_text" msgid="863648314632448705">"اس ایپ کو فیکٹری ورژن سے تبدیل کریں؟ تمام ڈیٹا ہٹا دیا جائے گا۔"</string>
+ <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"اس ایپ کو فیکٹری ورژن سے تبدیل کریں؟ تمام ڈیٹا ہٹا دیا جائے گا۔ اس سے دفتری پروفائلز کے حاملین سمیت اس آلہ کے تمام صارفین متاثر ہوں گے۔"</string>
+ <string name="uninstalling_notification_channel" msgid="840153394325714653">"چل رہے اَن انسٹالز"</string>
+ <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"ناکام اَن انسٹالز"</string>
+ <string name="uninstalling" msgid="8709566347688966845">"اَن انسٹال ہو رہا ہے…"</string>
+ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ان انسٹال ہو رہا ہے…"</string>
+ <string name="uninstall_done" msgid="439354138387969269">"اَن انسٹال مکمل ہو گیا۔"</string>
+ <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> اَن انسٹال ہو گیا"</string>
+ <string name="uninstall_failed" msgid="1847750968168364332">"اَن انسٹال ناکام ہو گیا۔"</string>
+ <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کو ان انسٹال کرنا ناکام ہو گیا۔"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"فعال آلہ کے منتظم کی ایپ کو اَن انسٹال نہیں کیا جا سکتا"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"<xliff:g id="USERNAME">%1$s</xliff:g> کی فعال آلہ کے منتظم کی ایپ کو اَن انسٹال نہیں کیا جا سکتا"</string>
+ <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"یہ ایپ کچھ صارفین یا پروفائلز کیلئے درکار ہے اور دیگر کیلئے اَن انسٹال کر دی گئی"</string>
+ <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"یہ ایپ آپ کے پروفائل کیلئے درکار ہے اور اسے اَن انسٹال نہیں کیا جا سکتا۔"</string>
+ <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"آپ کے آلہ کے منتظم کو اس ایپ کی ضرورت ہے اور اسے اَن انسٹال نہیں کیا جا سکتا۔"</string>
+ <string name="manage_device_administrators" msgid="3092696419363842816">"آلہ کے منتظم کی ایپس کا نظم کریں"</string>
+ <string name="manage_users" msgid="1243995386982560813">"صارفین کا نظم کریں"</string>
+ <string name="uninstall_failed_msg" msgid="2176744834786696012">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو اَن انسٹال نہیں کیا جا سکا۔"</string>
+ <string name="Parse_error_dlg_text" msgid="1661404001063076789">"پیکیج کو پارس کرنے میں ایک مسئلہ تھا۔"</string>
+ <string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string>
+ <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"‏\'انسٹال/اَن انسٹال کی کارروائیاں\' Wear پر تعاون یافتہ نہیں ہیں۔"</string>
+ <string name="message_staging" msgid="8032722385658438567">"ایپ کی ٹیسٹنگ ہو رہی ہے…"</string>
+ <string name="app_name_unknown" msgid="6881210203354323926">"نامعلوم"</string>
+ <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"آپ کی سیکیورٹی کے مدنظر، آپ کے ٹیبلیٹ کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
+ <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"‏آپ کی سیکیورٹی کے مدنظر، آپ کے TV کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
+ <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"آپ کی سیکیورٹی کے مدنظر، آپ کے فون کو اس ذریعے سے نامعلوم ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"آپ کے فون اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے فون کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"آپ کے ٹیبلیٹ اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے ٹیبلیٹ کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"‏آپ کے TV اور ذاتی ڈیٹا کو نامعلوم ایپس کی جانب سے حملے کا زیادہ خطرہ ہے۔ اس ایپ کو انسٹال کر کے، آپ اس بات سے اتفاق کرتے ہیں کہ آپ اس سے اپنے TV کو ہونے والے کسی بھی نقصان یا ڈیٹا کے نقصان کے لئے خود ذمہ دار ہیں۔"</string>
+ <string name="anonymous_source_continue" msgid="4375745439457209366">"جاری رکھیں"</string>
+ <string name="external_sources_settings" msgid="4046964413071713807">"ترتیبات"</string>
+ <string name="wear_app_channel" msgid="1960809674709107850">"‏wear ایپس کو انسٹال/اَن انسٹال کرنا"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ایپ انسٹال ہونے کی اطلاع"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"کامیابی کے ساتھ انسٹال ہو گئی"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" کامیابی کے ساتھ انسٹال ہو گئی"</string>
+</resources>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index e692e0d99229..dedf00c86330 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Davom etish"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Sozlamalar"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear ilovalarini o‘rnatish/o‘chirish"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ilova oʻrnatilgani haqida bildirishnoma"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"O‘rnatildi"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” o‘rnatildi"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index 91aa71c9390f..7043093c4347 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Tiếp tục"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Cài đặt"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Cài đặt/gỡ cài đặt ứng dụng Wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Thông báo đã cài đặt ứng dụng"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Đã cài đặt thành công"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Đã cài đặt thành công “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index d3b5e6849262..a91f00f94f3a 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"继续"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"设置"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"正在安装/卸载 Wear 应用"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"“应用已安装”通知"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安装"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”安装成功"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index bb3605fa6c3e..286e360d601c 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"繼續"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"設定"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"正在安裝/解除安裝 Wear 應用程式"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安裝"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」已成功安裝"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 513b16aa802d..b0de2c256ce3 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"繼續"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"設定"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"安裝/解除安裝中的 Wear 應用程式"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"安裝成功"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"已成功安裝「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index bc91ed11ae50..5d2847933323 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -88,4 +88,7 @@
<string name="anonymous_source_continue" msgid="4375745439457209366">"Qhubeka"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Izilungiselelo"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Ifaka/ikhipha izinhlelo zokusebenza ze-wear"</string>
+ <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Isaziso sokufakwa kohlelo lokusebenza"</string>
+ <string name="notification_installation_success_message" msgid="6450467996056038442">"Ifakwe ngempumelelo"</string>
+ <string name="notification_installation_success_status" msgid="3172502643504323321">"Kufakwe ngempumelelo i-\"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-mr/strings.xml b/packages/PrintSpooler/res/values-mr/strings.xml
index 5593f66fa789..b055d82eea1d 100644
--- a/packages/PrintSpooler/res/values-mr/strings.xml
+++ b/packages/PrintSpooler/res/values-mr/strings.xml
@@ -88,7 +88,7 @@
<string name="no_connection_to_printer" msgid="2159246915977282728">"प्रिंटरवर कोणतेही कनेक्‍शन नाही"</string>
<string name="reason_unknown" msgid="5507940196503246139">"अज्ञात"</string>
<string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> वापरायची?"</string>
- <string name="print_service_security_warning_summary" msgid="1427434625361692006">"आपला दस्तऐवज प्रिंटरपर्यंत पोहचण्‍यापूर्वी एक किंवा अधिक सर्व्हरद्वारे जाऊ शकतो."</string>
+ <string name="print_service_security_warning_summary" msgid="1427434625361692006">"तुमचा दस्तऐवज प्रिंटरपर्यंत पोहचण्‍यापूर्वी एक किंवा अधिक सर्व्हरद्वारे जाऊ शकतो."</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"कृष्‍ण धवल"</item>
<item msgid="2762241247228983754">"रंग"</item>
diff --git a/packages/SettingsLib/HelpUtils/res/values-hi/strings.xml b/packages/SettingsLib/HelpUtils/res/values-hi/strings.xml
new file mode 100644
index 000000000000..cfc69617404e
--- /dev/null
+++ b/packages/SettingsLib/HelpUtils/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="help_feedback_label" msgid="4550436169116444686">"सहायता और सुझाव"</string>
+</resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-or/strings.xml b/packages/SettingsLib/SearchWidget/res/values-or/strings.xml
new file mode 100644
index 000000000000..352303748952
--- /dev/null
+++ b/packages/SettingsLib/SearchWidget/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="search_menu" msgid="1604061903696928905">"ସର୍ଚ୍ଚ ସେଟିଙ୍ଗ"</string>
+</resources>
diff --git a/packages/SettingsLib/SearchWidget/res/values-ur/strings.xml b/packages/SettingsLib/SearchWidget/res/values-ur/strings.xml
new file mode 100644
index 000000000000..8b62fd4989a9
--- /dev/null
+++ b/packages/SettingsLib/SearchWidget/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="search_menu" msgid="1604061903696928905">"ترتیبات تلاش کریں"</string>
+</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 5c11db18d29e..83c4b8ee3b86 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -240,7 +240,7 @@
<string name="wifi_unmetered_label" msgid="6124098729457992931">"بدون قياس"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"أحجام ذاكرة التخزين المؤقت للتسجيل"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"حدد أحجامًا أكبر لكل ذاكرة تخزين مؤقت للتسجيل"</string>
- <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"هل تريد محو سعة التخزين الدائمة للمسجِّل؟"</string>
+ <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"هل تريد محو مساحة التخزين الدائمة للمسجِّل؟"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"عندما نتوقف عن رصد أي أخطاء باستخدام المسجِّل الدائم مرة أخرى، يتعين علينا محو بيانات المسجِّل الموجودة على جهازك."</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"تخزين بيانات المسجِّل باستمرار على الجهاز"</string>
<string name="select_logpersist_dialog_title" msgid="4003400579973269060">"تحديد مخازن السجلات المؤقتة المراد تخزينها باستمرار على الجهاز"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 72dd8cf70dd2..5638947f64b1 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -446,6 +446,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durada"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pregunta sempre"</string>
- <string name="zen_mode_forever" msgid="2704305038191592967">"Fins que no ho desactivi"</string>
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Fins que no ho desactivis"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ara mateix"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 5a11e721f1b0..5da253c2d4bb 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -317,7 +317,7 @@
<string name="show_all_anrs" msgid="4924885492787069007">"‏הצגת מקרי ANR ברקע"</string>
<string name="show_all_anrs_summary" msgid="6636514318275139826">"הצגת תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string>
<string name="show_notification_channel_warnings" msgid="1399948193466922683">"אזהרות לגבי ערוץ הודעות"</string>
- <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"הצגת אזהרה כשאפליקציה שולחת הודעה ללא ערוץ חוקי"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"הצגת אזהרה כשאפליקציה שולחת התראה ללא ערוץ חוקי"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index df122e283c58..d693077737e2 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -415,7 +415,7 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kiwango maalum (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Weka nenosiri ili urejeshe mipangilio ya kiwandani ikiwa katika hali ya onyesho."</string>
- <string name="retail_demo_reset_next" msgid="8356731459226304963">"Inayofuata"</string>
+ <string name="retail_demo_reset_next" msgid="8356731459226304963">"Endelea"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nenosiri linahitajika"</string>
<string name="active_input_method_subtypes" msgid="3596398805424733238">"Mbinu zinazotumika"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Tumia lugha za mfumo"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 240a19279739..a936df2bf2eb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -254,7 +254,8 @@ public class ApplicationsState {
user.isAdmin() ? mAdminRetrieveFlags : mRetrieveFlags,
user.id);
mApplications.addAll(list.getList());
- } catch (RemoteException e) {
+ } catch (Exception e) {
+ Log.e(TAG, "Error during doResumeIfNeededLocked", e);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
index a84222909072..3152e65d5a36 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
@@ -127,4 +127,17 @@ public interface BluetoothCallback {
default void onProfileConnectionStateChanged(CachedBluetoothDevice cachedDevice,
int state, int bluetoothProfile) {
}
+
+ /**
+ * Called when ACL connection state is changed. It listens to
+ * {@link android.bluetooth.BluetoothDevice#ACTION_ACL_CONNECTED} and {@link
+ * android.bluetooth.BluetoothDevice#ACTION_ACL_DISCONNECTED}
+ *
+ * @param cachedDevice Bluetooth device that changed
+ * @param state the Bluetooth device connection state, the possible values are:
+ * {@link android.bluetooth.BluetoothAdapter#STATE_DISCONNECTED},
+ * {@link android.bluetooth.BluetoothAdapter#STATE_CONNECTED}
+ */
+ default void onAclConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index 022bf6915886..2b7babd06b47 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -119,6 +119,10 @@ public class BluetoothEventManager {
addHandler(TelephonyManager.ACTION_PHONE_STATE_CHANGED,
new AudioModeChangedHandler());
+ // ACL connection changed broadcasts
+ addHandler(BluetoothDevice.ACTION_ACL_CONNECTED, new AclStateChangedHandler());
+ addHandler(BluetoothDevice.ACTION_ACL_DISCONNECTED, new AclStateChangedHandler());
+
registerAdapterIntentReceiver();
}
@@ -236,6 +240,15 @@ public class BluetoothEventManager {
}
}
+ private void dispatchAclStateChanged(CachedBluetoothDevice activeDevice,
+ int state) {
+ synchronized (mCallbacks) {
+ for (BluetoothCallback callback : mCallbacks) {
+ callback.onAclConnectionStateChanged(activeDevice, state);
+ }
+ }
+ }
+
@VisibleForTesting
void addHandler(String action, Handler handler) {
mHandlerMap.put(action, handler);
@@ -447,6 +460,32 @@ public class BluetoothEventManager {
}
}
+ private class AclStateChangedHandler implements Handler {
+ @Override
+ public void onReceive(Context context, Intent intent, BluetoothDevice device) {
+ final String action = intent.getAction();
+ if (action == null) {
+ Log.w(TAG, "AclStateChangedHandler: action is null");
+ return;
+ }
+ final CachedBluetoothDevice activeDevice = mDeviceManager.findDevice(device);
+ final int state;
+ switch (action) {
+ case BluetoothDevice.ACTION_ACL_CONNECTED:
+ state = BluetoothAdapter.STATE_CONNECTED;
+ break;
+ case BluetoothDevice.ACTION_ACL_DISCONNECTED:
+ state = BluetoothAdapter.STATE_DISCONNECTED;
+ break;
+ default:
+ Log.w(TAG, "ActiveDeviceChangedHandler: unknown action " + action);
+ return;
+
+ }
+ dispatchAclStateChanged(activeDevice, state);
+ }
+ }
+
private class AudioModeChangedHandler implements Handler {
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
index 78e807cf1a1c..8c03918ce266 100644
--- a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
+++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
@@ -16,18 +16,11 @@
package com.android.settingslib.license;
-import static com.android.settingslib.license.LicenseHtmlLoaderCompat.generateHtmlFile;
-import static com.android.settingslib.license.LicenseHtmlLoaderCompat.getCachedHtmlFile;
-import static com.android.settingslib.license.LicenseHtmlLoaderCompat.getVaildXmlFiles;
-import static com.android.settingslib.license.LicenseHtmlLoaderCompat.isCachedHtmlFileOutdated;
-
import android.content.Context;
-import android.util.Log;
import com.android.settingslib.utils.AsyncLoader;
import java.io.File;
-import java.util.List;
/**
* LicenseHtmlLoader is a loader which loads a license html file from default license xml files.
@@ -44,27 +37,10 @@ public class LicenseHtmlLoader extends AsyncLoader<File> {
@Override
public File loadInBackground() {
- return generateHtmlFromDefaultXmlFiles();
+ return new LicenseHtmlLoaderCompat(mContext).loadInBackground();
}
@Override
protected void onDiscardResult(File f) {
}
-
- private File generateHtmlFromDefaultXmlFiles() {
- final List<File> xmlFiles = getVaildXmlFiles();
- if (xmlFiles.isEmpty()) {
- Log.e(TAG, "No notice file exists.");
- return null;
- }
-
- File cachedHtmlFile = getCachedHtmlFile(mContext);
- if (!isCachedHtmlFileOutdated(xmlFiles, cachedHtmlFile)
- || generateHtmlFile(mContext, xmlFiles, cachedHtmlFile)) {
- return cachedHtmlFile;
- }
-
- return null;
- }
-
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java
index ca6248505dc0..0b6996365372 100644
--- a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java
+++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java
@@ -73,7 +73,7 @@ public class LicenseHtmlLoaderCompat extends AsyncLoaderCompat<File> {
return null;
}
- static List<File> getVaildXmlFiles() {
+ private List<File> getVaildXmlFiles() {
final List<File> xmlFiles = new ArrayList();
for (final String xmlPath : DEFAULT_LICENSE_XML_PATHS) {
File file = new File(xmlPath);
@@ -84,11 +84,11 @@ public class LicenseHtmlLoaderCompat extends AsyncLoaderCompat<File> {
return xmlFiles;
}
- static File getCachedHtmlFile(Context context) {
+ private File getCachedHtmlFile(Context context) {
return new File(context.getCacheDir(), NOTICE_HTML_FILE_NAME);
}
- static boolean isCachedHtmlFileOutdated(List<File> xmlFiles, File cachedHtmlFile) {
+ private boolean isCachedHtmlFileOutdated(List<File> xmlFiles, File cachedHtmlFile) {
boolean outdated = true;
if (cachedHtmlFile.exists() && cachedHtmlFile.length() != 0) {
outdated = false;
@@ -102,7 +102,7 @@ public class LicenseHtmlLoaderCompat extends AsyncLoaderCompat<File> {
return outdated;
}
- static boolean generateHtmlFile(Context context, List<File> xmlFiles, File htmlFile) {
+ private boolean generateHtmlFile(Context context, List<File> xmlFiles, File htmlFile) {
return LicenseHtmlGeneratorFromXml.generateHtml(xmlFiles, htmlFile,
context.getString(R.string.notice_header));
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
index 19ce424257ac..b307b4730fa1 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java
@@ -86,21 +86,21 @@ public class ApplicationsStateRoboTest {
@Mock
private StorageStatsManager mStorageStatsManager;
- @Implements(value = IconDrawableFactory.class, inheritImplementationMethods = true)
+ @Implements(value = IconDrawableFactory.class)
public static class ShadowIconDrawableFactory {
@Implementation
- public Drawable getBadgedIcon(ApplicationInfo appInfo) {
+ protected Drawable getBadgedIcon(ApplicationInfo appInfo) {
return new ColorDrawable(0);
}
}
- @Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true)
+ @Implements(value = ApplicationPackageManager.class)
public static class ShadowPackageManager extends
org.robolectric.shadows.ShadowApplicationPackageManager {
@Implementation
- public ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
+ protected ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.activityInfo = new ActivityInfo();
resolveInfo.activityInfo.packageName = HOME_PACKAGE_NAME;
@@ -139,6 +139,7 @@ public class ApplicationsStateRoboTest {
when(mStorageStatsManager.queryStatsForPackage(ArgumentMatchers.any(UUID.class),
anyString(), ArgumentMatchers.any(UserHandle.class))).thenReturn(storageStats);
+ ApplicationsState.sInstance = null;
mApplicationsState = ApplicationsState.getInstance(RuntimeEnvironment.application);
mApplicationsState.clearEntries();
}
@@ -189,8 +190,8 @@ public class ApplicationsStateRoboTest {
Session session = mApplicationsState.newSession(mCallbacks);
session.onResume();
- addApp(HOME_PACKAGE_NAME,1);
- addApp(LAUNCHABLE_PACKAGE_NAME,2);
+ addApp(HOME_PACKAGE_NAME, 1);
+ addApp(LAUNCHABLE_PACKAGE_NAME, 2);
session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
processAllMessages();
verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
@@ -219,7 +220,7 @@ public class ApplicationsStateRoboTest {
session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_ICONS);
session.onResume();
- addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ addApp(LAUNCHABLE_PACKAGE_NAME, 1);
session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
processAllMessages();
verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
@@ -240,7 +241,7 @@ public class ApplicationsStateRoboTest {
session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_SIZES);
session.onResume();
- addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ addApp(LAUNCHABLE_PACKAGE_NAME, 1);
session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
processAllMessages();
verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
@@ -261,7 +262,7 @@ public class ApplicationsStateRoboTest {
session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_HOME_APP);
session.onResume();
- addApp(HOME_PACKAGE_NAME,1);
+ addApp(HOME_PACKAGE_NAME, 1);
session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
processAllMessages();
verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
@@ -283,7 +284,7 @@ public class ApplicationsStateRoboTest {
session.setSessionFlags(ApplicationsState.FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER);
session.onResume();
- addApp(LAUNCHABLE_PACKAGE_NAME,1);
+ addApp(LAUNCHABLE_PACKAGE_NAME, 1);
session.rebuild(ApplicationsState.FILTER_EVERYTHING, ApplicationsState.SIZE_COMPARATOR);
processAllMessages();
verify(mCallbacks).onRebuildComplete(mAppEntriesCaptor.capture());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
index 020234c6e12f..c147d5e306c2 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
@@ -19,7 +19,10 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
@@ -50,6 +53,8 @@ public class BluetoothEventManagerTest {
private BluetoothCallback mBluetoothCallback;
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
+ @Mock
+ private BluetoothDevice mBluetoothDevice;
private Context mContext;
private Intent mIntent;
@@ -62,6 +67,7 @@ public class BluetoothEventManagerTest {
mBluetoothEventManager = new BluetoothEventManager(mLocalAdapter,
mCachedDeviceManager, mContext, /* handler= */ null, /* userHandle= */ null);
+ when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice);
}
@Test
@@ -126,4 +132,28 @@ public class BluetoothEventManagerTest {
verify(mBluetoothCallback).onProfileConnectionStateChanged(mCachedBluetoothDevice,
BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP);
}
+
+ @Test
+ public void dispatchAclConnectionStateChanged_aclDisconnected_shouldDispatchCallback() {
+ mBluetoothEventManager.registerCallback(mBluetoothCallback);
+ mIntent = new Intent(BluetoothDevice.ACTION_ACL_DISCONNECTED);
+ mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
+
+ mContext.sendBroadcast(mIntent);
+
+ verify(mBluetoothCallback).onAclConnectionStateChanged(mCachedBluetoothDevice,
+ BluetoothAdapter.STATE_DISCONNECTED);
+ }
+
+ @Test
+ public void dispatchAclConnectionStateChanged_aclConnected_shouldDispatchCallback() {
+ mBluetoothEventManager.registerCallback(mBluetoothCallback);
+ mIntent = new Intent(BluetoothDevice.ACTION_ACL_CONNECTED);
+ mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mBluetoothDevice);
+
+ mContext.sendBroadcast(mIntent);
+
+ verify(mBluetoothCallback).onAclConnectionStateChanged(mCachedBluetoothDevice,
+ BluetoothAdapter.STATE_CONNECTED);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
index a15f5fce558e..a0fa6b599b45 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
@@ -18,11 +18,14 @@ package com.android.settingslib.development;
import static com.google.common.truth.Truth.assertThat;
+import android.os.UserManager;
import android.content.Context;
import android.provider.Settings;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
-import com.android.settingslib.testutils.shadow.ShadowUserManager;
+
+import org.robolectric.shadows.ShadowUserManager;
+import org.robolectric.shadow.api.Shadow;
import org.junit.After;
import org.junit.Before;
@@ -32,20 +35,16 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(SettingsLibRobolectricTestRunner.class)
-@Config(shadows = ShadowUserManager.class)
public class DevelopmentSettingsEnablerTest {
private Context mContext;
+ private ShadowUserManager mUserManager;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
- ShadowUserManager.getShadow().setIsAdminUser(true);
- }
-
- @After
- public void tearDown() {
- ShadowUserManager.getShadow().reset();
+ mUserManager = Shadow.extract(mContext.getSystemService(UserManager.class));
+ mUserManager.setIsAdminUser(true);
}
@Test
@@ -76,7 +75,7 @@ public class DevelopmentSettingsEnablerTest {
public void isEnabled_settingsOn_noRestriction_notAdmin_shouldReturnFalse() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
- ShadowUserManager.getShadow().setIsAdminUser(false);
+ mUserManager.setIsAdminUser(false);
assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse();
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
index 2a60839990c4..d7b23b0ef636 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
@@ -39,6 +39,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowApplication;
@RunWith(SettingsLibRobolectricTestRunner.class)
@@ -59,7 +60,7 @@ public class EnableAdbPreferenceControllerTest {
MockitoAnnotations.initMocks(this);
ShadowApplication shadowContext = ShadowApplication.getInstance();
shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
- mContext = spy(shadowContext.getApplicationContext());
+ mContext = spy(RuntimeEnvironment.application);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
mController = new ConcreteEnableAdbPreferenceController(mContext);
mPreference = new SwitchPreference(mContext);
@@ -85,7 +86,6 @@ public class EnableAdbPreferenceControllerTest {
assertThat(mPreference.isVisible()).isTrue();
}
-
@Test
public void resetPreference_shouldUncheck() {
when(mUserManager.isAdminUser()).thenReturn(true);
@@ -100,14 +100,14 @@ public class EnableAdbPreferenceControllerTest {
@Test
public void handlePreferenceTreeClick_shouldUpdateSettings() {
when(mUserManager.isAdminUser()).thenReturn(true);
- Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.ADB_ENABLED, 1);
mPreference.setChecked(true);
mController.displayPreference(mScreen);
mController.handlePreferenceTreeClick(mPreference);
- assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ADB_ENABLED, 0)).isEqualTo(0);
}
@@ -126,7 +126,7 @@ public class EnableAdbPreferenceControllerTest {
@Test
public void updateState_settingsOn_shouldCheck() {
when(mUserManager.isAdminUser()).thenReturn(true);
- Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.ADB_ENABLED, 1);
mPreference.setChecked(false);
mController.displayPreference(mScreen);
@@ -139,7 +139,7 @@ public class EnableAdbPreferenceControllerTest {
@Test
public void updateState_settingsOff_shouldUncheck() {
when(mUserManager.isAdminUser()).thenReturn(true);
- Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.ADB_ENABLED, 0);
mPreference.setChecked(true);
mController.displayPreference(mScreen);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
index de96af4fa6a1..d0b6dab43281 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
@@ -158,16 +158,16 @@ public class BatterySaverUtilsTest {
@Test
public void testEnsureAutoBatterysaver_setNewPositiveValue_doNotOverwrite() throws Exception {
- Global.putString(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, "null");
+ Global.putInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
BatterySaverUtils.ensureAutoBatterySaver(mMockContext, BATTERY_SAVER_THRESHOLD_1);
- assertThat(Secure.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+ assertThat(Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
.isEqualTo(BATTERY_SAVER_THRESHOLD_1);
// Once a positive number is set, ensureAutoBatterySaver() won't overwrite it.
BatterySaverUtils.ensureAutoBatterySaver(mMockContext, BATTERY_SAVER_THRESHOLD_2);
- assertThat(Secure.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+ assertThat(Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
.isEqualTo(BATTERY_SAVER_THRESHOLD_1);
}
@@ -182,8 +182,8 @@ public class BatterySaverUtilsTest {
assertThat(Secure.getInt(mMockResolver, Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, -1))
.isEqualTo(-1); // not set.
- BatterySaverUtils.setAutoBatterySaverTriggerLevel(mMockContext, BATTERY_SAVER_THRESHOLD_1 );
- assertThat( Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+ BatterySaverUtils.setAutoBatterySaverTriggerLevel(mMockContext, BATTERY_SAVER_THRESHOLD_1);
+ assertThat(Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
.isEqualTo(BATTERY_SAVER_THRESHOLD_1);
assertThat(Secure.getInt(mMockResolver, Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, -1))
.isEqualTo(1);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
index 37d4d1d845f5..5dbb5caf60eb 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawableTest.java
@@ -89,10 +89,9 @@ public class BluetoothDeviceLayerDrawableTest {
BluetoothDeviceLayerDrawable twinDrawable =
(BluetoothDeviceLayerDrawable) drawable.getConstantState().newDrawable();
- assertThat(twinDrawable.getDrawable(0)).isEqualTo(drawable.getDrawable(0));
- assertThat(twinDrawable.getDrawable(1)).isEqualTo(drawable.getDrawable(1));
- assertThat(twinDrawable.getLayerInsetTop(1)).isEqualTo(
- drawable.getLayerInsetTop(1));
+ assertThat(twinDrawable.getDrawable(0)).isNotNull();
+ assertThat(twinDrawable.getDrawable(1)).isNotNull();
+ assertThat(twinDrawable.getLayerInsetTop(1)).isEqualTo(drawable.getLayerInsetTop(1));
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java
index c32cc99daf96..c90de5fe621e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java
@@ -112,7 +112,6 @@ public class LicenseHtmlLoaderCompatTest {
@Implements(LicenseHtmlLoaderCompat.class)
public static class ShadowLicenseHtmlLoaderCompat {
-
public static List<File> sValidXmlFiles;
public static File sCachedHtmlFile;
public static boolean sIsCachedHtmlFileOutdated;
@@ -127,22 +126,24 @@ public class LicenseHtmlLoaderCompatTest {
}
@Implementation
- static List<File> getVaildXmlFiles() {
+ protected List<File> getVaildXmlFiles() {
return sValidXmlFiles;
}
@Implementation
- static File getCachedHtmlFile(Context context) {
+ protected File getCachedHtmlFile(Context context) {
return sCachedHtmlFile;
}
@Implementation
- static boolean isCachedHtmlFileOutdated(List<File> xmlFiles, File cachedHtmlFile) {
+ protected boolean isCachedHtmlFileOutdated(List<File> xmlFiles,
+ File cachedHtmlFile) {
return sIsCachedHtmlFileOutdated;
}
@Implementation
- static boolean generateHtmlFile(Context context, List<File> xmlFiles, File htmlFile) {
+ protected boolean generateHtmlFile(Context context, List<File> xmlFiles,
+ File htmlFile) {
return sGenerateHtmlFileSucceeded;
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DummyWmTests.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/DrawableTestHelper.java
index aecb2783badd..ad8de770d624 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DummyWmTests.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/DrawableTestHelper.java
@@ -13,34 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.settingslib.testutils;
-package com.android.server.wm;
+import static com.google.common.truth.Truth.assertThat;
-import android.platform.test.annotations.Presubmit;
+import android.graphics.drawable.Drawable;
-import org.junit.Test;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowDrawable;
-import androidx.test.filters.FlakyTest;
-
-/**
- * Dummy test for com.android.server.wm
- * TODO(b/113800711): Remove this class once the actual tests are moved from servicestests.
- */
-public class DummyWmTests {
-
- @Presubmit
- @Test
- public void preSubmitTest() {}
-
- @FlakyTest
- @Presubmit
- @Test
- public void flakyPreSubmitTest() {}
-
- @Test
- public void postSubmitTest() {}
-
- @FlakyTest
- @Test
- public void flakyPostSubmitTest() {}
+public class DrawableTestHelper {
+ public static void assertDrawableResId(Drawable drawable, int resId) {
+ final ShadowDrawable shadow = Shadows.shadowOf(drawable);
+ assertThat(shadow.getCreatedFromResId()).isEqualTo(resId);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
index 9b8c230dded4..cae74c888f0a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowBluetoothAdapter.java
@@ -25,7 +25,7 @@ import org.robolectric.annotation.Implements;
import java.util.List;
-@Implements(value = BluetoothAdapter.class, inheritImplementationMethods = true)
+@Implements(value = BluetoothAdapter.class)
public class ShadowBluetoothAdapter extends org.robolectric.shadows.ShadowBluetoothAdapter {
private List<Integer> mSupportedProfiles;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
index bbd3a53751a0..a81e39501a8e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowUserManager.java
@@ -16,6 +16,7 @@
package com.android.settingslib.testutils.shadow;
+import android.annotation.UserIdInt;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
@@ -29,37 +30,21 @@ import org.robolectric.shadow.api.Shadow;
import java.util.ArrayList;
import java.util.List;
-@Implements(value = UserManager.class, inheritImplementationMethods = true)
+@Implements(value = UserManager.class)
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
- private boolean mAdminUser;
-
- public void setIsAdminUser(boolean isAdminUser) {
- mAdminUser = isAdminUser;
- }
-
- @Resetter
- public void reset() {
- mAdminUser = false;
- }
-
@Implementation
- public boolean isAdminUser() {
- return mAdminUser;
- }
-
- @Implementation
- public static UserManager get(Context context) {
+ protected static UserManager get(Context context) {
return (UserManager) context.getSystemService(Context.USER_SERVICE);
}
@Implementation
- public int[] getProfileIdsWithDisabled(int userId) {
- return new int[] { 0 };
+ protected int[] getProfileIdsWithDisabled(int userId) {
+ return new int[]{0};
}
@Implementation
- public List<UserInfo> getProfiles() {
+ protected List<UserInfo> getProfiles() {
UserInfo userInfo = new UserInfo();
userInfo.id = 0;
List<UserInfo> userInfos = new ArrayList<>();
@@ -67,8 +52,9 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager
return userInfos;
}
- public static ShadowUserManager getShadow() {
- return (ShadowUserManager) Shadow.extract(
- RuntimeEnvironment.application.getSystemService(UserManager.class));
+ @Implementation
+ protected List<UserInfo> getProfiles(@UserIdInt int userHandle) {
+ return getProfiles();
}
-} \ No newline at end of file
+
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java
index f56c111d86ea..e030005e2d09 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java
@@ -37,7 +37,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class FooterPreferenceMixinCompatTest {
@@ -58,7 +58,7 @@ public class FooterPreferenceMixinCompatTest {
mLifecycle = new Lifecycle(mLifecycleOwner);
when(mFragment.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
when(mFragment.getPreferenceManager().getContext())
- .thenReturn(ShadowApplication.getInstance().getApplicationContext());
+ .thenReturn(RuntimeEnvironment.application);
mMixin = new FooterPreferenceMixinCompat(mFragment, mLifecycle);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
index 366b720fc87b..8817ff7f65b3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
@@ -37,6 +37,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowApplication;
@RunWith(SettingsLibRobolectricTestRunner.class)
@@ -58,7 +59,7 @@ public class FooterPreferenceMixinTest {
mLifecycle = new Lifecycle(mLifecycleOwner);
when(mFragment.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
when(mFragment.getPreferenceManager().getContext())
- .thenReturn(ShadowApplication.getInstance().getApplicationContext());
+ .thenReturn(RuntimeEnvironment.application);
mMixin = new FooterPreferenceMixin(mFragment, mLifecycle);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
index 84a043e15eb5..e0eceb418f27 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
@@ -31,7 +31,7 @@ import com.android.settingslib.SettingsLibRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class FooterPreferenceTest {
@@ -40,7 +40,7 @@ public class FooterPreferenceTest {
@Before
public void setUp() {
- mContext = ShadowApplication.getInstance().getApplicationContext();
+ mContext = RuntimeEnvironment.application;
}
@Test
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java
index a6fadf967f9a..379cfc70b7ba 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java
@@ -124,7 +124,7 @@ final public class SettingsService extends Binder {
@Override
public int onCommand(String cmd) {
- if (cmd == null) {
+ if (cmd == null || "help".equals(cmd) || "-h".equals(cmd)) {
return handleDefaultCommands(cmd);
}
diff --git a/packages/Shell/res/values-mr/strings.xml b/packages/Shell/res/values-mr/strings.xml
index aae84934346b..dc6a6126bc5d 100644
--- a/packages/Shell/res/values-mr/strings.xml
+++ b/packages/Shell/res/values-mr/strings.xml
@@ -23,12 +23,12 @@
<string name="bugreport_updating_title" msgid="4423539949559634214">"दोष अहवालामध्‍ये तपशील जोडत आहे"</string>
<string name="bugreport_updating_wait" msgid="3322151947853929470">"कृपया प्रतीक्षा करा..."</string>
<string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"फोनवर बग रीपोर्ट लवकरच दिसेल"</string>
- <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"आपला बग रीपोर्ट शेअर करण्यासाठी निवडा"</string>
- <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"आपला बग रीपोर्ट शेअर करण्यासाठी टॅप करा"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"आपला बग रीपोर्ट स्क्रीनशॉटशिवाय शेअर करण्यासाठी टॅप करा किंवा स्क्रीनशॉट पूर्ण होण्याची प्रतीक्षा करा"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"स्क्रीनशॉट शिवाय आपला बग रीपोर्ट शेअर करण्यासाठी टॅप करा किंवा समाप्त करण्यासाठी स्क्रीनशॉटची प्रतीक्षा करा"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"स्क्रीनशॉट शिवाय आपला बग रीपोर्ट शेअर करण्यासाठी टॅप करा किंवा समाप्त करण्यासाठी स्क्रीनशॉटची प्रतीक्षा करा"</string>
- <string name="bugreport_confirm" msgid="5917407234515812495">"बग रीपोर्टांमध्ये तुम्ही संवेदनशील (अॅप-वापर आणि स्थान डेटा यासारखा) डेटा म्हणून विचार करता त्या डेटाच्या समावेशासह सिस्टीमच्या विविध लॉग फायलींमधील डेटा असतो. ज्या लोकांवर आणि अॅपवर आपला विश्वास आहे केवळ त्यांच्यासह हा बग रीपोर्ट शेअर करा."</string>
+ <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"तुमचा बग रीपोर्ट शेअर करण्यासाठी निवडा"</string>
+ <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"तुमचा बग रीपोर्ट शेअर करण्यासाठी टॅप करा"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"तुमचा बग रीपोर्ट स्क्रीनशॉटशिवाय शेअर करण्यासाठी टॅप करा किंवा स्क्रीनशॉट पूर्ण होण्याची प्रतीक्षा करा"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"स्क्रीनशॉट शिवाय तुमचा बग रीपोर्ट शेअर करण्यासाठी टॅप करा किंवा समाप्त करण्यासाठी स्क्रीनशॉटची प्रतीक्षा करा"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"स्क्रीनशॉट शिवाय तुमचा बग रीपोर्ट शेअर करण्यासाठी टॅप करा किंवा समाप्त करण्यासाठी स्क्रीनशॉटची प्रतीक्षा करा"</string>
+ <string name="bugreport_confirm" msgid="5917407234515812495">"बग रीपोर्टांमध्ये तुम्ही संवेदनशील (अॅप-वापर आणि स्थान डेटा यासारखा) डेटा म्हणून विचार करता त्या डेटाच्या समावेशासह सिस्टीमच्या विविध लॉग फायलींमधील डेटा असतो. ज्या लोकांवर आणि अॅपवर तुमचा विश्वास आहे केवळ त्यांच्यासह हा बग रीपोर्ट शेअर करा."</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"पुन्हा दर्शवू नका"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"बग रीपोर्ट"</string>
<string name="bugreport_unreadable_text" msgid="586517851044535486">"बग रीपोर्ट फाईल वाचणे शक्य झाले नाही"</string>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 44bc3f212654..b2bb88314441 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -136,6 +136,10 @@
<!-- Screen Capturing -->
<uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" />
+ <!-- Screen Recording -->
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
<!-- Assist -->
<uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" />
@@ -212,6 +216,9 @@
<!-- Permission necessary to change car audio volume through CarAudioManager -->
<uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_VOLUME" />
+ <!-- Permission to control Android Debug Bridge (ADB) -->
+ <uses-permission android:name="android.permission.MANAGE_DEBUGGING" />
+
<uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" />
<protected-broadcast android:name="com.android.settingslib.action.REGISTER_SLICE_RECEIVER" />
@@ -267,6 +274,10 @@
</intent-filter>
</receiver>
+ <activity android:name=".screenrecord.ScreenRecordDialog"
+ android:theme="@style/ScreenRecord" />
+ <service android:name=".screenrecord.RecordingService" />
+
<receiver android:name=".SysuiRestartReceiver"
android:exported="false">
<intent-filter>
@@ -368,9 +379,9 @@
android:excludeFromRecents="true">
</activity>
- <!-- started from UsbDebuggingManager -->
+ <!-- started from AdbDebuggingManager -->
<activity android:name=".usb.UsbDebuggingActivity"
- android:permission="android.permission.MANAGE_USB"
+ android:permission="android.permission.MANAGE_DEBUGGING"
android:theme="@style/Theme.SystemUI.Dialog.Alert"
android:finishOnCloseSystemDialogs="true"
android:excludeFromRecents="true">
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 47f2cdcf80c6..2f6e32b2c6d2 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -6,20 +6,36 @@ adamcohen@google.com
asc@google.com
ashaikh@google.com
beverlyt@google.com
+brockman@google.com
cinek@google.com
cwren@google.com
dupin@google.com
+ethibodeau@google.com
evanlaird@google.com
jmonk@google.com
jaggies@google.com
jjaggi@google.com
+joshmcgrath@google.com
juliacr@google.com
+juliatuttle@google.com
kchyn@google.com
+kozynski@google.com
+kprevas@google.com
madym@google.com
+mankoff@google.com
+nbenbernou@google.com
+nesciosquid@google.com
ngmatthew@google.com
+ogunwale@google.com
+pixel@google.com
roosa@google.com
shahrk@google.com
+snoeberger@google.com
+steell@google.com
+stwu@google.com
sunnygoyal@google.com
+susikp@google.com
+tsuji@google.com
twickham@google.com
winsonc@google.com
diff --git a/packages/SystemUI/legacy/recents/res/values-af/strings.xml b/packages/SystemUI/legacy/recents/res/values-af/strings.xml
new file mode 100644
index 000000000000..736c81034c06
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-af/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Oorsig."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Maak <xliff:g id="APP">%s</xliff:g> toe."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> is toegemaak."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alle onlangse programme is toegemaak."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Maak <xliff:g id="APP">%s</xliff:g>-programinligting oop."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Begin tans <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Geen onlangse items nie"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Jy het alles toegemaak"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Programinligting"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"skermvaspen"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"soek"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Kon nie <xliff:g id="APP">%s</xliff:g> begin nie."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is in veiligmodus gedeaktiveer."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Vee alles uit"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Sleep hierheen om verdeelde skerm te gebruik"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Verdeel horisontaal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Verdeel vertikaal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Verdeel gepasmaak"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Verdeel skerm na bo"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Verdeel skerm na links"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Verdeel skerm na regs"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-am/strings.xml b/packages/SystemUI/legacy/recents/res/values-am/strings.xml
new file mode 100644
index 000000000000..2870be712779
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-am/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"አጠቃላይ እይታ።"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> አስወግድ።"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> ተሰናብቷል።"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ሁሉም የቅርብ ጊዜ ማመልከቻዎች ተሰናብተዋል።"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"የ<xliff:g id="APP">%s</xliff:g> መተግበሪያ መረጃውን ይክፈቱ።"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> በመጀመር ላይ።"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"ሁሉንም ነገር አጽድተዋል"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"የመተግበሪያ መረጃ"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ማያ ገጽ መሰካት"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ፈልግ"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>ን መጀመር አልተቻለም።"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> በጥንቃቄ ሁነታ ውስጥ ታግዷል።"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ሁሉንም አጽዳ"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"የተከፈለ ማያ ገጽን ለመጠቀም እዚህ ላይ ይጎትቱ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"አግድም ክፈል"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ቁልቁል ክፈል"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"በብጁ ክፈል"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ማያ ገጽ ወደ ላይ ክፈል"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"ማያ ገጽ ወደ ግራ ክፈል"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"ማያ ገጽ ወደ ቀኝ ክፈል"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ar/strings.xml b/packages/SystemUI/legacy/recents/res/values-ar/strings.xml
new file mode 100644
index 000000000000..004de41891a0
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ar/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"النظرة عامة"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"إزالة <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"تمَّت إزالة <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"تمَّت إزالة كل التطبيقات المستخدمة مؤخرًا."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"فتح معلومات تطبيق <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"جارٍ بدء <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ليست هناك عناصر تم استخدامها مؤخرًا"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"لقد محوتَ كل شيء"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"معلومات التطبيق"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"تثبيت الشاشة"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"بحث"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"تعذَّر بدء <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"تم إيقاف <xliff:g id="APP">%s</xliff:g> في الوضع الآمن."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"محو الكل"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"اسحب هنا لاستخدام وضع تقسيم الشاشة"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"تقسيم أفقي"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"تقسيم رأسي"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"تقسيم مخصَّص"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"تقسيم الشاشة بمحاذاة الجزء العلوي"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"تقسيم الشاشة بمحاذاة اليسار"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"تقسيم الشاشة بمحاذاة اليمين"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-az/strings.xml b/packages/SystemUI/legacy/recents/res/values-az/strings.xml
new file mode 100644
index 000000000000..76ae02aa0f24
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-az/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"İcmal."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> tətbiqini silin."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> silindi."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Bütün son tətbiqlər silindi."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> tətbiq məlumatını açın."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> başladılır."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ən son element yoxdur"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Hər şeyi sildiniz"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Tətbiq məlumatı"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ekran sancağı"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"axtarış"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> başladılmadı."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> təhlükəsiz rejimdə deaktiv edildi."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Hamısını silin"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Bölünmüş ekrandan istifadə etmək üçün bura sürüşdürün"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horizontal Bölün"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikal Bölün"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Fərdi Bölün"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Ekranı yuxarıya doğru bölün"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Ekranı sola doğru bölün"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Ekranı sağa doğru bölün"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/legacy/recents/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..3117eeac77f7
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Pregled."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Odbacite aplikaciju <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikacija <xliff:g id="APP">%s</xliff:g> je odbačena."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Sve nedavno korišćene aplikacije su odbačene."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otvorite informacije o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Pokreće se <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nema nedavnih stavki"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Obrisali ste sve"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informacije o aplikaciji"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"kačenje ekrana"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pretraži"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Pokretanje aplikacije <xliff:g id="APP">%s</xliff:g> nije uspelo."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikacija <xliff:g id="APP">%s</xliff:g> je onemogućena u bezbednom režimu."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Obriši sve"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Prevucite ovde da biste koristili razdeljeni ekran"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Podeli horizontalno"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Podeli vertikalno"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Podeli prilagođeno"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Podeli ekran nagore"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Podeli ekran nalevo"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Podeli ekran nadesno"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-be/strings.xml b/packages/SystemUI/legacy/recents/res/values-be/strings.xml
new file mode 100644
index 000000000000..812184651e6e
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-be/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Агляд."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Закрыць праграму \"<xliff:g id="APP">%s</xliff:g>\"."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Праграма \"<xliff:g id="APP">%s</xliff:g>\" закрыта."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Усе нядаўнія праграмы закрыты."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Адкрыць інфармацыю пра праграму \"<xliff:g id="APP">%s</xliff:g>\"."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Запускаецца праграма \"<xliff:g id="APP">%s</xliff:g>\"."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Няма нядаўніх элементаў"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Вы ўсё выдалілі"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Інфармацыя пра праграму"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"замацаванне экрана"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"пошук"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Не ўдалося запусціць праграму \"<xliff:g id="APP">%s</xliff:g>\"."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Праграма \"<xliff:g id="APP">%s</xliff:g>\" адключана ў бяспечным рэжыме."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ачысціць усё"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Перацягніце сюды, каб перайсці ў рэжым падзеленага экрана"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Падзяліць гарызантальна"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Падзяліць вертыкальна"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Падзяліць іншым чынам"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Падзяліць экран зверху"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Падзяліць экран злева"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Падзяліць экран справа"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-bg/strings.xml b/packages/SystemUI/legacy/recents/res/values-bg/strings.xml
new file mode 100644
index 000000000000..3dda34fa00be
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-bg/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Общ преглед."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Отхвърляне на <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Приложението <xliff:g id="APP">%s</xliff:g> е отхвърлено."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Всички скорошни приложения са отхвърлени."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Отворете информацията за приложението <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> се стартира."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Няма скорошни елементи"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Изчистихте всичко"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Информация за приложението"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"фиксиране на екрана"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"търсене"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> не можа да стартира."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Приложението <xliff:g id="APP">%s</xliff:g> е деактивирано в безопасния режим."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Изчистване на всичко"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Преместете тук с плъзгане, за да използвате режим за разделен екран"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Хоризонтално разделяне"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Вертикално разделяне"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Персонализирано разделяне"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Разделяне на екрана нагоре"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Разделяне на екрана наляво"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Разделяне на екрана надясно"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-bs/strings.xml b/packages/SystemUI/legacy/recents/res/values-bs/strings.xml
new file mode 100644
index 000000000000..8e149ba800bb
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-bs/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Pregled."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Odbaci aplikaciju <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikacija <xliff:g id="APP">%s</xliff:g> je odbačena."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Sve nedavno korištene aplikacije su odbačene."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otvaranje informacija o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Pokretanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nema nedavnih stavki"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Sve ste obrisali"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informacije o aplikaciji"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"kačenje ekrana"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pretraži"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikacija <xliff:g id="APP">%s</xliff:g> je onemogućena u sigurnom načinu rada."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Obriši sve"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Povucite ovdje za korištenje podijeljenog ekrana"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Podjela po horizontali"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Podjela po vertikali"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Prilagođena podjela"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dijeli ekran nagore"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dijeli ekran nalijevo"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dijeli ekran nadesno"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ca/strings.xml b/packages/SystemUI/legacy/recents/res/values-ca/strings.xml
new file mode 100644
index 000000000000..fff525ce6fd6
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ca/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Aplicacions recents."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ignora <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"S\'ha ignorat <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"S\'han ignorat totes les aplicacions recents."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Obre la informació sobre l\'aplicació <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"S\'està iniciant <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No hi ha cap element recent"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Ho has esborrat tot"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informació de l\'aplicació"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fixació de pantalla"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"cerca"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"No s\'ha pogut iniciar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"En mode segur, l\'aplicació <xliff:g id="APP">%s</xliff:g> està desactivada."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Esborra-ho tot"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arrossega-ho aquí per utilitzar la pantalla dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Divisió horitzontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Divisió vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Divisió personalitzada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Divideix la pantalla cap amunt"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Divideix la pantalla cap a l\'esquerra"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Divideix la pantalla cap a la dreta"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-cs/strings.xml b/packages/SystemUI/legacy/recents/res/values-cs/strings.xml
new file mode 100644
index 000000000000..200f7a8aded7
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-cs/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Přehled"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Zavřít aplikaci <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikace <xliff:g id="APP">%s</xliff:g> byla odebrána."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Všechny naposledy použité aplikace byly odstraněny."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otevře informace o aplikaci <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Spouštění aplikace <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Žádné nedávné položky"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Vše je vymazáno"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informace o aplikaci"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"připnutí obrazovky"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"hledat"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Aplikaci <xliff:g id="APP">%s</xliff:g> nelze spustit."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikace <xliff:g id="APP">%s</xliff:g> je v nouzovém režimu zakázána."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Vymazat vše"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Přetáhnutím sem aktivujete rozdělenou obrazovku"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Vodorovné rozdělení"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Svislé rozdělení"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Vlastní rozdělení"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Rozdělit obrazovku nahoru"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Rozdělit obrazovku vlevo"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Rozdělit obrazovku vpravo"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-da/strings.xml b/packages/SystemUI/legacy/recents/res/values-da/strings.xml
new file mode 100644
index 000000000000..0a1690e4dd59
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-da/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Oversigt."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Fjern <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> er fjernet."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alle de seneste apps er fjernet."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Åbn appoplysningerne for <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> åbnes."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ingen nye elementer"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Du har ryddet alt"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Appoplysninger"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"skærmfastholdelse"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"søg"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> kunne ikke åbnes."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> er deaktiveret i sikker tilstand."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ryd alle"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Træk hertil for at bruge opdelt skærm"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Opdel vandret"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Opdel lodret"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Opdel brugerdefineret"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Opdelt skærm øverst"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Opdelt skærm til venstre"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Opdelt skærm til højre"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-de/strings.xml b/packages/SystemUI/legacy/recents/res/values-de/strings.xml
new file mode 100644
index 000000000000..97a6366eaa8a
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-de/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Übersicht."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> entfernen."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> wurde entfernt."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alle kürzlich verwendeten Apps wurden entfernt."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Infos zur <xliff:g id="APP">%s</xliff:g> App öffnen."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> wird gestartet."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Keine kürzlich verwendeten Elemente"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Du hast alles gelöscht"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"App-Info"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"Bildschirmfixierung"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"Suchen"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> konnte nicht gestartet werden."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ist im abgesicherten Modus deaktiviert."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Alle löschen"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Hierher ziehen, um den Bildschirm zu teilen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Geteilt – horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Geteilt – vertikal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Geteilt – benutzerdefiniert"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Geteilten Bildschirm oben anzeigen"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Geteilten Bildschirm links anzeigen"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Geteilten Bildschirm rechts anzeigen"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-el/strings.xml b/packages/SystemUI/legacy/recents/res/values-el/strings.xml
new file mode 100644
index 000000000000..90baf52342e8
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-el/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Επισκόπηση."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Παράβλεψη εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> απορρίφθηκε."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Όλες οι πρόσφατες εφαρμογές παραβλέφθηκαν."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Άνοιγμα πληροφοριών εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Έναρξη εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Δεν υπάρχουν πρόσφατα στοιχεία"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Διαγράψατε όλα τα στοιχεία"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Πληροφορίες εφαρμογής"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"καρφίτσωμα οθόνης"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"αναζήτηση"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Δεν ήταν δυνατή η έναρξη της εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> έχει απενεργοποιηθεί στην ασφαλή λειτουργία."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Διαγραφή όλων"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Σύρετε εδώ για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Οριζόντιος διαχωρισμός"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Κάθετος διαχωρισμός"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Προσαρμοσμένος διαχωρισμός"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Διαχωρισμός οθόνης στην κορυφή"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Διαχωρισμός οθόνης στα αριστερά"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Διαχωρισμός οθόνης στα δεξιά"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-en-rAU/strings.xml b/packages/SystemUI/legacy/recents/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000000..af1d055d65d2
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-en-rAU/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overview."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"All recent applications dismissed."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No recent items"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"You\'ve cleared everything"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Application Info"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"screen pinning"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"search"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Clear all"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Drag here to use split screen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Split Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Split Vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Split Custom"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Split screen to the top"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Split screen to the left"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Split screen to the right"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-en-rCA/strings.xml b/packages/SystemUI/legacy/recents/res/values-en-rCA/strings.xml
new file mode 100644
index 000000000000..af1d055d65d2
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-en-rCA/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overview."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"All recent applications dismissed."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No recent items"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"You\'ve cleared everything"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Application Info"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"screen pinning"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"search"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Clear all"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Drag here to use split screen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Split Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Split Vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Split Custom"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Split screen to the top"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Split screen to the left"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Split screen to the right"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-en-rGB/strings.xml b/packages/SystemUI/legacy/recents/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000000..af1d055d65d2
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-en-rGB/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overview."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"All recent applications dismissed."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No recent items"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"You\'ve cleared everything"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Application Info"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"screen pinning"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"search"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Clear all"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Drag here to use split screen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Split Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Split Vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Split Custom"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Split screen to the top"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Split screen to the left"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Split screen to the right"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-en-rIN/strings.xml b/packages/SystemUI/legacy/recents/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000000..af1d055d65d2
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-en-rIN/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overview."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"All recent applications dismissed."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No recent items"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"You\'ve cleared everything"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Application Info"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"screen pinning"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"search"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Clear all"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Drag here to use split screen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Split Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Split Vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Split Custom"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Split screen to the top"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Split screen to the left"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Split screen to the right"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-en-rXC/strings.xml b/packages/SystemUI/legacy/recents/res/values-en-rXC/strings.xml
new file mode 100644
index 000000000000..67477e9c0982
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-en-rXC/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎Overview.‎‏‎‎‏‎"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎Dismiss ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ dismissed.‎‏‎‎‏‎"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎All recent applications dismissed.‎‏‎‎‏‎"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ application info.‎‏‎‎‏‎"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎Starting ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎No recent items‎‏‎‎‏‎"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎You\'ve cleared everything‎‏‎‎‏‎"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎Application Info‎‏‎‎‏‎"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎screen pinning‎‏‎‎‏‎"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎search‎‏‎‎‏‎"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‎Could not start ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ is disabled in safe-mode.‎‏‎‎‏‎"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎Clear all‎‏‎‎‏‎"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎Drag here to use split screen‎‏‎‎‏‎"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‎Split Horizontal‎‏‎‎‏‎"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎Split Vertical‎‏‎‎‏‎"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‏‎Split Custom‎‏‎‎‏‎"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎Split screen to the top‎‏‎‎‏‎"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎Split screen to the left‎‏‎‎‏‎"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎Split screen to the right‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-es-rUS/strings.xml b/packages/SystemUI/legacy/recents/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000000..8bf3807f7a3a
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-es-rUS/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Recientes"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Permite descartar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> descartada"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Se descartaron todas las aplicaciones recientes."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Permite abrir la información de aplicación de <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iniciando <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No hay elementos recientes"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Todo borrado"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Información de la aplicación"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"Fijar pantalla"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"Buscar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"No se pudo iniciar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> está inhabilitada en modo seguro."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Borrar todo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arrastra hasta aquí para usar la pantalla dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"División horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"División vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"División personalizada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dividir pantalla en la parte superior"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dividir pantalla a la izquierda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dividir pantalla a la derecha"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-es/strings.xml b/packages/SystemUI/legacy/recents/res/values-es/strings.xml
new file mode 100644
index 000000000000..b70f318d2458
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-es/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Aplicaciones recientes."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ignorar la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Se ha ignorado la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Se han ignorado todas las aplicaciones recientes."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Abre la información de la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iniciando la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"No hay elementos recientes"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Has borrado todo"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Información de la aplicación"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"bloqueo de pantalla"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"buscar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"No se ha podido iniciar la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Borrar todo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arrastra el elemento hasta aquí para utilizar la pantalla dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"División horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"División vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"División personalizada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dividir la pantalla en la parte superior"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dividir la pantalla a la izquierda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dividir la pantalla a la derecha"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-et/strings.xml b/packages/SystemUI/legacy/recents/res/values-et/strings.xml
new file mode 100644
index 000000000000..c1903af60ec9
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-et/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Ülevaade."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Rakendusest <xliff:g id="APP">%s</xliff:g> loobumine."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Rakendusest <xliff:g id="APP">%s</xliff:g> on loobutud."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Kõikidest hiljutistest rakendustest on loobutud."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Rakenduse <xliff:g id="APP">%s</xliff:g> teabe avamine."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Rakenduse <xliff:g id="APP">%s</xliff:g> käivitamine."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Hiljutisi üksusi pole"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Olete kõik ära kustutanud"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Rakenduse teave"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ekraanikuva kinnitamine"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"otsi"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Rakendust <xliff:g id="APP">%s</xliff:g> ei saanud käivitada."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Rakendus <xliff:g id="APP">%s</xliff:g> on turvarežiimis keelatud."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Kustuta kõik"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Jagatud ekraani kasutamiseks lohistage siia"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horisontaalne poolitamine"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikaalne poolitamine"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Kohandatud poolitamine"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Poolita ekraan üles"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Poolita ekraan vasakule"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Poolita ekraan paremale"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-eu/strings.xml b/packages/SystemUI/legacy/recents/res/values-eu/strings.xml
new file mode 100644
index 000000000000..91e250f50411
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-eu/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Ikuspegi orokorra."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Baztertu <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Baztertu da <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Baztertu dira azken aplikazio guztiak."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Ireki <xliff:g id="APP">%s</xliff:g> aplikazioari buruzko informazioa."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> abiarazten."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ez dago azkenaldi honetako ezer"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Dena garbitu duzu"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Aplikazioaren informazioa"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"pantaila-ainguratzea"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"bilatu"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Ezin izan da abiarazi <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> desgaituta dago modu seguruan."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Garbitu guztiak"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arrastatu hona pantaila zatitzeko"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Zatitze horizontala"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Zatitze bertikala"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Zatitze pertsonalizatua"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Zatitu pantaila eta ezarri goian"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Zatitu pantaila eta ezarri ezkerrean"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Zatitu pantaila eta ezarri eskuinean"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-fa/strings.xml b/packages/SystemUI/legacy/recents/res/values-fa/strings.xml
new file mode 100644
index 000000000000..61e87c113774
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-fa/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"نمای کلی."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"رد کردن <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> نادیده گرفته شد."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"همه برنامه‌های اخیر رد شدند."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"باز کردن اطلاعات برنامه <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> درحال شروع به کار است."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"بدون موارد اخیر"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"همه‌چیز را پاک کرده‌اید"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"اطلاعات برنامه"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"پین کردن صفحه"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"جستجو"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> شروع نشد."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> در حالت ایمن غیرفعال است."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"پاک کردن همه"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"برای استفاده از تقسیم صفحه، به اینجا بکشید"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"تقسیم افقی"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"تقسیم عمودی"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"سفارشی کردن تقسیم"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"تقسیم کردن صفحه به بالا"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"تقسیم کردن صفحه به چپ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"تقسیم کردن صفحه به راست"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-fi/strings.xml b/packages/SystemUI/legacy/recents/res/values-fi/strings.xml
new file mode 100644
index 000000000000..bf2e46112abc
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-fi/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Viimeisimmät"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Hylkää <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> hylättiin."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Kaikki viimeisimmät sovellukset on hylätty."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Avaa sovelluksen <xliff:g id="APP">%s</xliff:g> tiedot."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Käynnistetään <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ei viimeaikaisia kohteita"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Kaikki on hoidettu"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Sovellustiedot"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"näytön kiinnitys"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"haku"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> ei käynnistynyt."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> on poistettu käytöstä vikasietotilassa."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Poista kaikki"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Jaa näyttö vetämällä tähän."</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Vaakasuuntainen jako"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Pystysuuntainen jako"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Oma jako"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Jaa näyttö ylös"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Jaa näyttö vasemmalle"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Jaa näyttö oikealle"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-fr-rCA/strings.xml b/packages/SystemUI/legacy/recents/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000000..e60727e38074
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-fr-rCA/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Aperçu"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Supprimer <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> supprimée."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Toutes les applications récentes ont été supprimées."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Ouvre les détails de l\'application <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Lancement de <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Aucun élément récent"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Vous avez tout effacé"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Détails de l\'application"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"épinglage d\'écran"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"rechercher"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> est désactivée en mode sans échec."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Tout effacer"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Glissez l\'élément ici pour utiliser l\'écran partagé"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Séparation horizontale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Séparation verticale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Séparation personnalisée"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Écran partagé dans le haut"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Écran partagé à la gauche"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Écran partagé à la droite"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-fr/strings.xml b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml
new file mode 100644
index 000000000000..183b6beba76b
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Aperçu"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Supprimer l\'application <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Application <xliff:g id="APP">%s</xliff:g> supprimée."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Toutes les applications récentes ont été supprimées."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Ouvre les informations sur l\'application <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Lancement de l\'application <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Aucun élément récent"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Vous avez tout effacé"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informations sur l\'application"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"épinglage d\'écran"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"rechercher"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Impossible de lancer l\'application <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"L\'application <xliff:g id="APP">%s</xliff:g> est désactivée en mode sécurisé."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Tout effacer"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Faire glisser ici pour utiliser l\'écran partagé"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Séparation horizontale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Séparation verticale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Séparation personnalisée"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Partager l\'écran en haut"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Partager l\'écran sur la gauche"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Partager l\'écran sur la droite"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-gl/strings.xml b/packages/SystemUI/legacy/recents/res/values-gl/strings.xml
new file mode 100644
index 000000000000..008c7761c8e7
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-gl/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Visión xeral."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Rexeita <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Rexeitouse <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Rexeitáronse todas as aplicacións recentes."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Abre a información da aplicación <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Non hai elementos recentes"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Borraches todo"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Información da aplicación"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fixación de pantalla"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"buscar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Non se puido iniciar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"A aplicación <xliff:g id="APP">%s</xliff:g> está desactivada no modo seguro."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Borrar todo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arrastra aquí para usar a pantalla dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Dividir horizontalmente"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Dividir verticalmente"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Dividir de xeito personalizado"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dividir pantalla arriba"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dividir pantalla á esquerda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dividir pantalla á dereita"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-gu/strings.xml b/packages/SystemUI/legacy/recents/res/values-gu/strings.xml
new file mode 100644
index 000000000000..33dc7e8c7ee0
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-gu/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ઝલક."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખો."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખી."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"તાજેતરની બધી ઍપ્લિકેશનો કાઢી નાખવામાં આવી."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g>ની ઍપ્લિકેશન માહિતી ખોલો."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g>ને શરૂ કરી રહ્યાં છીએ."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"તાજેતરની કોઈ આઇટમ નથી"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"તમે બધું સાફ કર્યું"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ઍપ્લિકેશનની માહિતી"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"સ્ક્રીન પિનિંગ"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"શોધો"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>ને શરૂ કરી શકાઈ નથી."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"સુરક્ષિત મોડમાં <xliff:g id="APP">%s</xliff:g>ને બંધ કરવામાં આવી છે."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"બધું સાફ કરો"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરવા માટે અહીં ખેંચો"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"સ્ક્રીનને આડી વિભાજિત કરો"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"સ્ક્રીનને ઊભી વિભાજિત કરો"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"સ્ક્રીનને કસ્ટમ વિભાજિત કરો"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"સ્ક્રીનને ઉપરની તરફ વિભાજિત કરો"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"સ્ક્રીનને ડાબી તરફ વિભાજિત કરો"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"સ્ક્રીનને જમણી તરફ વિભાજિત કરો"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-hi/strings.xml b/packages/SystemUI/legacy/recents/res/values-hi/strings.xml
new file mode 100644
index 000000000000..c9ac2a0a06ef
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-hi/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"खास जानकारी."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> को खारिज करें."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> खारिज किया गया."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"हाल के सभी ऐप्लिकेशन खारिज कर दिए गए हैं."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन की जानकारी खोलें."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> शुरू किया जा रहा है."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"हाल का कोई आइटम नहीं है"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"आपने सब कुछ हटा दिया है"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ऐप्लिकेशन की जानकारी"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"स्क्रीन पिन करना"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"खोजें"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> शुरू नहीं किया जा सका."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> को सुरक्षित-मोड में बंद किया गया."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"सभी ऐप्लिकेशन बंद करें"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"स्क्रीन को दो हिस्सों में बाँटने (स्प्लिट स्क्रीन) के लिए यहां से खींचें और छोड़ें"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"क्षैतिज रूप से दो हिस्सों में बाँटें (स्प्लिट करें)"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"लम्बवत रूप से दो हिस्सों में बाँटें (स्प्लिट करें)"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"अपने मुताबिक दो हिस्सों में बाँटें (स्प्लिट स्क्रीन करें)"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ऊपर की ओर दो स्क्रीन बनाएं"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"बाईं ओर दो स्क्रीन बनाएं"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"दाईं ओर दो स्क्रीन बनाएं"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-hr/strings.xml b/packages/SystemUI/legacy/recents/res/values-hr/strings.xml
new file mode 100644
index 000000000000..88926a4f8c76
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-hr/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Pregled."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Odbacivanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Odbačena je aplikacija <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Odbačene su sve nedavne aplikacije."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otvaranje informacija o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Pokreće se aplikacija <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nema nedavnih stavki"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Izbrisali ste sve"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informacije o aplikaciji"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"prikačivanje zaslona"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pretraživanje"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikacija <xliff:g id="APP">%s</xliff:g> onemogućena je u sigurnom načinu."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Izbriši sve"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Povucite ovdje da biste upotrebljavali podijeljeni zaslon"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Podijeli vodoravno"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Podijeli okomito"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Podijeli prilagođeno"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Podijeli zaslon na vrhu"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Podijeli zaslon slijeva"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Podijeli zaslon zdesna"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-hu/strings.xml b/packages/SystemUI/legacy/recents/res/values-hu/strings.xml
new file mode 100644
index 000000000000..d0429e76fb40
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-hu/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Áttekintés."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"A(z) <xliff:g id="APP">%s</xliff:g> elvetése."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> eltávolítva."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Az összes alkalmazás eltávolítva a nemrég használtak közül."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"A(z) <xliff:g id="APP">%s</xliff:g> alkalmazás adatainak megnyitása."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"A(z) <xliff:g id="APP">%s</xliff:g> indítása."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nincsenek mostanában használt elemek"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Mindent törölt"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Az alkalmazás adatai"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"képernyő rögzítése"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"keresés"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Nem lehet elindítani a következőt: <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"A(z) <xliff:g id="APP">%s</xliff:g> csökkentett módban le van tiltva."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Összes törlése"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Húzza ide az osztott képernyő használatához"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Osztott vízszintes"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Osztott függőleges"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Osztott egyéni"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Osztott képernyő felülre"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Osztott képernyő balra"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Osztott képernyő jobbra"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-hy/strings.xml b/packages/SystemUI/legacy/recents/res/values-hy/strings.xml
new file mode 100644
index 000000000000..c56b691ed126
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-hy/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Համատեսք:"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Հեռացնել <xliff:g id="APP">%s</xliff:g> հավելվածը ցուցակից:"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> հավելվածը հեռացվել է ցուցակից:"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Բոլոր վերջին հավելվածները հեռացվել են ցուցակից:"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Բացել <xliff:g id="APP">%s</xliff:g> հավելվածի մասին տեղեկությունները"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> հավելվածը գործարկվում է:"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Այստեղ դեռ ոչինչ չկա"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Ցուցակը դատարկ է"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Հավելվածի մասին"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"էկրանի ամրացում"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"որոնում"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Չհաջողվեց գործարկել <xliff:g id="APP">%s</xliff:g> հավելվածը:"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> հավելվածը անվտանգ ռեժիմում անջատված է:"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ջնջել բոլորը"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Քաշեք այստեղ՝ էկրանի տրոհումն օգտագործելու համար"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Հորիզոնական տրոհում"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Ուղղահայաց տրոհում"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Հատուկ տրոհում"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Տրոհել էկրանը վերևից"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Տրոհել էկրանը ձախից"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Տրոհել էկրանն աջից"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-in/strings.xml b/packages/SystemUI/legacy/recents/res/values-in/strings.xml
new file mode 100644
index 000000000000..aa9dcfe1b197
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-in/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Ringkasan."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Hapus <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dihapus."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Semua aplikasi yang baru dibuka telah dihapus."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Buka info aplikasi <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Memulai <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Tidak ada item yang baru dibuka"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Anda sudah menghapus semua"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Info Aplikasi"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"pin ke layar"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"telusuri"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Tidak dapat memulai <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> dinonaktifkan dalam mode aman."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Hapus semua"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Tarik ke sini untuk menggunakan layar terpisah"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Pisahkan Horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Pisahkan Vertikal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Pisahkan Khusus"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Pisahkan layar ke atas"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Pisahkan layar ke kiri"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Pisahkan layar ke kanan"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-is/strings.xml b/packages/SystemUI/legacy/recents/res/values-is/strings.xml
new file mode 100644
index 000000000000..e0a555e63976
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-is/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Yfirlit."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Fjarlægja <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> fjarlægt."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Öll nýleg forrit fjarlægð."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Opna forritsupplýsingar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Ræsir <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Engin nýleg atriði"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Þú hefur hreinsað allt"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Forritsupplýsingar"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"skjáfesting"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"leita"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Ekki var hægt að ræsa <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Slökkt er á <xliff:g id="APP">%s</xliff:g> í öruggri stillingu."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Hreinsa allt"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Dragðu hingað til að skipta skjánum"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Lárétt skipting"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Lóðrétt skipting"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Sérsniðin skipting"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Skipta skjá að ofanverðu"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Skipta skjá til vinstri"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Skipta skjá til hægri"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-it/strings.xml b/packages/SystemUI/legacy/recents/res/values-it/strings.xml
new file mode 100644
index 000000000000..e04d56038ac1
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-it/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Panoramica."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Elimina <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> eliminata."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Tutte le applicazioni recenti sono state rimosse."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Mostra informazioni sull\'applicazione <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Avvio di <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nessun elemento recente"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Hai cancellato tutto"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informazioni sull\'applicazione"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"blocco su schermo"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"cerca"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Impossibile avviare <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"L\'app <xliff:g id="APP">%s</xliff:g> è stata disattivata in modalità provvisoria."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Cancella tutto"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Trascina qui per utilizzare la modalità Schermo diviso"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Divisione in orizzontale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Divisione in verticale"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Divisione personalizzata"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Schermo diviso in alto"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Schermo diviso a sinistra"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Schermo diviso a destra"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-iw/strings.xml b/packages/SystemUI/legacy/recents/res/values-iw/strings.xml
new file mode 100644
index 000000000000..a96c709b4be6
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-iw/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"סקירה כללית."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"הסרה של <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> הוסרה."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"כל האפליקציות האחרונות הוסרו."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"פתיחת מידע על האפליקציה <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"מפעיל את <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"אין פריטים אחרונים"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"מחקת הכול"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"מידע על האפליקציה"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"הקפאת מסך"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"חיפוש"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"לא ניתן היה להפעיל את <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> מושבתת במצב בטוח."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ניקוי הכול"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"יש לגרור לכאן כדי להשתמש במסך מפוצל"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"פיצול אופקי"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"פיצול אנכי"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"פיצול מותאם אישית"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"פיצול מסך למעלה"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"פיצול מסך לשמאל"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"פיצול מסך לימין"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ja/strings.xml b/packages/SystemUI/legacy/recents/res/values-ja/strings.xml
new file mode 100644
index 000000000000..4d7524c72300
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ja/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"最近"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g>を削除します。"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g>を削除しました。"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"最近のアプリをすべて削除しました。"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g>のアプリ情報を開きます。"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g>を開始しています。"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"最近のアイテムはありません"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"すべてのタスクを削除しました"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"アプリ情報"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"画面固定"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"検索"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>を開始できませんでした。"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g>はセーフモードでは無効になります。"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"すべて消去"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"分割画面を使用するにはここにドラッグします"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"横に分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"縦に分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"分割(カスタム)"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"画面を上に分割"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"画面を左に分割"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"画面を右に分割"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ka/strings.xml b/packages/SystemUI/legacy/recents/res/values-ka/strings.xml
new file mode 100644
index 000000000000..088388bfdc70
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ka/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"მიმოხილვა"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g>-ის დახურვა."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> დაიხურა."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ყველა ბოლოდროინდელი აპლიკაცია დაიხურა."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> აპლიკაციის ინფორმაციის გახსნა."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"მიმდინარეობს <xliff:g id="APP">%s</xliff:g>-ის გაშვება."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ბოლოდროინდელი ერთეულები არ არის"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"ყველაფერი გასუფთავდა"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"აპლიკაციის ინფორმაცია"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ეკრანზე ჩამაგრება"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ძიება"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>-ის გაშვება ვერ მოხერხდა."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> გათიშულია უსაფრთხო რეჟიმში."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ყველას გასუფთავება"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"ეკრანის გასაყოფად ჩავლებით გადმოიტანეთ აქ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"ჰორიზონტალური გაყოფა"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ვერტიკალური გაყოფა"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"მორგებული გაყოფა"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ეკრანის გაყოფა ზემოთ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"ეკრანის გაყოფა მარცხნივ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"ეკრანის გაყოფა მარჯვნივ"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-kk/strings.xml b/packages/SystemUI/legacy/recents/res/values-kk/strings.xml
new file mode 100644
index 000000000000..9d4e01c138ee
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-kk/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Жалпы ақпарат."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> қолданбасын өшіру."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> өшірілді."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Барлық қолданбалар \"Соңғылар\" тізімінен өшірілді."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> қолданбасы туралы ақпаратты ашу."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> іске қосылды."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ешқандай соңғы элементтер жоқ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Барлығын өшірдіңіз"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Қолданба туралы ақпарат"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"экранды бекіту"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"іздеу"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> іске қосылмады."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> қауіпсіз режимде өшіріледі."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Барлығын өшіру"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Экранды бөлу үшін осы жерге сүйреңіз"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Көлденеңінен бөлу"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Тігінен бөлу"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Бөлу (арнаулы)"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Экранды жоғары жағынан бөлу"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Экранды сол жағынан бөлу"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Экранды оң жағынан бөлу"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-km/strings.xml b/packages/SystemUI/legacy/recents/res/values-km/strings.xml
new file mode 100644
index 000000000000..b7bfba67bbcf
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-km/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ទិដ្ឋភាពរួម។"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"ច្រានចោល <xliff:g id="APP">%s</xliff:g> ។"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"បាន​ច្រានចោល <xliff:g id="APP">%s</xliff:g> ។"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"បាន​ច្រានចោល​កម្មវិធីថ្មីៗ​ទាំងអស់។"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"បើក​ព័ត៌មាន​កម្មវិធី <xliff:g id="APP">%s</xliff:g> ។"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"កំពុង​ចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ។"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"មិនមានធាតុថ្មីៗទេ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"អ្នក​បានសម្អាត​អ្វីៗ​គ្រប់យ៉ាង"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ព័ត៌មាន​កម្មវិធី"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ការ​ភ្ជាប់​អេក្រង់"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ស្វែង​រក"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"មិន​អាច​ចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> បានទេ។"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ត្រូវបាន​បិទ​ដំណើរការ​ក្នុងមុខងារ​សុវត្ថិភាព។"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"សម្អាត​ទាំងអស់"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"អូសនៅទីនេះដើម្បីប្រើអេក្រង់បំបែក"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"បំបែកផ្តេក"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"បំបែកបញ្ឈរ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"បំបែកផ្ទាល់ខ្លួន"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"បំបែក​អេក្រង់​ទៅ​ខាងលើ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"បំបែក​អេក្រង់​ទៅ​ខាងឆ្វេង"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"បំបែក​អេក្រង់​ទៅ​ខាងស្តាំ"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-kn/strings.xml b/packages/SystemUI/legacy/recents/res/values-kn/strings.xml
new file mode 100644
index 000000000000..84894c12c7e8
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-kn/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ಸಮಗ್ರ ನೋಟ."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಿ."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ಇತ್ತೀಚಿನ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ ಮಾಹಿತಿ ತೆರೆಯಿರಿ."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"ನೀವು ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿರುವಿರಿ"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ಸ್ಕ್ರೀನ್ ಪಿನ್ನಿಂಗ್"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ಹುಡುಕಾಟ"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲು ಸಾದ್ಯವಾಗಲಿಲ್ಲ."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"ವಿಭಜಿತ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬಳಸಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್‌ ಮಾಡಿ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ಮೇಲ್ಭಾಗಕ್ಕೆ ಸ್ಕ್ರೀನ್ ಅನ್ನು ವಿಭಜಿಸಿ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"ಎಡಕ್ಕೆ ಸ್ಕ್ರೀನ್ ಅನ್ನು ವಿಭಜಿಸಿ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"ಬಲಕ್ಕೆ ಸ್ಕ್ರೀನ್ ಅನ್ನು ವಿಭಜಿಸಿ"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ko/strings.xml b/packages/SystemUI/legacy/recents/res/values-ko/strings.xml
new file mode 100644
index 000000000000..ee856bd21418
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ko/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"최근 사용"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g>을(를) 닫습니다."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> 애플리케이션을 닫았습니다."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"최근 사용한 애플리케이션을 모두 닫았습니다."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> 애플리케이션 정보를 엽니다."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g>을(를) 시작하는 중입니다."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"최근 항목이 없습니다."</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"모든 항목을 삭제했습니다."</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"애플리케이션 정보"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"화면 고정"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"검색"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>을(를) 시작할 수 없습니다."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g>은(는) 안전 모드에서 사용 중지됩니다."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"모두 삭제"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"여기를 드래그하여 분할 화면 사용하기"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"수평 분할"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"수직 분할"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"맞춤 분할"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"위쪽으로 화면 분할"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"왼쪽으로 화면 분할"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"오른쪽으로 화면 분할"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ky/strings.xml b/packages/SystemUI/legacy/recents/res/values-ky/strings.xml
new file mode 100644
index 000000000000..879e492f6330
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ky/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Сереп салуу."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> колдонмосун өчүрүү."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> колдонмосу өчүрүлдү."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Акыркы колдонмолордун баары өчүрүлдү."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> колдонмосу жөнүндө маалыматты ачыңыз."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> ачылууда."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Акыркы колдонмолор жок"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Баарын тазаладыңыз"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Колдонмо жөнүндө маалымат"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"экран кадоо"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"издөө"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> колдонмосу ачылган жок"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> коопсуз режиминде өчүрүлдү."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Баарын тазалоо"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Экранды бөлүү үчүн бул жерге сүйрөңүз"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Туурасынан бөлүү"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Тигинен бөлүү"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Ыңгайлаштырылган бөлүү"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Экранды өйдө жакка бөлүү"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Экранды сол жакка бөлүү"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Экранды оң жакка бөлүү"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-lo/strings.xml b/packages/SystemUI/legacy/recents/res/values-lo/strings.xml
new file mode 100644
index 000000000000..17f56b457ad7
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-lo/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ພາບຮວມ."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"ປິດ <xliff:g id="APP">%s</xliff:g> ໄວ້."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"ປິດ <xliff:g id="APP">%s</xliff:g> ແລ້ວ."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ທຸກແອັບພລິເຄຊັນບໍ່ດົນມານີ້ຖືກປິດໄວ້ແລ້ວ."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"ເປີດຂໍ້ມູນແອັບພລິເຄຊັນ <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"ກຳລັງເປີດ <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"ທ່ານລຶບລ້າງທຸກຢ່າງແລ້ວ"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ຂໍ້ມູນແອັບພລິເຄຊັນ"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ການປັກໝຸດໜ້າຈໍ"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ຊອກຫາ"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"ບໍ່ສາມາດເລີ່ມ <xliff:g id="APP">%s</xliff:g> ໄດ້."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ຖືກປິດໃຊ້ໃນໂໝດຄວາມມປອດໄພ."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ລຶບລ້າງທັງໝົດ"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"ລາກມາບ່ອນນີ້ເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"ການແຍກລວງຂວາງ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ການແຍກລວງຕັ້ງ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"ການແຍກກຳນົດເອງ"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ແຍກໜ້າຈໍໄປທາງເທິງ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"ແຍກໜ້າຈໍໄປທາງຊ້າຍ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"ແຍກໜ້າຈໍໄປທາງຂວາ"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-lt/strings.xml b/packages/SystemUI/legacy/recents/res/values-lt/strings.xml
new file mode 100644
index 000000000000..4a9eb83bf3d5
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-lt/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Apžvalga."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Atsisakyti programos „<xliff:g id="APP">%s</xliff:g>“."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Atsisakyta programos „<xliff:g id="APP">%s</xliff:g>“."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Atsisakyta visų naujausių programų."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Atidaryti programos „<xliff:g id="APP">%s</xliff:g>“ informaciją."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Paleidžiama programa „<xliff:g id="APP">%s</xliff:g>“."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nėra jokių naujausių elementų"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Viską išvalėte"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Programos informacija"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ekrano prisegimas"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ieškoti"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Nepavyko paleisti programos „<xliff:g id="APP">%s</xliff:g>“."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Programa „<xliff:g id="APP">%s</xliff:g>“ išjungta saugos režimu."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Išvalyti viską"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Vilkite čia, kad naudotumėte skaidytą ekraną"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horizontalus skaidymas"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikalus skaidymas"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Tinkintas skaidymas"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Skaidyti ekraną į viršų"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Skaidyti ekraną į kairę"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Skaidyti ekraną į dešinę"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-lv/strings.xml b/packages/SystemUI/legacy/recents/res/values-lv/strings.xml
new file mode 100644
index 000000000000..7d87e0033777
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-lv/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Pārskats."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Nerādīt lietotni <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Vairs netiek rādīta lietotne <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Vairs netiek rādīta neviena nesen izmantotā lietojumprogramma."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Atveriet lietojumprogrammas <xliff:g id="APP">%s</xliff:g> informāciju."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Notiek lietotnes <xliff:g id="APP">%s</xliff:g> palaišana."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nav nesenu vienumu"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Visi uzdevumi ir notīrīti"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Lietojumprogrammas informācija"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"Piespraust ekrānu"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"Meklēt"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Nevarēja palaist lietotni <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Lietotne <xliff:g id="APP">%s</xliff:g> ir atspējota drošajā režīmā."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Notīrīt visu"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Velciet šeit, lai izmantotu ekrāna sadalīšanu"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horizontāls dalījums"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikāls dalījums"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Pielāgots dalījums"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Sadalīt ekrānu augšdaļā"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Sadalīt ekrānu kreisajā pusē"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Sadalīt ekrānu labajā pusē"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-mk/strings.xml b/packages/SystemUI/legacy/recents/res/values-mk/strings.xml
new file mode 100644
index 000000000000..d8ced0b55310
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-mk/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Преглед."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Отфрлете ја <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> е отфрлена."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Сите неодамнешни апликации се отфрлени."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Отворете информации за апликацијата <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Се стартува <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Нема неодамнешни ставки"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Избришавте сѐ"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Информации за апликацијата"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"прикачување екран"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"пребарувај"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> не можеше да се стартува."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> е оневозможена во безбеден режим."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Избриши сѐ"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Повлечете тука за да користите поделен екран"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Подели хоризонтално"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Подели вертикално"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Подели приспособено"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Подели го екранот во горниот дел"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Подели го екранот на левата страна"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Подели го екранот на десната страна"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-mn/strings.xml b/packages/SystemUI/legacy/recents/res/values-mn/strings.xml
new file mode 100644
index 000000000000..205f56c233d0
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-mn/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Тойм."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g>-г үл хэрэгсэнэ үү."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g>-г үл хэрэгссэн."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Саяхны бүх аппыг үл хэрэгссэн."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> аппын мэдээллийг нээнэ үү."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж байна."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Саяхны зүйлс алга"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Та бүгдийг нь устгасан"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Аппын мэдээлэл"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"дэлгэц тогтоох"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"хайх"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж чадсангүй."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g>-г аюулгүй горимд идэвхгүй болгосон."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Бүгдийг устгах"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Хуваасан дэлгэцийг ашиглахын тулд энд чирэх"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Хэвтээ чиглэлд хуваах"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Босоо чиглэлд хуваах"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Хүссэн хэлбэрээр хуваах"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Дэлгэцийг дээд хэсэгт хуваах"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Дэлгэцийг зүүн хэсэгт хуваах"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Дэлгэцийг баруун хэсэгт хуваах"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-mr/strings.xml b/packages/SystemUI/legacy/recents/res/values-mr/strings.xml
new file mode 100644
index 000000000000..51bce6d41422
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-mr/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"अवलोकन."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> डिसमिस करा."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> डिसमिस केले"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"अलीकडील सर्व अॅप्लिकेशन डिसमिस झाले."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> अॅप्लिकेशन माहिती उघडा."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> सुरू करत आहे."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"कोणतेही अलीकडील आयटम नाहीत"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"तुम्ही सर्वकाही साफ केले"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"अॅप्लिकेशन माहिती"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"स्‍क्रीन पिन करणे"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"शोधा"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> सुरू करता आले नाही."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> सुरक्षित मोडमध्ये बंद केले आहे."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"सर्व साफ करा"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"स्प्लिट स्क्रीन वापर करण्यासाठी येथे ड्रॅग करा"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"आडवे स्प्लिट करा"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"उभे स्प्लिट करा"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"कस्टम स्प्लिट करा"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"स्क्रीन वर स्प्लिट करा"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"स्क्रीन डावीकडे स्प्लिट करा"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"स्क्रीन उजवीकडे स्प्लिट करा"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ms/strings.xml b/packages/SystemUI/legacy/recents/res/values-ms/strings.xml
new file mode 100644
index 000000000000..ae4461d19b78
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ms/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Ikhtisar."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ketepikan <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> diketepikan."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Semua aplikasi terbaharu diketepikan."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Buka maklumat aplikasi <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Memulakan <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Tiada item terbaharu"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Anda telah mengetepikan semua item"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Maklumat Aplikasi"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"penyematan skrin"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"cari"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Tidak dapat memulakan <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> dilumpuhkan dalam mod selamat."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Kosongkan semua"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Seret ke sini untuk menggunakan skrin pisah"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Pisah Mendatar"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Pisah Menegak"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Pisah Tersuai"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Pisahkan skrin ke atas"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Pisahkan skrin ke kiri"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Pisahkan skrin ke kanan"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-my/strings.xml b/packages/SystemUI/legacy/recents/res/values-my/strings.xml
new file mode 100644
index 000000000000..94fc6628312f
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-my/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"အနှစ်ချုပ်။"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> ကို ပယ်မည်။"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> ကို ဖယ်ထုတ်ထားသည်။"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"လတ်တလော အပလီကေးရှင်းအားလုံး ဖယ်ထုတ်ထားသည်။"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> အပလီကေးရှင်း အချက်အလက်ကို ဖွင့်မည်။"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> ကို စတင်နေသည်။"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"လတ်တလော ဖွင့်ထားသည်များ မရှိပါ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"အားလုံးကို ဖယ်ရှားပြီးပါပြီ"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"အပလီကေးရှင်း အချက်အလက်"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"မျက်နှာပြင် ပင်ထိုးမှု"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ရှာရန်"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> ကို စတင်၍ မရပါ။"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"အန္တရာယ်ကင်းမှု စနစ်တွင် <xliff:g id="APP">%s</xliff:g> ကို ပိတ်ထားပါသည်။"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"အားလုံး ဖယ်ရှားရန်"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းကို အသုံးပြုရန် ဤနေရာသို့ ဖိဆွဲပါ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"အလျားလိုက် ခွဲရန်"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ထောင်လိုက် ခွဲရန်"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"စိတ်ကြိုက် ခွဲရန်"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"မျက်နှာပြင်ကို အပေါ်သို့ ခွဲရန်"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"မျက်နှာပြင်ကို ဘယ်ဘက်သို့ ခွဲရန်"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"မျက်နှာပြင်ကို ညာဘက်သို့ ခွဲရန်"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-nb/strings.xml b/packages/SystemUI/legacy/recents/res/values-nb/strings.xml
new file mode 100644
index 000000000000..176986ab5132
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-nb/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Oversikt."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Avvis <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> er avvist."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alle nylig brukte apper er avvist."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Åpne appinformasjonen for <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Starter <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ingen nylige elementer"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Du har fjernet alt"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Appinformasjon"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"én-appsmodus"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"søk"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Kunne ikke starte <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> er slått av i sikker modus."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Fjern alt"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Dra hit for å bruke delt skjerm"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Del horisontalt"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Del vertikalt"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Del tilpasset"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Delt skjerm øverst"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Delt skjerm til venstre"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Delt skjerm til høyre"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-nl/strings.xml b/packages/SystemUI/legacy/recents/res/values-nl/strings.xml
new file mode 100644
index 000000000000..97140229319a
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-nl/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overzicht."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> sluiten."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> verwijderd."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alle recente apps gesloten."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"App-gegevens voor <xliff:g id="APP">%s</xliff:g> openen."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> starten."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Geen recente items"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Je hebt alles gewist"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"App-informatie"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"scherm vastzetten"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"zoeken"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Kan <xliff:g id="APP">%s</xliff:g> niet starten."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> is uitgeschakeld in de veilige modus"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Alles wissen"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Sleep hier naartoe om het scherm te splitsen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horizontaal splitsen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Verticaal splitsen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Aangepast splitsen"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Scherm bovenaan gesplitst"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Scherm links gesplitst"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Scherm rechts gesplitst"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-pa/strings.xml b/packages/SystemUI/legacy/recents/res/values-pa/strings.xml
new file mode 100644
index 000000000000..4608561fa1ce
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-pa/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ਰੂਪ-ਰੇਖਾ।"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖਾਰਜ ਕਰੋ।"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> ਖਾਰਜ ਕੀਤੀ ਗਈ।"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ਸਾਰੀਆਂ ਹਾਲੀਆ ਐਪਲੀਕੇਸ਼ਨਾਂ ਖਾਰਜ ਕੀਤੀਆਂ ਗਈਆਂ।"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> ਐਪਲੀਕੇਸ਼ਨਾਂ ਜਾਣਕਾਰੀ ਖੋਲ੍ਹੋ।"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> ਚਾਲੂ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ।"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"ਤੁਸੀਂ ਸਭ ਕੁਝ ਸਾਫ਼ ਕਰ ਦਿੱਤਾ ਹੈ"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਣਕਾਰੀ"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ਸਕ੍ਰੀਨ ਪਿਨਿੰਗ"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ਖੋਜ"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰ ਸਕੇ।"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਸੁਰੱਖਿਅਤ-ਮੋਡ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ।"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"ਲੇਟਵੀਂ ਵੰਡ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"ਖੜ੍ਹਵੀਂ ਵੰਡ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"ਵਿਉਂਤੀ ਵੰਡ"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"ਸਕ੍ਰੀਨ ਨੂੰ ਉੱਪਰ ਵੱਲ ਵੰਡੋ"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"ਸਕ੍ਰੀਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਵੰਡੋ"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"ਸਕ੍ਰੀਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਵੰਡੋ"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-pl/strings.xml b/packages/SystemUI/legacy/recents/res/values-pl/strings.xml
new file mode 100644
index 000000000000..50b4ad009490
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-pl/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Przegląd."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Zamknij aplikację <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikacja <xliff:g id="APP">%s</xliff:g> została zamknięta."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Wszystkie ostatnie aplikacje zostały zamknięte."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otwórz informacje o aplikacji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Uruchamiam aplikację <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Brak ostatnich elementów"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Wszystko zostało wyczyszczone"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informacje o aplikacji"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"przypinanie ekranu"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"szukaj"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Nie udało się uruchomić aplikacji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikacja <xliff:g id="APP">%s</xliff:g> została wyłączona w trybie bezpiecznym."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Wyczyść wszystko"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Przeciągnij tutaj, by podzielić ekran"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Podziel poziomo"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Podziel pionowo"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Podziel niestandardowo"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Podziel ekran u góry"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Podziel ekran z lewej"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Podziel ekran z prawej"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-pt-rBR/strings.xml b/packages/SystemUI/legacy/recents/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000000..589b831e2a15
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-pt-rBR/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Visão geral."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dispensar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dispensado."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Todos os aplicativos recentes foram dispensados."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Abre informações do aplicativo <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nenhum item recente"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Você limpou tudo"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informações do aplicativo"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fixação de tela"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pesquisar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"O app <xliff:g id="APP">%s</xliff:g> fica desativado no modo de segurança."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Limpar tudo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arraste aqui para usar a tela dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Divisão horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Divisão vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Divisão personalizada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dividir a tela para a parte superior"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dividir a tela para a esquerda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dividir a tela para a direita"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-pt-rPT/strings.xml b/packages/SystemUI/legacy/recents/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000000..e62e1c62034a
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-pt-rPT/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Vista geral."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ignorar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplicação <xliff:g id="APP">%s</xliff:g> ignorada."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Todas as aplicações recentes foram ignoradas."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Abrir as informações da aplicação <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"A iniciar a aplicação <xliff:g id="APP">%s</xliff:g>…"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nenhum item recente"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Limpou tudo"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informações da aplicação"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"afixação no ecrã"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pesquisar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Não foi possível iniciar a aplicação <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"A aplicação <xliff:g id="APP">%s</xliff:g> está desativada no modo de segurança."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Limpar tudo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arraste aqui para utilizar o ecrã dividido"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Divisão horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Divisão vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Divisão personalizada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Ecrã dividido na parte superior"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Ecrã dividido à esquerda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Ecrã dividido à direita"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-pt/strings.xml b/packages/SystemUI/legacy/recents/res/values-pt/strings.xml
new file mode 100644
index 000000000000..589b831e2a15
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-pt/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Visão geral."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Dispensar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> dispensado."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Todos os aplicativos recentes foram dispensados."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Abre informações do aplicativo <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nenhum item recente"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Você limpou tudo"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informações do aplicativo"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fixação de tela"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"pesquisar"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"O app <xliff:g id="APP">%s</xliff:g> fica desativado no modo de segurança."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Limpar tudo"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Arraste aqui para usar a tela dividida"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Divisão horizontal"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Divisão vertical"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Divisão personalizada"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Dividir a tela para a parte superior"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Dividir a tela para a esquerda"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Dividir a tela para a direita"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ro/strings.xml b/packages/SystemUI/legacy/recents/res/values-ro/strings.xml
new file mode 100644
index 000000000000..7f8f018be6bc
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ro/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Recente."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Închideți <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> a fost închisă."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Toate aplicațiile recente au fost închise."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Deschideți informațiile despre aplicația <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Se inițiază <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Niciun element recent"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Ați șters tot"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informații despre aplicație"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fixare pe ecran"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"căutați"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> nu a putut porni."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplicația <xliff:g id="APP">%s</xliff:g> este dezactivată în modul sigur."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ștergeți tot"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Trageți aici pentru a folosi ecranul împărțit"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Împărțiți pe orizontală"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Împărțiți pe verticală"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Împărțiți personalizat"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Împărțiți ecranul în partea de sus"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Împărțiți ecranul la stânga"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Împărțiți ecranul la dreapta"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ru/strings.xml b/packages/SystemUI/legacy/recents/res/values-ru/strings.xml
new file mode 100644
index 000000000000..1e988bb21502
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ru/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Обзор."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Удалить приложение <xliff:g id="APP">%s</xliff:g> из списка."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Приложение <xliff:g id="APP">%s</xliff:g> удалено из списка."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Все недавние приложения удалены из списка."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Открыть информацию о приложении <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Запуск приложения <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Здесь пока ничего нет."</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Список пуст."</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Сведения о приложении"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"блокировка в приложении"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"поиск"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Не удалось запустить приложение \"<xliff:g id="APP">%s</xliff:g>\"."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" отключено в безопасном режиме."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Удалить все"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Перетащите сюда, чтобы разделить экран"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Разделить по горизонтали"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Разделить по вертикали"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Разделить по-другому"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Разделить экран по верхнему краю"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Разделить экран по левому краю"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Разделить экран по правому краю"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sk/strings.xml b/packages/SystemUI/legacy/recents/res/values-sk/strings.xml
new file mode 100644
index 000000000000..cbffcaf836ec
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sk/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Prehľad"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Zrušiť aplikáciu <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Všetky nedávne aplikácie boli zrušené."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Otvoriť informácie o aplikácii <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Spúšťa sa aplikácia <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Žiadne nedávne položky"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Vymazali ste všetko"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informácie o aplikácii"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"pripnutie obrazovky"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"hľadať"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Aplikáciu <xliff:g id="APP">%s</xliff:g> sa nepodarilo spustiť."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikácia <xliff:g id="APP">%s</xliff:g> je v núdzovom režime zakázaná."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Vymazať všetko"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Presuňte okno sem a použite tak rozdelenú obrazovku"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Rozdeliť vodorovné"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Rozdeliť zvislé"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Rozdeliť vlastné"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Rozdelená obrazovka hore"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Rozdelená obrazovka naľavo"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Rozdelená obrazovka napravo"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sl/strings.xml b/packages/SystemUI/legacy/recents/res/values-sl/strings.xml
new file mode 100644
index 000000000000..56b2ddb63314
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sl/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Pregled."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Opustitev aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Aplikacija <xliff:g id="APP">%s</xliff:g> je bila odstranjena."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Vse nedavne aplikacije so bile opuščene."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Odpiranje podatkov o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Zaganjanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Ni nedavnih elementov"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Vse ste počistili"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Podatki o aplikaciji"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"pripenjanje zaslona"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"išči"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Aplikacije <xliff:g id="APP">%s</xliff:g> ni bilo mogoče zagnati."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Aplikacija <xliff:g id="APP">%s</xliff:g> je v varnem načinu onemogočena."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Počisti vse"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Povlecite sem za razdeljeni zaslon"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Razdeli vodoravno"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Razdeli navpično"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Razdeli po meri"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Razdeljen zaslon na vrhu"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Razdeljen zaslon na levi"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Razdeljen zaslon na desni"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sq/strings.xml b/packages/SystemUI/legacy/recents/res/values-sq/strings.xml
new file mode 100644
index 000000000000..48aab371087c
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sq/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Përmbledhja."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Largo <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> është hequr."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Të gjitha aplikacionet e fundit u larguan."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Hap informacionin e aplikacionit <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Po nis <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Nuk ka asnjë artikull të fundit"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"I ke pastruar të gjitha"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Informacioni i aplikacionit"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"kyçja e ekranit"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"kërko"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> nuk mund të nisej."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> është i çaktivizuar në modalitetin e sigurt."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Pastroji të gjitha"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Zvarrit këtu për të përdorur ekranin e ndarë"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Horizontal i ndarë"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikal i ndarë"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"I personalizuar i ndarë"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Ndaje ekranin lart"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Ndaje ekranin në të majtë"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Ndaje ekranin në të djathtë"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sr/strings.xml b/packages/SystemUI/legacy/recents/res/values-sr/strings.xml
new file mode 100644
index 000000000000..9d5f126181bd
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sr/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Преглед."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Одбаците апликацију <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Апликација <xliff:g id="APP">%s</xliff:g> је одбачена."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Све недавно коришћене апликације су одбачене."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Отворите информације о апликацији <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Покреће се <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Нема недавних ставки"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Обрисали сте све"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Информације о апликацији"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"качење екрана"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"претражи"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Покретање апликације <xliff:g id="APP">%s</xliff:g> није успело."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Апликација <xliff:g id="APP">%s</xliff:g> је онемогућена у безбедном режиму."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Обриши све"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Превуците овде да бисте користили раздељени екран"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Подели хоризонтално"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Подели вертикално"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Подели прилагођено"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Подели екран нагоре"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Подели екран налево"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Подели екран надесно"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sv/strings.xml b/packages/SystemUI/legacy/recents/res/values-sv/strings.xml
new file mode 100644
index 000000000000..b2ee34fbd284
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sv/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Översikt."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ta bort <xliff:g id="APP">%s</xliff:g> från listan."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> togs bort från listan."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Alla appar har tagits bort från listan Senaste."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Öppna appinformation för <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Startar <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Listan är tom"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Du har tömt listan"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Appinformation"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"fästa skärmen"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"sök"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Det gick inte att starta appen <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> är inaktiverad i säkert läge."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Rensa alla"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Dra hit för att dela upp skärmen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Dela vågrätt"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Dela lodrätt"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Dela anpassat"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Delad skärm till överkanten"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Delad skärm åt vänster"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Delad skärm åt höger"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-sw/strings.xml b/packages/SystemUI/legacy/recents/res/values-sw/strings.xml
new file mode 100644
index 000000000000..49e7fb80e435
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-sw/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Muhtasari."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Ondoa <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> imeondolewa."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Programu za hivi majuzi zimeondolewa."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Fungua maelezo kuhusu programu ya <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Inaanzisha <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Hakuna vipengee vya hivi majuzi"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Umeondoa vipengee vyote"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Maelezo ya Programu"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"kubandika kwenye skirini"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"tafuta"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Imeshindwa kuanzisha <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> imezimwa katika hali salama."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ondoa zote"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Buruta hapa ili utumie skrini iliyogawanywa"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Gawanya Mlalo"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Gawanya Wima"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Maalum Iliyogawanywa"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Gawa skrini kuelekea juu"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Gawa skrini upande wa kushoto"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Gawa skrini upande wa kulia"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-th/strings.xml b/packages/SystemUI/legacy/recents/res/values-th/strings.xml
new file mode 100644
index 000000000000..b88d05eddace
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-th/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"ภาพรวม"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"ยกเลิก <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> ถูกนำออกไปแล้ว"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"ปิดแอปพลิเคชันล่าสุดทั้งหมดแล้ว"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"เปิดข้อมูลแอปพลิเคชัน <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"กำลังเริ่มต้น <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"ไม่มีรายการล่าสุด"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"คุณได้ล้างทุกอย่างแล้ว"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ข้อมูลแอปพลิเคชัน"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"การตรึงหน้าจอ"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ค้นหา"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"เริ่มใช้ <xliff:g id="APP">%s</xliff:g> ไม่ได้"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> ปิดใช้ในโหมดปลอดภัย"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"ล้างทั้งหมด"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"ลากมาที่นี่เพื่อใช้การแยกหน้าจอ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"แยกในแนวนอน"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"แยกในแนวตั้ง"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"แยกแบบกำหนดเอง"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"แยกหน้าจอไปด้านบน"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"แยกหน้าจอไปทางซ้าย"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"แยกหน้าจอไปทางขวา"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-tl/strings.xml b/packages/SystemUI/legacy/recents/res/values-tl/strings.xml
new file mode 100644
index 000000000000..d940d4e5663b
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-tl/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Overview"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"I-dismiss ang <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Na-dismiss ang <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Na-dismiss ang lahat ng kamakailang application."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Buksan ang impormasyon ng <xliff:g id="APP">%s</xliff:g> application."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Sinisimulan ang <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Walang kamakailang item"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Na-clear mo ang lahat"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Impormasyon ng Application"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"pag-pin sa screen"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"hanapin"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Hindi masimulan ang <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Naka-disable ang <xliff:g id="APP">%s</xliff:g> sa safe-mode."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"I-clear lahat"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"I-drag dito para magamit ang split screen"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"I-split Pahalang"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"I-split Patayo"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Split Custom"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"I-split ang screen pataas"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"I-split ang screen pakaliwa"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"I-split ang screen pakanan"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-tr/strings.xml b/packages/SystemUI/legacy/recents/res/values-tr/strings.xml
new file mode 100644
index 000000000000..982c57ef79ac
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-tr/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Genel Bakış."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> uygulamasını kapatır."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> kaldırıldı."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Tüm son uygulamalar kapatıldı."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> uygulama bilgilerini açar."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> başlatılıyor."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Yeni öğe yok"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Her şeyi sildiniz"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Uygulama Bilgileri"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ekran sabitleme"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"ara"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> başlatılamadı."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g>, güvenli modda devre dışıdır."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Tümünü temizle"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Ekranı bölünmüş olarak kullanmak için buraya sürükleyin"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Yatay Ayırma"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Dikey Ayırma"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Özel Ayırma"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Ekranı yukarıya doğru böl"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Ekranı sola doğru böl"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Ekranı sağa doğru böl"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-uk/strings.xml b/packages/SystemUI/legacy/recents/res/values-uk/strings.xml
new file mode 100644
index 000000000000..0c0b70927d1e
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-uk/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Огляд."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Закрити додаток <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Додаток <xliff:g id="APP">%s</xliff:g> закрито."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Усі останні додатки закрито."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Відкрити інформацію про додаток <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Запуск додатка <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Немає останніх елементів"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Ви очистили все"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Інформація про додаток"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"закріпити екран"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"пошук"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Не вдалося запустити додаток <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Додаток <xliff:g id="APP">%s</xliff:g> вимкнено в безпечному режимі."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Очистити все"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Перетягніть сюди, щоб розділити екран"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Розділити горизонтально"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Розділити вертикально"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Розділити (власний варіант)"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Розділити екран угору"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Розділити екран уліво"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Розділити екран управо"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-ur/strings.xml b/packages/SystemUI/legacy/recents/res/values-ur/strings.xml
new file mode 100644
index 000000000000..32aae85539ad
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-ur/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"مجموعی جائزہ۔"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"<xliff:g id="APP">%s</xliff:g> کو مسترد کریں۔"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> کو مسترد کر دیا گیا۔"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"سبھی حالیہ ایپلیکیشنز کو مسترد کر دیا گیا۔"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> ایپلیکیشن کی معلومات کھولیں۔"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> شروع ہو رہی ہے۔"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"کوئی حالیہ آئٹم نہیں"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"آپ نے سب کچھ صاف کر دیا ہے"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"ایپلیکیشن کی معلومات"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"اسکرین کو پن کرنا"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"تلاش کریں"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> کو شروع نہیں کیا جا سکا۔"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"محفوظ موڈ میں <xliff:g id="APP">%s</xliff:g> غیر فعال ہے۔"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"سبھی کو ہٹائیں"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"اسپلٹ اسکرین استعمال کرنے کے لیے یہاں گھسیٹیں"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"بلحاظ افقی تقسیم کریں"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"بلحاظ عمودی تقسیم کریں"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"بلحاظ حسب ضرورت تقسیم کریں"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"اسکرین کو اوپر کی جانب تقسیم کریں"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"اسکرین کو بائیں جانب تقسیم کریں"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"اسکرین کو دائیں جانب تقسیم کریں"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-uz/strings.xml b/packages/SystemUI/legacy/recents/res/values-uz/strings.xml
new file mode 100644
index 000000000000..6f8b153b4b5b
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-uz/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Umumiy nazar."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Olib tashlash: <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"<xliff:g id="APP">%s</xliff:g> olib tashlangan."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Yaqinda ishlatilgan barcha ilovalar olib tashlandi."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"<xliff:g id="APP">%s</xliff:g> ilovasi haqidagi axborotlarni ochadi."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"<xliff:g id="APP">%s</xliff:g> ishga tushirilmoqda."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Yaqinda ishlatilgan ilovalar yoʻq"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Hammasi tozalandi"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Ilova haqida axborot"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ekranni mahkamlash"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"qidiruv"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"<xliff:g id="APP">%s</xliff:g> ilovasi ishga tushmadi."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"Xavfsiz rejimda <xliff:g id="APP">%s</xliff:g> ilovasi yopildi."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Ha"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Ekranni boʻlish xususiyatidan foydalanish uchun bu yerga torting"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Gorizontal yoʻnalishda boʻlish"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Vertikal yoʻnalishda boʻlish"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Boshqa usulda boʻlish"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Ekranni tepaga qadash"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Ekranni chap tomonga qadash"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Ekranni oʻng tomonga qadash"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-vi/strings.xml b/packages/SystemUI/legacy/recents/res/values-vi/strings.xml
new file mode 100644
index 000000000000..f672a3d72dcb
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-vi/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Tổng quan."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Loại bỏ <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"Đã loại bỏ <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Đã loại bỏ tất cả các ứng dụng gần đây."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Mở thông tin ứng dụng <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Khởi động <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Không có mục gần đây nào"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Bạn đã xóa mọi nội dung"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Thông tin ứng dụng"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"khóa màn hình"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"tìm kiếm"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Không thể khởi động <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g> bị tắt ở chế độ an toàn."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Xóa tất cả"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Kéo vào đây để sử dụng chế độ chia đôi màn hình"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Phân tách ngang"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Phân tách dọc"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Tùy chỉnh phân tách"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Chia đôi màn hình lên trên"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Chia đôi màn hình sang trái"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Chia đôi màn hình sang phải"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-zh-rCN/strings.xml b/packages/SystemUI/legacy/recents/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000000..993bfaea9637
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-zh-rCN/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"概览。"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"移除<xliff:g id="APP">%s</xliff:g>。"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"已移除<xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"已关闭所有最近用过的应用。"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"打开<xliff:g id="APP">%s</xliff:g>应用信息。"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"正在启动<xliff:g id="APP">%s</xliff:g>。"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"近期没有任何内容"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"您已清除所有内容"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"应用信息"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"固定屏幕"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"搜索"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"无法启动<xliff:g id="APP">%s</xliff:g>。"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"<xliff:g id="APP">%s</xliff:g>已在安全模式下停用。"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"全部清除"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"拖动到此处即可使用分屏功能"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"水平分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"垂直分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"自定义分割"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"将屏幕分隔线移到上方"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"将屏幕分隔线移到左侧"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"将屏幕分隔线移到右侧"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-zh-rHK/strings.xml b/packages/SystemUI/legacy/recents/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000000..b93d246255cc
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-zh-rHK/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"概覽。"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"所有最近使用的應用程式均已關閉。"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"開啟「<xliff:g id="APP">%s</xliff:g>」應用程式的資料。"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"最近沒有任何項目"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"您已清除所有工作"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"應用程式資料"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"螢幕固定"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"搜尋"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"「<xliff:g id="APP">%s</xliff:g>」在安全模式下為停用狀態。"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"全部清除"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"拖曳這裡即可分割螢幕"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"水平分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"垂直分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"自訂分割"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"將分割畫面顯示喺頂部"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"將分割畫面顯示喺左邊"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"將分割畫面顯示喺右邊"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-zh-rTW/strings.xml b/packages/SystemUI/legacy/recents/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000000..54d656dd63b8
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-zh-rTW/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"總覽。"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"最近使用的應用程式已全部關閉。"</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"開啟「<xliff:g id="APP">%s</xliff:g>」應用程式資訊。"</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"最近沒有任何項目"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"你已清除所有工作"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"應用程式資訊"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"螢幕固定"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"搜尋"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"「<xliff:g id="APP">%s</xliff:g>」在安全模式中為停用狀態。"</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"全部清除"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"拖曳到這裡即可使用分割畫面"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"水平分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"垂直分割"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"自訂分割"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"將分割畫面顯示在頂端"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"將分割畫面顯示在左邊"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"將分割畫面顯示在右邊"</string>
+</resources>
diff --git a/packages/SystemUI/legacy/recents/res/values-zu/strings.xml b/packages/SystemUI/legacy/recents/res/values-zu/strings.xml
new file mode 100644
index 000000000000..9cbc439a84d0
--- /dev/null
+++ b/packages/SystemUI/legacy/recents/res/values-zu/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="accessibility_desc_recent_apps" msgid="2427210347871321373">"Buka konke."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="2355882496933479534">"Cashisa i-<xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="4816790842084268400">"I-<xliff:g id="APP">%s</xliff:g> icashisiwe."</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="5693205751863608046">"Zonke izinhlelo zokusebenza zakamuva zicashisiwe."</string>
+ <string name="accessibility_recents_item_open_app_info" msgid="3406797323476801016">"Vula ulwazi lohlelo lokusebenza le-<xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_launched" msgid="4519918148638221791">"Iqala i-<xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_empty_message" msgid="7967713254531861311">"Azikho izinto zakamuva"</string>
+ <string name="recents_empty_message_dismissed_all" msgid="1850214584987361375">"Usule yonke into"</string>
+ <string name="recents_app_info_button_label" msgid="8732926607391786762">"Ulwazi lohlelo lokusebenza"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6087750201863853365">"ukuphina isikrini"</string>
+ <string name="recents_search_bar_label" msgid="638132045925945941">"sesha"</string>
+ <string name="recents_launch_error_message" msgid="9107963563503438012">"Ayikwazanga ukuqalisa i-<xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="recents_launch_disabled_message" msgid="826461671965217243">"I-<xliff:g id="APP">%s</xliff:g> ikhutshaziwe kumodi yokuphepha."</string>
+ <string name="recents_stack_action_button_label" msgid="1974273390109881497">"Sula konke"</string>
+ <string name="recents_drag_hint_message" msgid="610417221848280136">"Hudulela lapha ukuze usebenzise ukuhlukanisa kwesikrini"</string>
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="488987777874979435">"Hlukanisa ngokuvundlile"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="2498375296906391117">"Hlukanisa ngokumile"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="7368405969130304811">"Hlukanisa ngokwezifiso"</string>
+ <string name="recents_accessibility_split_screen_top" msgid="8773505308411722524">"Hlukanisela isikrini phezulu"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="722594718192007972">"Hlukanisela isikrini ngakwesokunxele"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="2479764030969301514">"Hlukanisela isikrini ngakwesokudla"</string>
+</resources>
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index bf4374acf6e6..bca353050c46 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -116,6 +116,7 @@ public interface QSTile {
public boolean isTransient = false;
public String expandedAccessibilityClassName;
public SlashState slash;
+ public boolean handlesLongClick = true;
public boolean copyTo(State other) {
if (other == null) throw new IllegalArgumentException();
@@ -133,7 +134,8 @@ public interface QSTile {
|| !Objects.equals(other.state, state)
|| !Objects.equals(other.isTransient, isTransient)
|| !Objects.equals(other.dualTarget, dualTarget)
- || !Objects.equals(other.slash, slash);
+ || !Objects.equals(other.slash, slash)
+ || !Objects.equals(other.handlesLongClick, handlesLongClick);
other.icon = icon;
other.iconSupplier = iconSupplier;
other.label = label;
@@ -146,6 +148,7 @@ public interface QSTile {
other.dualTarget = dualTarget;
other.isTransient = isTransient;
other.slash = slash != null ? slash.copy() : null;
+ other.handlesLongClick = handlesLongClick;
return changed;
}
diff --git a/packages/SystemUI/plugin/update_plugin_lib.sh b/packages/SystemUI/plugin/update_plugin_lib.sh
index a105b451d108..34f4895de3c1 100755
--- a/packages/SystemUI/plugin/update_plugin_lib.sh
+++ b/packages/SystemUI/plugin/update_plugin_lib.sh
@@ -5,7 +5,7 @@ rm -rf /tmp/plugin_classes/
mkdir /tmp/plugin_classes
# Compile the jar
-javac -cp $ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar:$ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/classes.jar `find src -name *.java` -d /tmp/plugin_classes/
+javac -cp $ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar:$ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/classes.jar `find ../plugin*/src -name *.java` -d /tmp/plugin_classes/
echo "" >> /tmp/plugin_classes/manifest.txt
jar cvfm SystemUIPluginLib.jar /tmp/plugin_classes/manifest.txt -C /tmp/plugin_classes .
diff --git a/packages/SystemUI/res/drawable/biometric_dialog_bg.xml b/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
index 335448d82373..d4dfdee82653 100644
--- a/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
+++ b/packages/SystemUI/res/drawable/biometric_dialog_bg.xml
@@ -17,10 +17,10 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/biometric_dialog_bg_color" />
+ <solid android:color="?android:attr/colorBackgroundFloating" />
<corners android:radius="1dp"
android:topLeftRadius="@dimen/biometric_dialog_corner_size"
android:topRightRadius="@dimen/biometric_dialog_corner_size"
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"/>
-</shape> \ No newline at end of file
+</shape>
diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml
index 05fd467b749e..af25e44bd746 100644
--- a/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml
+++ b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml
@@ -36,7 +36,7 @@
android:name="_R_G_L_2_G_D_0_P_0"
android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -47,7 +47,7 @@
android:name="_R_G_L_2_G_D_1_P_0"
android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -58,7 +58,7 @@
android:name="_R_G_L_2_G_D_2_P_0"
android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -69,7 +69,7 @@
android:name="_R_G_L_2_G_D_3_P_0"
android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -80,7 +80,7 @@
android:name="_R_G_L_2_G_D_4_P_0"
android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -97,7 +97,7 @@
android:name="_R_G_L_1_G_D_0_P_0"
android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="2"
@@ -118,7 +118,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="@color/biometric_dialog_error_color"
+ android:fillColor="?android:attr/colorError"
android:fillType="nonZero"
android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " />
</group>
@@ -131,7 +131,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_1"
android:fillAlpha="1"
- android:fillColor="@color/biometric_dialog_error_color"
+ android:fillColor="?android:attr/colorError"
android:fillType="nonZero"
android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " />
</group>
@@ -522,4 +522,4 @@
</set>
</aapt:attr>
</target>
-</animated-vector> \ No newline at end of file
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml
index fd0ab22b2f98..1a7a846b140e 100644
--- a/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml
+++ b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml
@@ -36,7 +36,7 @@
android:name="_R_G_L_3_G_D_0_P_0"
android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -47,7 +47,7 @@
android:name="_R_G_L_3_G_D_1_P_0"
android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -58,7 +58,7 @@
android:name="_R_G_L_3_G_D_2_P_0"
android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -69,7 +69,7 @@
android:name="_R_G_L_3_G_D_3_P_0"
android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -80,7 +80,7 @@
android:name="_R_G_L_3_G_D_4_P_0"
android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_biometric_color"
+ android:strokeColor="?android:attr/colorAccent"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -101,7 +101,7 @@
android:name="_R_G_L_2_G_D_0_P_0"
android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -112,7 +112,7 @@
android:name="_R_G_L_2_G_D_1_P_0"
android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -123,7 +123,7 @@
android:name="_R_G_L_2_G_D_2_P_0"
android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -134,7 +134,7 @@
android:name="_R_G_L_2_G_D_3_P_0"
android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -145,7 +145,7 @@
android:name="_R_G_L_2_G_D_4_P_0"
android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="1.45"
@@ -162,7 +162,7 @@
android:name="_R_G_L_1_G_D_0_P_0"
android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c "
android:strokeAlpha="1"
- android:strokeColor="@color/biometric_dialog_error_color"
+ android:strokeColor="?android:attr/colorError"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="2"
@@ -183,7 +183,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_0"
android:fillAlpha="1"
- android:fillColor="@color/biometric_dialog_error_color"
+ android:fillColor="?android:attr/colorError"
android:fillType="nonZero"
android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " />
</group>
@@ -196,7 +196,7 @@
<path
android:name="_R_G_L_0_G_D_0_P_1"
android:fillAlpha="1"
- android:fillColor="@color/biometric_dialog_error_color"
+ android:fillColor="?android:attr/colorError"
android:fillType="nonZero"
android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " />
</group>
@@ -851,4 +851,4 @@
</set>
</aapt:attr>
</target>
-</animated-vector> \ No newline at end of file
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/privacy_chip_bg.xml b/packages/SystemUI/res/drawable/privacy_chip_bg.xml
new file mode 100644
index 000000000000..8247c27ff850
--- /dev/null
+++ b/packages/SystemUI/res/drawable/privacy_chip_bg.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#bbbbbb" />
+ <padding android:padding="@dimen/ongoing_appops_chip_bg_padding" />
+ <corners android:radius="@dimen/ongoing_appops_chip_bg_corner_radius" />
+</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/biometric_dialog.xml b/packages/SystemUI/res/layout/biometric_dialog.xml
index 0417e2ede2d3..ec25e311806e 100644
--- a/packages/SystemUI/res/layout/biometric_dialog.xml
+++ b/packages/SystemUI/res/layout/biometric_dialog.xml
@@ -63,7 +63,7 @@
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
- android:textColor="@color/biometric_dialog_text_dark_color"/>
+ android:textColor="?android:attr/textColorPrimary"/>
<TextView
android:id="@+id/subtitle"
@@ -78,7 +78,7 @@
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
- android:textColor="@color/biometric_dialog_text_dark_color"/>
+ android:textColor="?android:attr/textColorPrimary"/>
<TextView
android:id="@+id/description"
@@ -90,7 +90,7 @@
android:paddingTop="8dp"
android:textSize="16sp"
android:maxLines="4"
- android:textColor="@color/biometric_dialog_text_dark_color"/>
+ android:textColor="?android:attr/textColorPrimary"/>
<ImageView
android:id="@+id/biometric_icon"
@@ -112,7 +112,7 @@
android:gravity="center_horizontal"
android:accessibilityLiveRegion="polite"
android:contentDescription="@string/accessibility_biometric_dialog_help_area"
- android:textColor="@color/biometric_dialog_text_light_color"/>
+ android:textColor="?android:attr/textColorSecondary"/>
<LinearLayout
android:layout_width="match_parent"
@@ -164,4 +164,4 @@
</LinearLayout>
-</LinearLayout> \ No newline at end of file
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 5c950ecfb49e..f138685e9810 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -51,7 +51,7 @@
android:layout_centerVertical="true"
android:layout_toEndOf="@id/pkgicon" />
<TextView
- android:id="@+id/pkg_divider"
+ android:id="@+id/pkg_group_divider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info"
@@ -61,7 +61,7 @@
android:layout_centerVertical="true"
android:layout_toEndOf="@id/pkgname" />
<TextView
- android:id="@+id/delegate_name"
+ android:id="@+id/group_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@*android:style/TextAppearance.Material.Notification.Info"
@@ -70,7 +70,7 @@
android:ellipsize="end"
android:maxLines="1"
android:layout_centerVertical="true"
- android:layout_toEndOf="@id/pkg_divider" />
+ android:layout_toEndOf="@id/pkg_group_divider" />
<!-- 24 dp icon with 16 dp padding all around to mirror notification content margins -->
<ImageButton
android:id="@+id/info"
@@ -101,39 +101,13 @@
android:layout_marginStart="@*android:dimen/notification_content_margin_start"
android:layout_marginEnd="@*android:dimen/notification_content_margin_start"
android:orientation="vertical">
- <RelativeLayout
- android:id="@+id/names"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/group_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@*android:style/TextAppearance.Material.Notification.Title"
- android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"
- android:ellipsize="end"
- android:maxLines="1"
- android:layout_centerVertical="true" />
- <TextView
- android:id="@+id/pkg_group_divider"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@*android:style/TextAppearance.Material.Notification.Title"
- android:layout_marginStart="2dp"
- android:layout_marginEnd="2dp"
- android:text="@*android:string/notification_header_divider_symbol"
- android:layout_centerVertical="true"
- android:layout_toEndOf="@id/group_name" />
- <!-- Channel Name -->
- <TextView
- android:id="@+id/channel_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- style="@android:style/TextAppearance.Material.Notification.Title"
- android:layout_toEndOf="@id/pkg_group_divider"/>
- </RelativeLayout>
+ <!-- Channel Name -->
+ <TextView
+ android:id="@+id/channel_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ style="@android:style/TextAppearance.Material.Notification.Title" />
<!-- Question prompt -->
<TextView
android:id="@+id/block_prompt"
diff --git a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml
new file mode 100644
index 000000000000..5e952e3c4413
--- /dev/null
+++ b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<com.android.systemui.privacy.OngoingPrivacyChip
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/privacy_chip"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_margin="@dimen/ongoing_appops_chip_margin"
+ android:gravity="center_vertical|end"
+ android:orientation="horizontal"
+ android:paddingStart="@dimen/ongoing_appops_chip_side_padding"
+ android:paddingEnd="@dimen/ongoing_appops_chip_side_padding"
+ android:background="@drawable/privacy_chip_bg"
+ android:focusable="true">
+
+ <LinearLayout
+ android:id="@+id/icons_container"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:gravity="center_vertical|start"
+ />
+
+ <TextView
+ android:id="@+id/app_name"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:gravity="center_vertical|end"
+ />
+</com.android.systemui.privacy.OngoingPrivacyChip> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/ongoing_privacy_dialog_content.xml b/packages/SystemUI/res/layout/ongoing_privacy_dialog_content.xml
new file mode 100644
index 000000000000..b5e24a04f85e
--- /dev/null
+++ b/packages/SystemUI/res/layout/ongoing_privacy_dialog_content.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport ="true"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/dialog_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="@dimen/ongoing_appops_dialog_content_padding">
+
+ <LinearLayout
+ android:id="@+id/icons_container"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/ongoing_appops_dialog_icon_height"
+ android:orientation="horizontal"
+ android:gravity="center"
+ android:importantForAccessibility="no"
+ />
+
+ <LinearLayout
+ android:id="@+id/text_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="start"
+ />
+ </LinearLayout>
+
+</ScrollView> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml b/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml
new file mode 100644
index 000000000000..5595b130e041
--- /dev/null
+++ b/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textDirection="locale"
+ android:textAppearance="@style/TextAppearance.QS.DetailItemPrimary"
+/> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
index 680112c73c0d..007070e3ffba 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -46,6 +46,8 @@
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal" />
+ <include layout="@layout/ongoing_privacy_chip" />
+
<com.android.systemui.BatteryMeterView
android:id="@+id/battery"
android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml
new file mode 100644
index 000000000000..6c5c7fac3ed6
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_record_dialog.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="top"
+ android:orientation="vertical">
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="10dp"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@android:color/white">
+ <CheckBox
+ android:id="@+id/checkbox_mic"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/screenrecord_mic_label"/>
+ <CheckBox
+ android:id="@+id/checkbox_taps"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/screenrecord_taps_label"/>
+ <Button
+ android:id="@+id/record_button"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:text="@string/screenrecord_start_label"
+ />
+ </LinearLayout>
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="10dp"/>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 395de193b35a..1835a56fa8e7 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Stelsel-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Maak skoon"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwyder uit lys"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Program Info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Jou onlangse skerms verskyn hier"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Maak onlangse programme toe"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d skerms in Oorsig</item>
- <item quantity="one">1 skerm in Oorsig</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen kennisgewings"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Voortdurend"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Kennisgewings"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"maak foon oop"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"maak stembystand oop"</string>
<string name="camera_label" msgid="7261107956054836961">"maak kamera oop"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Kies nuwe taakuitleg"</string>
<string name="cancel" msgid="6442560571259935130">"Kanselleer"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Hulpboodskapgebied"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestig"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Maak <xliff:g id="APP">%s</xliff:g> toe."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwerp."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle onlangse programme is toegemaak."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Maak <xliff:g id="APP">%s</xliff:g>-programinligting oop."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Begin tans <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Kennisgewing is toegemaak."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kennisgewingskerm."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Vinnige instellings."</string>
@@ -319,8 +305,7 @@
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Onbenoemde toestel"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gereed om uit te saai"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Geen toestelle beskikbaar nie"</string>
- <!-- no translation found for quick_settings_cast_no_wifi (2696477881905521882) -->
- <skip />
+ <string name="quick_settings_cast_no_wifi" msgid="2696477881905521882">"Wi-Fi is nie gekoppel nie"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OUTO"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"Keer kleure om"</string>
@@ -356,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is gedeaktiveer"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is geaktiveer"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Geen onlangse items nie"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Jy het alles toegemaak"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Programinligting"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skermvaspen"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"soek"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Kon nie <xliff:g id="APP">%s</xliff:g> begin nie."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is in veiligmodus gedeaktiveer."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vee alles uit"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trek hier om verdeelde skerm te gebruik"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swiep op om programme te wissel"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Sleep regs om programme vinnig te wissel"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Verdeel horisontaal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verdeel vertikaal"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Verdeel gepasmaak"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Verdeel skerm na bo"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Verdeel skerm na links"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Verdeel skerm na regs"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Wissel oorsig"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Gelaai"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laai tans"</string>
@@ -619,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimeer"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Hou aan om kennisgewings van hierdie program af te wys?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Hierdie kennisgewings kan nie afgeskakel word nie"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Hierdie program gebruik tans die kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Hierdie program gebruik tans die mikrofoon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Hierdie program wys tans bo-oor ander programme op jou skerm."</string>
@@ -753,6 +725,8 @@
<item msgid="2139628951880142927">"Wys persentasie wanneer gelaai word (verstek)"</item>
<item msgid="3327323682209964956">"Moenie hierdie ikoon wys nie"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Ander"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Skermverdeler"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Volskerm links"</string>
@@ -784,8 +758,7 @@
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Aangemeld as <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="data_connection_no_internet" msgid="4503302451650972989">"Geen internet nie"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Maak besonderhede oop."</string>
- <!-- no translation found for accessibility_quick_settings_not_available (4190068184294019846) -->
- <skip />
+ <string name="accessibility_quick_settings_not_available" msgid="4190068184294019846">"Onbeskikbaar weens <xliff:g id="REASON">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Maak <xliff:g id="ID_1">%s</xliff:g>-instellings oop."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Wysig volgorde van instellings."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Bladsy <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index fcad97bdb75f..dea4256b2195 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"የስርዓት UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"አጽዳ"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ከዝርዝር አስወግድ"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"የትግበራ መረጃ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"የቅርብ ጊዜ ማያ ገጾችዎ እዚህ ይታያሉ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"የቅርብ ጊዜ መተግበሪያዎችን ሰርዝ"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d ማያ ገጾች በአጠቃላይ እይታ ውስጥ</item>
- <item quantity="other">%d ማያ ገጾች በአጠቃላይ እይታ ውስጥ</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ምንም ማሳወቂያዎች የሉም"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"በመካሄድ ላይ ያለ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ማሳወቂያዎች"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ስልክ ክፈት"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"የድምጽ ረዳትን ክፈት"</string>
<string name="camera_label" msgid="7261107956054836961">"ካሜራ ክፈት"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string>
<string name="cancel" msgid="6442560571259935130">"ይቅር"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"የእገዛ መልዕክት አካባቢ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"አረጋግጥ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> አስወግድ።"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ተሰናብቷል::"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ሁሉም የቅርብ ጊዜ ማመልከቻዎች ተሰናብተዋል።"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"የ<xliff:g id="APP">%s</xliff:g> መተግበሪያ መረጃውን ይክፈቱ።"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> በመጀመር ላይ።"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ማሳወቂያ ተወግዷል።"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"የማሳወቂያ ጥላ።"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ፈጣን ቅንብሮች።"</string>
@@ -319,8 +305,7 @@
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ለመውሰድ ዝግጁ"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"ምንም መሣሪያዎች አይገኙም"</string>
- <!-- no translation found for quick_settings_cast_no_wifi (2696477881905521882) -->
- <skip />
+ <string name="quick_settings_cast_no_wifi" msgid="2696477881905521882">"Wi-Fi አልተገናኘም"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ብሩህነት"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ራስ-ሰር"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"ቀለማትን ግልብጥ"</string>
@@ -356,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"ኤንኤፍሲ"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"ኤንኤፍሲ ተሰናክሏል"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"ኤንኤፍሲ ነቅቷል"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ሁሉንም ነገር አጽድተዋል"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"የመተግበሪያ መረጃ"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ማያ ገጽ መሰካት"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ፈልግ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ን መጀመር አልተቻለም።"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> በጥንቃቄ ሁነታ ውስጥ ታግዷል።"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ሁሉንም አጽዳ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"የተከፈለ ማያ ገጽን ለመጠቀም እዚህ ላይ ይጎትቱ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"መተግበሪያዎችን በፍጥነት ለመቀየር ወደ ቀኝ ይጎትቱ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"አግድም ክፈል"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ቁልቁል ክፈል"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"በብጁ ክፈል"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ማያ ገጽ ወደ ላይ ክፈል"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ማያ ገጽ ወደ ግራ ክፈል"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ማያ ገጽ ወደ ቀኝ ክፈል"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"አጠቃላይ እይታን ቀያይር"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ባትሪ ሞልቷል"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ኃይል በመሙላት ላይ"</string>
@@ -619,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"አሳንስ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"እነዚህ ማሳወቂያዎች ሊጠፉ አይችሉም"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ይህ መተግበሪያ ካሜራውን እየተጠቀመ ነው።"</string>
<string name="appops_microphone" msgid="741508267659494555">"ይህ መተግበሪያ ማይክሮፎኑን እየተጠቀመ ነው።"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ይህ መተግበሪያ በማያ ገጽዎ ላይ ባሉ ሌሎች መተግበሪያዎች ላይ እያሳየ ነው።"</string>
@@ -753,6 +725,8 @@
<item msgid="2139628951880142927">"የባትሪ ኃይል በሚሞላበት ጊዜ መቶኛ አሳይ (ነባሪ)"</item>
<item msgid="3327323682209964956">"ይህን አዶ አታሳይ"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ሌላ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"የተከፈለ የማያ ገጽ ከፋይ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"የግራ ሙሉ ማያ ገጽ"</string>
@@ -784,8 +758,7 @@
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"እንደ <xliff:g id="ID_1">%s</xliff:g> ሆነው ገብተዋል"</string>
<string name="data_connection_no_internet" msgid="4503302451650972989">"ምንም በይነመረብ የለም"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"ዝርዝሮችን ክፈት።"</string>
- <!-- no translation found for accessibility_quick_settings_not_available (4190068184294019846) -->
- <skip />
+ <string name="accessibility_quick_settings_not_available" msgid="4190068184294019846">"በ<xliff:g id="REASON">%s</xliff:g> ምክንያት አይገኝም"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"የ<xliff:g id="ID_1">%s</xliff:g> ቅንብሮችን ክፈት።"</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"የቅንብሮድ ቅደም-ተከተል አርትዕ።"</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"ገጽ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 1b55d390063f..b3ac2cdb8a5a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -21,18 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"واجهة مستخدم النظام"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"محو"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"إزالة من القائمة"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"معلومات التطبيق"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"تظهر شاشاتك المعروضة مؤخرًا هنا"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"إزالة التطبيقات الحديثة"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="zero">‏ لا توجد أي شاشات (%d) في النظرة العامة</item>
- <item quantity="two">‏شاشتان (%d) في النظرة العامة</item>
- <item quantity="few">‏%d شاشات في النظرة العامة</item>
- <item quantity="many">‏%d شاشة في النظرة العامة</item>
- <item quantity="other">‏%d من الشاشات في النظرة العامة</item>
- <item quantity="one">شاشة واحدة في النظرة العامة</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي اشعارات"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"الإشعارات"</string>
@@ -105,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"فتح الهاتف"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"فتح المساعد الصوتي"</string>
<string name="camera_label" msgid="7261107956054836961">"فتح الكاميرا"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"تحديد تنسيق جديد للمهمة"</string>
<string name="cancel" msgid="6442560571259935130">"إلغاء"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"منطقة رسالة المساعدة"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأكيد"</string>
@@ -192,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"إزالة <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"تمت إزالة <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"تم تجاهل كل التطبيقات المستخدمة مؤخرًا."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"فتح معلومات تطبيق <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"جارٍ بدء <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"تم تجاهل الإشعار."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"مركز الإشعارات."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"الإعدادات السريعة."</string>
@@ -367,23 +349,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"‏الاتصال القريب المدى (NFC)"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"تم إيقاف الاتصال القريب المدى"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"تم تفعيل الاتصال القريب المدى"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ليست هناك عناصر تم استخدامها مؤخرًا"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"لقد محوتَ كل شيء"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"معلومات التطبيق"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"تثبيت الشاشة"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"بحث"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"تعذر بدء <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"تم إيقاف <xliff:g id="APP">%s</xliff:g> في الوضع الآمن."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"مسح الكل"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"اسحب هنا لاستخدام وضع تقسيم الشاشة"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"مرّر سريعًا لأعلى لتبديل التطبيقات"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"اسحب لليسار للتبديل السريع بين التطبيقات"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسيم أفقي"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسيم رأسي"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"تقسيم مخصص"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"تقسيم الشاشة بمحاذاة الجزء العلوي"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"تقسيم الشاشة بمحاذاة اليسار"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"تقسيم الشاشة بمحاذاة اليمين"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"تبديل \"النظرة العامة\""</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"تم الشحن"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"جارٍ الشحن"</string>
@@ -634,6 +601,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"تصغير"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"يتعذَّر إيقاف هذه الإشعارات."</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"يستخدم هذا التطبيق الكاميرا."</string>
<string name="appops_microphone" msgid="741508267659494555">"يستخدم هذا التطبيق الميكروفون."</string>
<string name="appops_overlay" msgid="6165912637560323464">"يتم عرض هذا التطبيق فوق التطبيقات الأخرى على شاشتك."</string>
@@ -776,6 +745,8 @@
<item msgid="2139628951880142927">"عرض النسبة المئوية عند الشحن (تلقائي)"</item>
<item msgid="3327323682209964956">"عدم عرض هذا الرمز"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"غير ذلك"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"أداة تقسيم الشاشة"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"عرض النافذة اليسرى بملء الشاشة"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 65c5fb55e81a..2574838ef7a3 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ছিষ্টেম ইউআই"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"মচক"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"সূচীৰ পৰা আঁতৰাওক"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"এপ্ সম্পৰ্কীয় তথ্য"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপোনাৰ শেহতীয়া স্ক্ৰীণ ইয়াত প্ৰকট হ\'ব"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"শেহতীয়া এপসমূহক আঁতৰাওক"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d খন স্ক্ৰীণ অৱলোকনত আছে</item>
- <item quantity="other">%d খন স্ক্ৰীণ অৱলোকনত আছে</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো জাননী নাই"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলিত"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"জাননীসমূহ"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"কণ্ঠধ্বনিৰে সহায় খোলক"</string>
<string name="camera_label" msgid="7261107956054836961">"কেমেৰা খোলক"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কাৰ্যৰ চানেকি বাছনি কৰক"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"নিশ্চিত কৰক"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ক আঁতৰাব।"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> আঁতৰোৱা হৈছে৷"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"শেহতীয়া সকলো এপ্লিকেশ্বন অগ্ৰাহ্য কৰা হৈছে।"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> এপ্লিকেশ্বনৰ তথ্য় খোলক।"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰা হৈছে।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"জাননী পেনেল।"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ক্ষিপ্ৰ ছেটিংসমূহ।"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"কোনো শেহতীয়া বস্তু নাই"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"আপুনি সকলোবোৰ খালী কৰিছে"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"এপ্লিকেশ্বনৰ তথ্য"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্ৰীণ পিনিং"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"সন্ধান কৰক"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰিব পৰা নগ\'ল৷"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>টো সুৰক্ষিত ম\'ডত অক্ষম কৰা হ\'ল।"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"সকলো মচক"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভাজিত স্ক্ৰীণ ব্য়ৱহাৰ কৰিবলৈ ইয়ালৈ টানি আনি এৰক"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"খৰতকীয়াকৈ আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ সোঁফালে টানক"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"আনুভূমিকভাৱে বিভাজিত কৰক"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উলম্বভাৱে বিভাজিত কৰক"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"উপযোগিতা অনুসৰি বিভাজিত কৰক"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"স্ক্ৰীণখনক ওপৰফাললৈ ভাগ কৰক"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"স্ক্ৰীণখনক বাওঁফাললৈ ভাগ কৰক"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"স্ক্ৰীণখনক সোঁফাললৈ ভাগ কৰক"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"অৱলোকন ট’গল কৰক"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"চ্চার্জ হ\'ল"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"চ্চার্জ হৈ আছে"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"সৰু কৰক"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"এই জাননীসমূহ বন্ধ কৰিব নোৱাৰি"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"এই এপে কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string>
<string name="appops_microphone" msgid="741508267659494555">"এই এপে মাইক্ৰ\'ফ\'ন ব্য়ৱহাৰ কৰি আছে।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"এই এপটো আপোনাৰ স্ক্ৰীণত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ আছে।"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"চ্চাৰ্জ কৰি থকাৰ সময়ত শতাংশ দেখুৱাওক (ডিফ\'ল্ট)"</item>
<item msgid="3327323682209964956">"এই আইকনটো নেদেখুৱাব"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"অন্যান্য"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"স্প্লিট স্ক্ৰীণৰ বিভাজক"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"বাওঁফালৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 07476aa1930a..58947daefe37 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistemin İstifadə İnterfeysi"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Təmizlə"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Siyahıdan sil"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Tətbiq infosu"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Son tətbiqləri kənarlaşdır"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other"> İcmalda %d ekran</item>
- <item quantity="one">İcmalda 1 ekran</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildiriş yoxdu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Davam edir"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirişlər"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"telefonu açın"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"səs yardımçısını açın"</string>
<string name="camera_label" msgid="7261107956054836961">"kemaranı açın"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni tapşırıq sxemi seçin"</string>
<string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı bölməsi"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Təsdiq"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> kənarlaşdırın."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> çıxarıldı."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Bütün son tətbiqlər kənarlaşdırıldı."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> tətbiqi haqqında məlumatı açın."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> başlanır."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildiriş uzaqlaşdırıldı."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildiriş kölgəsi."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tez ayarlar."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC deaktiv edilib"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC aktiv edilib"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Son elementlər yoxdur"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Hərşeyi təmizlədiniz"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Tətbiq haqqında"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekran sancağı"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"axtarış"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> başlana bilmir."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> güvənli rejimdə deaktiv edildi."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hamısını silin"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölmək üçün bura sürüşdürün"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Tətbiqləri cəld dəyişmək üçün sağa çəkin"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Üfüqi Böl"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Şaquli Böl"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Fərdi Böl"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Ekranı yuxarıdan ayırın"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Ekranı soldan ayırın"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Ekranı sağdan ayırın"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"İcmala Keçin"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Dolub"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Enerji doldurulur"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Kiçildin"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu tətbiqin bildirişləri göstərilməyə davam edilsin?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirişlər deaktiv edilə bilməz"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> vasitəsilə"</string>
<string name="appops_camera" msgid="8100147441602585776">"Bu tətbiq kameradan istifadə edir."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu tətbiq mikrofondan istifadə edir."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu tətbiqdə ekranda digər tətbiqlərin üzərində göstərilir."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Enerji dolan zaman faizi göstərin (defolt)"</item>
<item msgid="3327323682209964956">"Bu piktoqramı göstərməyin"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Aşağı prioritet bildiriş işarələrini göstərin"</string>
<string name="other" msgid="4060683095962566764">"Digər"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Bölünmüş ekran ayırıcısı"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Sol tam ekran"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index db3834b54f35..b2bcda838e37 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Obriši"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Uklanjanje sa liste"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacije o aplikaciji"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Nedavni ekrani se pojavljuju ovde"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Odbaci nedavne aplikacije"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d ekran u Pregledu</item>
- <item quantity="few">%d ekrana u Pregledu</item>
- <item quantity="other">%d ekrana u Pregledu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nema obaveštenja"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Tekuće"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obaveštenja"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otvori telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otvori glasovnu pomoć"</string>
<string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberi novi raspored zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast poruke za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Odbacite <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> je odbačena."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Sve nedavno korišćene aplikacije su odbačene."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otvorite informacije o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Pokrećemo <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obaveštenje je odbačeno."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Prozor sa obaveštenjima."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Brza podešavanja."</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nema nedavnih stavki"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Obrisali ste sve"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kačenje ekrana"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pretraži"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Pokretanje aplikacije <xliff:g id="APP">%s</xliff:g> nije uspelo."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je onemogućena u bezbednom režimu."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Prevucite ovde da biste koristili razdeljeni ekran"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prevucite nagore da biste menjali aplikacije"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Prevucite udesno da biste brzo promenili aplikacije"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podeli horizontalno"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podeli vertikalno"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođeno deljenje"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Podeli ekran nagore"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Podeli ekran nalevo"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Podeli ekran nadesno"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Uključi/isključi pregled"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjena je"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
@@ -622,6 +592,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Umanji"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ne možete da isključite ova obaveštenja"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija se prikazuje preko drugih aplikacija na ekranu."</string>
@@ -758,6 +730,8 @@
<item msgid="2139628951880142927">"Prikaži procenat tokom punjenja (podrazumevano)"</item>
<item msgid="3327323682209964956">"Ne prikazuj ovu ikonu"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Drugo"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Razdelnik podeljenog ekrana"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Režim celog ekrana za levi ekran"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 7b19b3697351..ac430ba0e328 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Інтэрфейс карыстальніка сістэмы"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ачысціць"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Выдаліць са спісу"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Звесткі аб прыкладанні"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Вашы апошнія экраны з\'яўляюцца тут"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Закрыць нядаўнія прыкладаннi"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d экран у Аглядзе</item>
- <item quantity="few">%d экраны ў Аглядзе</item>
- <item quantity="many">%d экранаў у Аглядзе</item>
- <item quantity="other">%d экрана ў Аглядзе</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Без апавяшчэнняў"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Пастаянныя"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Апавяшчэнні"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"адкрыць тэлефон"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"адкрыць галасавую дапамогу"</string>
<string name="camera_label" msgid="7261107956054836961">"адкрыць камеру"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Выберыце новы макет заданняў"</string>
<string name="cancel" msgid="6442560571259935130">"Скасаваць"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Поле даведачнага паведамлення"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Пацвердзіць"</string>
@@ -192,11 +181,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Выдаліць <xliff:g id="APP">%s</xliff:g> са спіса апошніх."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> выдалены."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Усе апошнія праграмы адхілены."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Адкрыць інфармацыю пра праграму \"<xliff:g id="APP">%s</xliff:g>\"."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Запускаецца <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Апавяшчэнне прапушчана."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Цень апавяшчэння.."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Хуткія налады."</string>
@@ -363,23 +347,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC адключаны"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC уключаны"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Няма нядаўніх элементаў"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Вы ачысцілі усё"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Звесткі аб праграме"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"замацаванне экрана"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"пошук"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Не атрымалася запусціць <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> адключана ў бяспечным рэжыме."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ачысціць усё"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перацягніце сюды, каб перайсці ў рэжым падзеленага экрана"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Правядзіце ўверх, каб пераключыць праграмы"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Каб хутка пераключыцца паміж праграмамі, перацягніце ўправа"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Падзяліць гарызантальна"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Падзяліць вертыкальна"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Падзяліць іншым чынам"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Падзяліць экран зверху"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Падзяліць экран злева"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Падзяліць экран справа"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Уключыць/выключыць агляд"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Зараджаны"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарадка"</string>
@@ -628,6 +597,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Згарнуць"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Працягваць паказваць апавяшчэнні гэтай праграмы?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Немагчыма адключыць гэтыя апавяшчэнні"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Гэта праграма выкарыстоўвае камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Гэта праграма выкарыстоўвае мікрафон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Гэта праграма паказваецца на экране паверх іншых праграм."</string>
@@ -766,6 +737,8 @@
<item msgid="2139628951880142927">"Паказваць працэнты падчас зарадкі (стандартна)"</item>
<item msgid="3327323682209964956">"Не паказваць гэты значок"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Іншае"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Раздзяляльнік падзеленага экрана"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Левы экран – поўнаэкранны рэжым"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 74b1c4489bf3..c6bc414992fa 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Системен ПИ"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Изчистване"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Премахване от списъка"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информация за приложението"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Скорошните ви екрани се показват тук"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Отхвърляне на скорошните приложения"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d екрана в панела за общ преглед</item>
- <item quantity="one">1 екран в панела за общ преглед</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Няма известия"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"отваряне на телефона"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"отваряне на гласовата помощ"</string>
<string name="camera_label" msgid="7261107956054836961">"отваряне на камерата"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Избиране на ново оформление за задачите"</string>
<string name="cancel" msgid="6442560571259935130">"Отказ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за помощно съобщение"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потвърждаване"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Отхвърляне на <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложението <xliff:g id="APP">%s</xliff:g> е отхвърлено."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Всички скорошни приложения са отхвърлени."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Отворете информацията за приложението <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> се стартира."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Известието е отхвърлено."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Падащ панел с известия."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Бързи настройки."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"КБП"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"КБП е деактивирана"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"КБП е активирана"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Няма скорошни елементи"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Изчистихте всичко"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информация за приложението"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"фиксиране на екрана"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"търсене"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не можа да стартира."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложението <xliff:g id="APP">%s</xliff:g> е деактивирано в безопасния режим."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Изчистване на всичко"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Преместете тук с плъзгане, за да използвате режим за разделен екран"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Прекарайте пръст нагоре, за да превключите между приложенията"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Плъзнете надясно за бързо превключване между приложенията"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хоризонтално разделяне"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Вертикално разделяне"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Персонализирано разделяне"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Разделяне на екрана нагоре"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Разделяне на екрана наляво"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Разделяне на екрана надясно"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Превключване на общия преглед"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заредена"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарежда се"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Намаляване"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Да продължат ли да се показват известията от това приложение?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Тези известия не могат да бъдат изключени"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Това приложение използва камерата."</string>
<string name="appops_microphone" msgid="741508267659494555">"Това приложение използва микрофона."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Това приложение се показва върху други приложения на екрана."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Процентът да се показва при зареждане (по подразбиране)"</item>
<item msgid="3327323682209964956">"Тази икона да не се показва"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Друго"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Разделител в режима за разделен екран"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ляв екран: Показване на цял екран"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 5223a9928b7f..412f90cfc4d5 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"সিস্টেম UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"সাফ করুন"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"তালিকা থেকে সরান"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"অ্যাপের তথ্য"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপনার সাম্প্রতিক স্ক্রীনগুলো এখানে দেখা যাবে"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"সাম্প্রতিক অ্যাপ্লিকেশানগুলি খারিজ করুন"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">ওভারভিউ-এ %dটি স্ক্রিন</item>
- <item quantity="other">ওভারভিউ-এ %dটি স্ক্রিন</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো বিজ্ঞপ্তি নেই"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলতে-থাকা"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"বিজ্ঞপ্তি"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ফোন খুলুন"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ভয়েস সহায়তা খুলুন"</string>
<string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায়তার মেসেজ দেখানোর জায়গা"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"কনফার্ম করুন"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> খারিজ করুন।"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> খারিজ করা হয়েছে৷"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"সমস্ত সাম্প্রতিক অ্যাপ্লিকেশন খারিজ করা হয়েছে।"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> অ্যাপ্লিকেশানের তথ্য খুলবে৷"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> তারাঙ্কিত করা হচ্ছে।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"বিজ্ঞপ্তি খারিজ করা হয়েছে৷"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"বিজ্ঞপ্তি শেড৷"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"দ্রুত সেটিংস৷"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC অক্ষম করা আছে"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম করা আছে"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"কোনো সাম্প্রতিক আইটেম নেই"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"আপনি সবকিছু সাফ করেছেন"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"অ্যাপ্লিকেশানের তথ্য"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্রিন পিন করা"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"সার্চ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> শুরু করা যায়নি৷"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"নিরাপদ মোডে <xliff:g id="APP">%s</xliff:g> অক্ষম করা হয়েছে৷"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"সবকিছু সাফ করুন"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভক্ত স্ক্রিন ব্যবহার করতে এখানে টেনে আনুন"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"একটি অ্যাপ ছেড়ে দ্রুত অন্য অ্যাপে যেতে ডান দিকে টেনে আনুন"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"অনুভূমিক স্প্লিট"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উল্লম্ব স্প্লিট"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"কাস্টম স্প্লিট করুন"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"স্ক্রিনটি উপরের দিকে বিভক্ত করুন"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"স্ক্রিনটি বাঁদিকে বিভক্ত করুন"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"স্ক্রিনটি ডানদিকে বিভক্ত করুন"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"\'এক নজরে\' বৈশিষ্ট্যটি চালু বা বন্ধ করুন"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"চার্জ হয়েছে"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"চার্জ হচ্ছে"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ছোট করে দিন"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"এই বিজ্ঞপ্তিগুলি বন্ধ করা যাবে না"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"এই অ্যাপটি ক্যামেরা ব্যবহার করছে।"</string>
<string name="appops_microphone" msgid="741508267659494555">"এই অ্যাপটি মাইক্রোফোন ব্যবহার করছে।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"এই অ্যাপটি স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে।"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"চার্জ করার সময় শতাংশ দেখান (ডিফল্ট)"</item>
<item msgid="3327323682209964956">"এই আইকনটি দেখাবেন না"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"অন্যান্য"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"বিভক্ত-স্ক্রিন বিভাজক"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"বাঁ দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index ca09219ad593..42616a637546 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistemski UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Obriši"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Uklanjanje sa spiska"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacije o aplikaciji"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ovdje se prikazuju nedavno korišteni ekrani"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Odbaci nedavne aplikacije"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d ekran u Pregledu</item>
- <item quantity="few">%d ekrana u Pregledu</item>
- <item quantity="other">%d ekrana u Pregledu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nema obavještenja"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U toku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavještenja"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otvori telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otvori glasovnu pomoć"</string>
<string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Prostor za poruku za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdite"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Odbaci aplikaciju <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> uklonjena."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Sve nedavno korištene aplikacije su odbačene."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otvaranje informacija o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Pokrećem aplikaciju <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obavještenje je uklonjeno."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Obavještenja sa sjenčenjem."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Brze postavke."</string>
@@ -321,7 +306,7 @@
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za emitiranje"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"Nema dostupnih uređaja"</string>
- <string name="quick_settings_cast_no_wifi" msgid="2696477881905521882">"Wi-Fi mreža nije povezana"</string>
+ <string name="quick_settings_cast_no_wifi" msgid="2696477881905521882">"WiFi mreža nije povezana"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Osvjetljenje"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
<string name="quick_settings_inversion_label" msgid="8790919884718619648">"Inverzija boja"</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nema nedavnih stavki"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Sve ste obrisali"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kačenje ekrana"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pretraživanje"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> je onemogućena u sigurnom načinu rada."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje za korištenje podijeljenog ekrana"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prevucite prema gore za promjenu aplikacije"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Prevucite udesno za brzu promjenu aplikacija"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podjela po horizontali"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podjela po vertikali"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođena podjela"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dijeli ekran nagore"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dijeli ekran nalijevo"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dijeli ekran nadesno"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Pregled uključivanja/isključivanja"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjeno"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
@@ -624,6 +594,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Nastaviti prikazivanje obavještenja iz ove aplikacije?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ova obavještenja nije moguće isključiti"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija prekriva druge aplikacije na ekranu."</string>
@@ -760,6 +731,7 @@
<item msgid="2139628951880142927">"Pokaži postotak u toku punjenja (zadano)"</item>
<item msgid="3327323682209964956">"Ne prikazuj ovu ikonu"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Prikaži ikone obavijesti niskog prioriteta"</string>
<string name="other" msgid="4060683095962566764">"Ostalo"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Razdjelnik ekrana"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Lijevo cijeli ekran"</string>
@@ -791,7 +763,7 @@
<string name="accessibility_quick_settings_user" msgid="1567445362870421770">"Prijavljeni ste kao <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="data_connection_no_internet" msgid="4503302451650972989">"Nema internetske veze"</string>
<string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"Otvori detalje."</string>
- <string name="accessibility_quick_settings_not_available" msgid="4190068184294019846">"Nije dostupno jer <xliff:g id="REASON">%s</xliff:g>"</string>
+ <string name="accessibility_quick_settings_not_available" msgid="4190068184294019846">"Nije dostupno zbog razloga <xliff:g id="REASON">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvori postavke za: <xliff:g id="ID_1">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Urediti raspored postavki."</string>
<string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 7b4fdaddb450..d7300f6ec6e6 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"IU del sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Esborra"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Elimina de la llista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informació de l\'aplicació"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí es mostren les teves pantalles recents."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignora les aplicacions recents"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d pantalles en la visió general</item>
- <item quantity="one">1 pantalla en la visió general</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"obre el telèfon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"obre l\'assistència per veu"</string>
<string name="camera_label" msgid="7261107956054836961">"obre la càmera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el disseny de la tasca nova"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel·la"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Àrea de missatge d\'ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirma"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignora <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"S\'ha omès <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"S\'han descartat totes les aplicacions recents."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Obre la informació sobre l\'aplicació <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"S\'està iniciant <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificació omesa."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Àrea de notificacions"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuració ràpida"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"L\'NFC està desactivada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"L\'NFC està activada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No hi ha cap element recent"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Ho has esborrat tot"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informació de l\'aplicació"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixació de pantalla"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"No s\'ha pogut iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"En mode segur, l\'aplicació <xliff:g id="APP">%s</xliff:g> està desactivada."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Esborra-ho tot"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrossega-ho aquí per utilitzar la pantalla dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Llisca cap amunt per canviar d\'aplicació"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arrossega el dit cap a la dreta per canviar ràpidament d\'aplicació"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisió horitzontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisió vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisió personalitzada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Divideix la pantalla cap amunt"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Divideix la pantalla cap a l\'esquerra"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Divideix la pantalla cap a la dreta"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Activa o desactiva Aplicacions recents"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"S\'està carregant"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimitza"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vols continuar rebent notificacions d\'aquesta aplicació?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Aquestes notificacions no es poden desactivar"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"mitjançant <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Aquesta aplicació utilitza la càmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Aquesta aplicació utilitza el micròfon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Aquesta aplicació es mostra sobre altres aplicacions a la pantalla."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostra el percentatge quan es carregui (opció predeterminada)"</item>
<item msgid="3327323682209964956">"No mostris aquesta icona"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostra les icones de notificació amb prioritat baixa"</string>
<string name="other" msgid="4060683095962566764">"Altres"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalles"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Pantalla esquerra completa"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f8f79cea36ee..0efbe7d792ca 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI systému"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odebrat ze seznamu"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"O aplikaci"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Zde budou zobrazeny vaše poslední obrazovky"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zavřít nové aplikace"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="few">%d obrazovky v Přehledu</item>
- <item quantity="many">%d obrazovky v Přehledu</item>
- <item quantity="other">%d obrazovek v Přehledu</item>
- <item quantity="one">1 obrazovka v Přehledu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žádná oznámení"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otevřít telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otevřít hlasovou asistenci"</string>
<string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string>
<string name="cancel" msgid="6442560571259935130">"Zrušit"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast pro zprávu nápovědy"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdit"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zavřít aplikaci <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikace <xliff:g id="APP">%s</xliff:g> byla odebrána."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všechny naposledy použité aplikace byly odstraněny."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otevře informace o aplikaci <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Spouštění aplikace <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Oznámení je zavřeno."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Panel oznámení."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rychlé nastavení."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je vypnuto"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je zapnuto"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Žádné nedávné položky"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Vše je vymazáno"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informace o aplikaci"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"připnutí obrazovky"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"vyhledat"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikaci <xliff:g id="APP">%s</xliff:g> nelze spustit."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikace <xliff:g id="APP">%s</xliff:g> je v nouzovém režimu zakázána."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazat vše"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Rozdělenou obrazovku můžete použít přetažením zde"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Přejetím nahoru přepnete aplikace"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Přetažením doprava rychle přepnete aplikace"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vodorovné rozdělení"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikální rozdělení"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Vlastní rozdělení"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Rozdělit obrazovku nahoru"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Rozdělit obrazovku vlevo"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Rozdělit obrazovku vpravo"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Přepnout přehled"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabito"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíjení"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovat"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tato oznámení nelze deaktivovat"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Tato aplikace využívá fotoaparát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Tato aplikace využívá mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Tato aplikace se zobrazuje přes ostatní aplikace na obrazovce."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Zobrazovat procento při nabíjení (výchozí nastavení)"</item>
<item msgid="3327323682209964956">"Tuto ikonu nezobrazovat"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Jiné"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Čára rozdělující obrazovku"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Levá část na celou obrazovku"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 789436170afc..d470582b8e82 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Appinfo"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Dine seneste skærme vises her"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Luk de seneste apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d skærmbilleder i Oversigt</item>
- <item quantity="other">%d skærmbilleder i Oversigt</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen underretninger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"I gang"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Underretninger"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"åbn telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"åbn taleassistent"</string>
<string name="camera_label" msgid="7261107956054836961">"åbn kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Vælg nyt opgavelayout"</string>
<string name="cancel" msgid="6442560571259935130">"Annuller"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område med hjælpemeddelelse"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekræft"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Afvis <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> er annulleret."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle de seneste apps er lukket."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Åbn appoplysningerne for <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> startes."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Underretningen er annulleret."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Underretningspanel."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtige indstillinger."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er deaktiveret"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er aktiveret"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Ingen nye elementer"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Du har ryddet alt"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Oplysninger om applikationen"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skærmfastholdelse"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"søg"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> kunne ikke startes."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er deaktiveret i sikker tilstand."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ryd alle"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Træk hertil for at bruge opdelt skærm"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Stryg opad for at skifte apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Træk til højre for hurtigt at skifte app"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Opdel vandret"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Opdel lodret"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Opdel brugerdefineret"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Opdelt skærm øverst"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Opdelt skærm til venstre"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Opdelt skærm til højre"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Slå Oversigt til/fra"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opladet"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Oplader"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se underretninger fra denne app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse underretninger kan ikke deaktiveres"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Denne app anvender kameraet."</string>
<string name="appops_microphone" msgid="741508267659494555">"Denne app anvender mikrofonen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Denne app vises over andre apps på din skærm."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Vis procent ved opladning (standard)"</item>
<item msgid="3327323682209964956">"Vis ikke dette ikon"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Andet"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Adskiller til opdelt skærm"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vis venstre del i fuld skærm"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 47aaaedf1b52..7fcb02cf3f1a 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Aus Liste entfernen"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-Info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Hier siehst du deine zuletzt geöffneten Apps."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Kürzlich geöffnete Apps schließen"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d Bildschirme in der Übersicht</item>
- <item quantity="one">1 Bildschirm in der Übersicht</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Keine Benachrichtigungen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktuell"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Benachrichtigungen"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"Telefon öffnen"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"Sprachassistent öffnen"</string>
<string name="camera_label" msgid="7261107956054836961">"Kamera öffnen"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Neues Aufgabenlayout auswählen"</string>
<string name="cancel" msgid="6442560571259935130">"Abbrechen"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bereich für die Hilfemeldung"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bestätigen"</string>
@@ -192,11 +183,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> beenden"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> entfernt"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle kürzlich verwendeten Apps wurden entfernt."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Infos zur App \"<xliff:g id="APP">%s</xliff:g>\" öffnen."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> wird gestartet."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Benachrichtigung geschlossen"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Benachrichtigungsleiste"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Schnelleinstellungen"</string>
@@ -216,9 +202,9 @@
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Der Flugmodus ist aktiviert."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="2960643943620637020">"lautlos"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3357131899365865386">"nur Wecker"</string>
- <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Nicht stören."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Nicht stören\" deaktiviert"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Nicht stören\" aktiviert"</string>
+ <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Bitte nicht stören."</string>
+ <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Bitte nicht stören\" deaktiviert"</string>
+ <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Bitte nicht stören\" aktiviert"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth deaktiviert"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth aktiviert"</string>
@@ -280,7 +266,7 @@
<string name="start_dreams" msgid="5640361424498338327">"Bildschirmschoner"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
<string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Halte die Symbole gedrückt, um weitere Optionen zu sehen"</string>
- <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nicht stören"</string>
+ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Bitte nicht stören"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Nur wichtige Unterbrechungen"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Nur Wecker"</string>
<string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Lautlos"</string>
@@ -359,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ist deaktiviert"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ist aktiviert"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Keine kürzlich verwendeten Elemente"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Du hast alles gelöscht"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"App-Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Bildschirmfixierung"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"Suche"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> konnte nicht gestartet werden."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ist im abgesicherten Modus deaktiviert."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alle schließen"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Hierher ziehen, um den Bildschirm zu teilen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Nach oben wischen, um Apps zu wechseln"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Zum schnellen Wechseln der Apps nach rechts ziehen"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Geteilte Schaltfläche – horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Geteilte Schaltfläche – vertikal"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Geteilte Schaltfläche – benutzerdefiniert"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Geteilten Bildschirm oben anzeigen"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Geteilten Bildschirm auf linker Seite anzeigen"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Geteilten Bildschirm auf der rechten Seite anzeigen"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Übersicht ein-/ausblenden"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Aufgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Wird aufgeladen"</string>
@@ -622,6 +593,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimieren"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Benachrichtigungen dieser App weiterhin anzeigen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Diese Benachrichtigungen können nicht deaktiviert werden"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"über <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Diese App verwendet die Kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Diese App verwendet das Mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Diese App wird über anderen Apps auf dem Bildschirm angezeigt."</string>
@@ -699,9 +671,9 @@
<string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"Kalender"</string>
<string name="tuner_full_zen_title" msgid="4540823317772234308">"Einschließlich Lautstärkeregler anzeigen"</string>
- <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Nicht stören"</string>
+ <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Bitte nicht stören"</string>
<string name="volume_dnd_silent" msgid="4363882330723050727">"Tastenkombination für Lautstärketasten"</string>
- <string name="volume_up_silent" msgid="7141255269783588286">"\"Nicht stören\" bei \"Lauter\" deaktivieren"</string>
+ <string name="volume_up_silent" msgid="7141255269783588286">"\"Bitte nicht stören\" bei \"Lauter\" deaktivieren"</string>
<string name="battery" msgid="7498329822413202973">"Akku"</string>
<string name="clock" msgid="7416090374234785905">"Uhr"</string>
<string name="headset" msgid="4534219457597457353">"Headset"</string>
@@ -756,6 +728,7 @@
<item msgid="2139628951880142927">"Prozentwert beim Laden anzeigen (Standardeinstellung)"</item>
<item msgid="3327323682209964956">"Dieses Symbol nicht anzeigen"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Symbole für Benachrichtigungen mit einer niedrigen Priorität anzeigen"</string>
<string name="other" msgid="4060683095962566764">"Sonstiges"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Bildschirmteiler"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vollbild links"</string>
@@ -840,10 +813,10 @@
<string name="mobile_data_text_format" msgid="3526214522670876454">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="1838559392210456893">"WLAN ist deaktiviert"</string>
<string name="bt_is_off" msgid="2640685272289706392">"Bluetooth ist deaktiviert"</string>
- <string name="dnd_is_off" msgid="6167780215212497572">"\"Nicht stören\" ist deaktiviert"</string>
- <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"\"Nicht stören\" wurde von einer automatischen Regel aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"\"Nicht stören\" wurde von einer App aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
- <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"\"Nicht stören\" wurde von einer automatischen Regel oder einer App aktiviert."</string>
+ <string name="dnd_is_off" msgid="6167780215212497572">"\"Bitte nicht stören\" ist deaktiviert"</string>
+ <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"\"Bitte nicht stören\" wurde von einer automatischen Regel aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
+ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"\"Bitte nicht stören\" wurde von einer App aktiviert (<xliff:g id="ID_1">%s</xliff:g>)."</string>
+ <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"\"Bitte nicht stören\" wurde von einer automatischen Regel oder einer App aktiviert."</string>
<string name="qs_dnd_until" msgid="3469471136280079874">"Bis <xliff:g id="ID_1">%s</xliff:g>"</string>
<string name="qs_dnd_keep" msgid="1825009164681928736">"Beibehalten"</string>
<string name="qs_dnd_replace" msgid="8019520786644276623">"Ersetzen"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index ea16ba4b31ef..12f0d532e2d1 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI συστήματ."</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Διαγραφή"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Κατάργηση από τη λίστα"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Πληροφορίες εφαρμογής"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Οι πρόσφατες οθόνες σας εμφανίζονται εδώ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Παράβλεψη πρόσφατων εφαρμογών"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d οθόνες στην Επισκόπηση</item>
- <item quantity="one">1 οθόνη στην Επισκόπηση</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Δεν υπάρχουν ειδοποιήσεις"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Εν εξελίξει"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ειδοποιήσεις"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"άνοιγμα τηλεφώνου"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"άνοιγμα φωνητικής υποβοήθησης"</string>
<string name="camera_label" msgid="7261107956054836961">"άνοιγμα φωτογραφικής μηχανής"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Επιλέξτε τη νέα διάταξη εργασίας"</string>
<string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Περιοχή μηνυμάτων βοήθειας"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Επιβεβαίωση"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Παράβλεψη <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Απορρίφθηκαν <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Έγινε παράβλεψη όλων των πρόσφατων εφαρμογών."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Άνοιγμα πληροφοριών εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Έναρξη <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Η ειδοποίηση έχει απορριφθεί."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Πλαίσιο σκίασης ειδοποιήσεων."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Γρήγορες ρυθμίσεις."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Το NFC είναι απενεργοποιημένο"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Το NFC είναι ενεργοποιημένο"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Δεν υπάρχουν πρόσφατα στοιχεία"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Έχει γίνει διαγραφή όλων των στοιχείων"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Πληροφορίες εφαρμογής"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"καρφίτσωμα οθόνης"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"αναζήτηση"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Δεν ήταν δυνατή η εκκίνηση της εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> έχει απενεργοποιηθεί στην ασφαλή λειτουργία."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Διαγραφή όλων"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Σύρετε εδώ για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Σύρετε προς τα επάνω για εναλλαγή των εφαρμογών"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Σύρετε προς τα δεξιά για γρήγορη εναλλαγή εφαρμογών"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Οριζόντιος διαχωρισμός"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Κάθετος διαχωρισμός"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Προσαρμοσμένος διαχωρισμός"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Διαχωρισμός οθόνης στην κορυφή"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Διαχωρισμός οθόνης στα αριστερά"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Διαχωρισμός οθόνης στα δεξιά"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Εναλλαγή επισκόπησης"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Φορτίστηκε"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Φόρτιση"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Ελαχιστοποίηση"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Αδύνατη η απενεργοποίηση αυτών των ειδοποιήσεων"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Αυτή η εφαρμογή χρησιμοποιεί την κάμερα."</string>
<string name="appops_microphone" msgid="741508267659494555">"Αυτή η εφαρμογή χρησιμοποιεί το μικρόφωνο."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Αυτή η εφαρμογή εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Να εμφανίζεται ποσοστό κατά τη φόρτιση (προεπιλογή)"</item>
<item msgid="3327323682209964956">"Να μην εμφανίζεται αυτό το εικονίδιο"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Άλλο"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Διαχωριστικό οθόνης"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Αριστερή πλήρης οθόνη"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index b7da3835e6dd..82c91c7584fc 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dismiss recent apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d screens in Overview</item>
- <item quantity="one">1 screen in Overview</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"open phone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string>
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Drag right to quickly switch apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Split screen to the top"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Split screen to the left"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Split screen to the right"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Toggle Overview"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Show percentage when charging (default)"</item>
<item msgid="3327323682209964956">"Don\'t show this icon"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Show low-priority notification icons"</string>
<string name="other" msgid="4060683095962566764">"Other"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Split screen divider"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Left full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 19e9b6400f20..361310efb97b 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dismiss recent apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d screens in Overview</item>
- <item quantity="one">1 screen in Overview</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"open phone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string>
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Drag right to quickly switch apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Split screen to the top"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Split screen to the left"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Split screen to the right"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Toggle Overview"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Show percentage when charging (default)"</item>
<item msgid="3327323682209964956">"Don\'t show this icon"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Show low-priority notification icons"</string>
<string name="other" msgid="4060683095962566764">"Other"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Split screen divider"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Left full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b7da3835e6dd..82c91c7584fc 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dismiss recent apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d screens in Overview</item>
- <item quantity="one">1 screen in Overview</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"open phone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string>
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Drag right to quickly switch apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Split screen to the top"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Split screen to the left"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Split screen to the right"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Toggle Overview"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Show percentage when charging (default)"</item>
<item msgid="3327323682209964956">"Don\'t show this icon"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Show low-priority notification icons"</string>
<string name="other" msgid="4060683095962566764">"Other"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Split screen divider"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Left full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b7da3835e6dd..82c91c7584fc 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"System UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Clear"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remove from list"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dismiss recent apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d screens in Overview</item>
- <item quantity="one">1 screen in Overview</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No notifications"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ongoing"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"open phone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string>
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Dismiss <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Open <xliff:g id="APP">%s</xliff:g> application info."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No recent items"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"You\'ve cleared everything"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"screen pinning"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Drag right to quickly switch apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Split screen to the top"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Split screen to the left"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Split screen to the right"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Toggle Overview"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Show percentage when charging (default)"</item>
<item msgid="3327323682209964956">"Don\'t show this icon"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Show low-priority notification icons"</string>
<string name="other" msgid="4060683095962566764">"Other"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Split screen divider"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Left full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 97ddf61bab35..8005d797ee31 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎System UI‎‏‎‎‏‎"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎Clear‎‏‎‎‏‎"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎Remove from list‎‏‎‎‏‎"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‏‎App info‎‏‎‎‏‎"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎Your recent screens appear here‎‏‎‎‏‎"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‏‎Dismiss recent apps‎‏‎‎‏‎"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎%d screens in Overview‎‏‎‎‏‎</item>
- <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎1 screen in Overview‎‏‎‎‏‎</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎No notifications‎‏‎‎‏‎"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎Ongoing‎‏‎‎‏‎"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‎‎Notifications‎‏‎‎‏‎"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎open phone‎‏‎‎‏‎"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‎‎open voice assist‎‏‎‎‏‎"</string>
<string name="camera_label" msgid="7261107956054836961">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎open camera‎‏‎‎‏‎"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎Select new task layout‎‏‎‎‏‎"</string>
<string name="cancel" msgid="6442560571259935130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎Cancel‎‏‎‎‏‎"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎Help message area‎‏‎‎‏‎"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎Confirm‎‏‎‎‏‎"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎Dismiss ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ dismissed.‎‏‎‎‏‎"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎All recent applications dismissed.‎‏‎‎‏‎"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‎Open ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ application info.‎‏‎‎‏‎"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‏‎Starting ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎Notification dismissed.‎‏‎‎‏‎"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎Notification shade.‎‏‎‎‏‎"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎Quick settings.‎‏‎‎‏‎"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎NFC‎‏‎‎‏‎"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎NFC is disabled‎‏‎‎‏‎"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‎NFC is enabled‎‏‎‎‏‎"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎No recent items‎‏‎‎‏‎"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎You\'ve cleared everything‎‏‎‎‏‎"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎Application Info‎‏‎‎‏‎"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎screen pinning‎‏‎‎‏‎"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎search‎‏‎‎‏‎"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎Could not start ‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="APP">%s</xliff:g>‎‏‎‎‏‏‏‎ is disabled in safe-mode.‎‏‎‎‏‎"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‎Clear all‎‏‎‎‏‎"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎Drag here to use split screen‎‏‎‎‏‎"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎Swipe up to switch apps‎‏‎‎‏‎"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎Drag right to quickly switch apps‎‏‎‎‏‎"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎Split Horizontal‎‏‎‎‏‎"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎Split Vertical‎‏‎‎‏‎"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎Split Custom‎‏‎‎‏‎"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎Split screen to the top‎‏‎‎‏‎"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎Split screen to the left‎‏‎‎‏‎"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎Split screen to the right‎‏‎‎‏‎"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎Toggle Overview‎‏‎‎‏‎"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎Charged‎‏‎‎‏‎"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎Charging‎‏‎‎‏‎"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎Minimize‎‏‎‎‏‎"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎Keep showing notifications from this app?‎‏‎‎‏‎"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎These notifications can\'t be turned off‎‏‎‎‏‎"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎via ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="appops_camera" msgid="8100147441602585776">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎This app is using the camera.‎‏‎‎‏‎"</string>
<string name="appops_microphone" msgid="741508267659494555">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‏‏‎This app is using the microphone.‎‏‎‎‏‎"</string>
<string name="appops_overlay" msgid="6165912637560323464">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎This app is displaying over other apps on your screen.‎‏‎‎‏‎"</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎Show percentage when charging (default)‎‏‎‎‏‎"</item>
<item msgid="3327323682209964956">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎Don\'t show this icon‎‏‎‎‏‎"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎Show low-priority notification icons‎‏‎‎‏‎"</string>
<string name="other" msgid="4060683095962566764">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎Other‎‏‎‎‏‎"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎Split-screen divider‎‏‎‎‏‎"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎Left full screen‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 35499f0173d7..3f3187b51061 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"IU del sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Eliminar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminar de la lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Las pantallas recientes aparecen aquí."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Rechazar aplicaciones recientes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d pantallas en Recientes</item>
- <item quantity="one">1 pantalla en Recientes</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No hay notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir el asistente de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el nuevo diseño de la tarea."</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensajes de ayuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rechazar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartada."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se descartaron todas las aplicaciones recientes."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre la información de la aplicación de <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación ignorada"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pantalla de notificaciones"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La tecnología NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La tecnología NFC está habilitada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No hay elementos recientes"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Todo borrado"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Fijar pantalla"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"No se pudo iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> está inhabilitada en modo seguro."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para usar la pantalla dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Desliza el dedo hacia arriba para cambiar de app"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arrastra a la derecha para cambiar aplicaciones rápidamente"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dividir pantalla en la parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dividir pantalla a la izquierda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dividir pantalla a la derecha"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Ocultar o mostrar Recientes"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"No se pueden desactivar estas notificaciones"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta app está usando la cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta app está usando el micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta app se muestra sobre otras apps en la pantalla."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Mostrar el porcentaje durante la carga (predeterminado)"</item>
<item msgid="3327323682209964956">"No mostrar este ícono"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Otros"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalla dividida"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Pantalla izquierda completa"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 54364a5f6210..356ef45524fe 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI del sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Quitar de la lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información de la aplicación"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí aparecerán tus aplicaciones recientes"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Descartar aplicaciones recientes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d pantallas en Aplicaciones recientes</item>
- <item quantity="one">1 pantalla en Aplicaciones recientes</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir el asistente de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar diseño de tarea nueva"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaje de ayuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Se ha eliminado <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se han ignorado todas las aplicaciones recientes."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre la información de la aplicación <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación ignorada"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pantalla de notificaciones"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ajustes rápidos"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La conexión NFC está inhabilitada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La conexión NFC está habilitada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"No hay elementos recientes"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Has rechazado todo"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fijación de pantalla"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"No se ha podido iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para utilizar la pantalla dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Desliza el dedo hacia arriba para cambiar de aplicación"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arrastra hacia la derecha para cambiar rápidamente de aplicación"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dividir la pantalla en la parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dividir la pantalla a la izquierda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dividir la pantalla a la derecha"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Mostrar u ocultar aplicaciones recientes"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta aplicación?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Estas notificaciones no se pueden desactivar"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está usando la cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está usando el micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación se está mostrando sobre otras aplicaciones en tu pantalla."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostrar porcentaje durante la carga (predeterminado)"</item>
<item msgid="3327323682209964956">"No mostrar este icono"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostrar iconos de notificaciones con prioridad baja"</string>
<string name="other" msgid="4060683095962566764">"Otros"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Dividir la pantalla"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Pantalla izquierda completa"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 90e9334eb47c..f125b84bdf16 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Süsteemi UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tühjenda"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Loendist eemaldamine"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Rakenduse teave"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Teie viimane ekraanikuva ilmub siia"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loobu hiljutistest rakendustest"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d ekraani jaotises Ülevaade</item>
- <item quantity="one">1 ekraan jaotises Ülevaade</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Teatisi pole"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Jätkuv"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Märguanded"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ava telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ava häälabi"</string>
<string name="camera_label" msgid="7261107956054836961">"ava kaamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Uue toimingu paigutuse valimine"</string>
<string name="cancel" msgid="6442560571259935130">"Tühista"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Abisõnumi ala"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kinnita"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rakendusest <xliff:g id="APP">%s</xliff:g> loobumine."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Loobusite rakendusest <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kõikidest hiljutistest rakendustest on loobutud"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Rakenduse <xliff:g id="APP">%s</xliff:g> teabe avamine."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Rakenduse <xliff:g id="APP">%s</xliff:g> käivitamine."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Märguandest on loobutud."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Märguande vari."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Kiirseaded."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on keelatud"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on lubatud"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Hiljutisi üksusi pole"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Olete kõik ära kustutanud"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Rakenduse teave"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekraanikuva kinnitamine"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"otsing"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Rakendust <xliff:g id="APP">%s</xliff:g> ei saanud käivitada."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Rakendus <xliff:g id="APP">%s</xliff:g> on turvarežiimis keelatud."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kustuta kõik"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Jagatud ekraani kasutamiseks lohistage siia"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Rakenduste vahetamiseks pühkige üles"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Lohistage paremale, et rakendusi kiiresti vahetada"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horisontaalne poolitamine"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikaalne poolitamine"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Kohandatud poolitamine"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Poolita ekraan üles"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Poolita ekraan vasakule"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Poolita ekraan paremale"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Lehe Ülevaade sisse- ja väljalülitamine"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laetud"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laadimine"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimeeri"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Kas jätkata selle rakenduse märguannete kuvamist?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Neid märguandeid ei saa välja lülitada"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"See rakendus kasutab kaamerat."</string>
<string name="appops_microphone" msgid="741508267659494555">"See rakendus kasutab mikrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"See rakendus kuvatakse teie ekraanil muude rakenduste peal."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Kuva protsent laadimisel (vaikimisi)"</item>
<item msgid="3327323682209964956">"Ära kuva seda ikooni"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Muu"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Ekraanijagaja"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vasak täisekraan"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index c6314e4a7315..6e3f09485be0 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistemaren interfazea"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Garbitu"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Kendu zerrendatik"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Aplikazioaren informazioa"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ikusitako azken pantailak erakusten dira hemen"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Baztertu azken aplikazioak"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d pantaila daude ikuspegi orokorrean</item>
- <item quantity="one">Pantaila bat dago ikuspegi orokorrean</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ez dago jakinarazpenik"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Abian"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Jakinarazpenak"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ireki telefonoan"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ireki ahots-laguntza"</string>
<string name="camera_label" msgid="7261107956054836961">"ireki kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Hautatu zereginen diseinua"</string>
<string name="cancel" msgid="6442560571259935130">"Utzi"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Laguntza-mezuaren eremua"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Berretsi"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Baztertu <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> baztertu da."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Azken aplikazio guztiak baztertu da."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Ireki <xliff:g id="APP">%s</xliff:g> aplikazioari buruzko informazioa."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> hasten."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Jakinarazpena baztertu da."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Jakinarazpenen panela."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ezarpen bizkorrak."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Desgaituta dago NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Gaituta dago NFC"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Ez dago azkenaldi honetako ezer"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Dena garbitu duzu"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Aplikazioaren informazioa"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pantaila-ainguratzea"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"bilatu"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Ezin izan da hasi <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> desgaituta dago modu seguruan."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Garbitu guztiak"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastatu hau pantaila zatitzeko"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Egin gora aplikazioa aldatzeko"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arrastatu eskuinera aplikazioa azkar aldatzeko"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Zatitze horizontala"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Zatitze bertikala"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Zatitze pertsonalizatua"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Zatitu pantaila eta ezarri goian"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Zatitu pantaila eta ezarri ezkerrean"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Zatitu pantaila eta ezarri eskuinean"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Aldatu ikuspegi orokorra"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizatu"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Jakinarazpen hauek ezin dira desaktibatu"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren bidez"</string>
<string name="appops_camera" msgid="8100147441602585776">"Kamera erabiltzen ari da aplikazioa."</string>
<string name="appops_microphone" msgid="741508267659494555">"Mikrofonoa erabiltzen ari da aplikazioa."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Pantailako beste aplikazioen gainean agertzen da aplikazioa."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Erakutsi ehunekoa kargatu bitartean (balio lehenetsia)"</item>
<item msgid="3327323682209964956">"Ez erakutsi ikonoa"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Erakutsi lehentasun txikiko jakinarazpenen ikonoak"</string>
<string name="other" msgid="4060683095962566764">"Beste bat"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Pantaila-zatitzailea"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ezarri ezkerraldea pantaila osoan"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index ca38030cf79c..e785f76d3e43 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"رابط کاربر سیستم"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"پاک کردن"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"حذف از فهرست"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"اطلاعات برنامه"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"صفحه‌های اخیر شما اینجا نمایان می‌شوند"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"رد کردن برنامه‌های اخیر"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">‏%d صفحه در نمای کلی</item>
- <item quantity="other">‏%d صفحه در نمای کلی</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"اعلانی موجود نیست"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"در حال انجام"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اعلان‌ها"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"باز کردن تلفن"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"«دستیار صوتی» را باز کنید"</string>
<string name="camera_label" msgid="7261107956054836961">"باز کردن دوربین"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرح‌بندی جدید کار"</string>
<string name="cancel" msgid="6442560571259935130">"لغو"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"بخش پیام راهنما"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأیید"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"رد کردن <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> نادیده گرفته شد."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"همه برنامه‌های اخیر رد شدند."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"باز کردن اطلاعات برنامه <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> در حال شروع به کار است."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"اعلان ردشد."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"مجموعه اعلان."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"تنظیمات سریع."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"‏NFC غیرفعال است"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"‏NFC فعال است"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"بدون موارد اخیر"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"همه‌چیز را پاک کرده‌اید"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"اطلاعات برنامه"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"پین کردن صفحه"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"جستجو"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> شروع نشد."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> در حالت ایمن غیرفعال است."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"پاک کردن همه"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"برای استفاده از تقسیم صفحه، به اینجا بکشید"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"برای تغییر برنامه‌ها،‌ تند به بالا بکشید"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"برای جابه‌جایی سریع میان برنامه‌ها، به چپ بکشید"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسیم افقی"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسیم عمودی"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"سفارشی کردن تقسیم"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"تقسیم کردن صفحه به بالا"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"تقسیم کردن صفحه به چپ"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"تقسیم کردن صفحه به راست"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"تغییر وضعیت نمای کلی"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"شارژ کامل شد"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"در حال شارژ شدن"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"کوچک کردن"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"نمی‌توان این اعلان‌ها را خاموش کرد"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"این برنامه از دوربین استفاده می‌کند."</string>
<string name="appops_microphone" msgid="741508267659494555">"این برنامه از میکروفون استفاده می‌کند."</string>
<string name="appops_overlay" msgid="6165912637560323464">"این برنامه روی برنامه‌های دیگر در صفحه‌نمایش نشان داده می‌شود."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"هنگام شارژ شدن درصد نشان داده شود (پیش‌فرض)"</item>
<item msgid="3327323682209964956">"این نماد نشان داده نشود"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"موارد دیگر"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"تقسیم‌کننده صفحه"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"تمام‌صفحه چپ"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 412bee1d6036..af35a85d2f5c 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Käyttöliitt."</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tyhjennä"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Poista luettelosta"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Sovelluksen tiedot"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Äskettäin käytetyt ruudut näkyvät tässä"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Hylkää viimeaikaiset sovellukset"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d näyttöä Yleistä-kohdassa</item>
- <item quantity="one">1 näyttö Yleistä-kohdassa</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"avaa puhelin"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"Avaa ääniapuri"</string>
<string name="camera_label" msgid="7261107956054836961">"avaa kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Valitse uusi tehtävien asettelu"</string>
<string name="cancel" msgid="6442560571259935130">"Peruuta"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Ohjeviestialue"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Vahvista"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Hylätään <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> hylättiin."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kaikki viimeisimmät sovellukset on hylätty."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Avaa sovelluksen <xliff:g id="APP">%s</xliff:g> tiedot."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Käynnistetään <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Ilmoitus hylätty."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Ilmoitusalue."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Pika-asetukset."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on poistettu käytöstä"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on käytössä"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Ei viimeaikaisia kohteita"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Kaikki on hoidettu."</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Sovellustiedot"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"näytön kiinnitys"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"haku"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Sovelluksen <xliff:g id="APP">%s</xliff:g> käynnistäminen epäonnistui."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> on poistettu käytöstä vikasietotilassa."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tyhjennä kaikki"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Jaa näyttö vetämällä tähän."</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Vaihda sovellusta pyyhkäisemällä ylös"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Vaihda sovellusta nopeasti vetämällä oikealle"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vaakasuuntainen jako"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pystysuuntainen jako"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Muokattu jako"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Jaa näyttö ylös"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Jaa näyttö vasemmalle"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Jaa näyttö oikealle"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Näytä/piilota viimeisimmät"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Ladattu"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Ladataan"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Pienennä"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Näitä ilmoituksia ei voi poistaa käytöstä"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Tämä sovellus käyttää kameraa."</string>
<string name="appops_microphone" msgid="741508267659494555">"Tämä sovellus käyttää mikrofonia."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Tämä sovellus näkyy näytöllä muiden sovellusten päällä."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Näytä prosenttiluku latauksen aikana (oletus)"</item>
<item msgid="3327323682209964956">"Älä näytä tätä kuvaketta"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Näytä vähemmän tärkeät ilmoituskuvakkeet"</string>
<string name="other" msgid="4060683095962566764">"Muu"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Näytön jakaja"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vasen koko näytölle"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8821178de4bc..06f178aa3e13 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"IU système"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer de la liste"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informations sur l\'application"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vos écrans récents s\'affichent ici"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">Aperçu de %d écran</item>
- <item quantity="other">Aperçu de %d écrans</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"Ouvrir le téléphone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ouvrir l\'assistance vocale"</string>
<string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Ouvre les détails de l\'application <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Lancement de <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification masquée"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Volet des notifications"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Aucun élément récent"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Vous avez tout effacé"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Détails de l\'application"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"épinglage d\'écran"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> est désactivée en mode sans échec."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Effacer tout"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Glissez l\'élément ici pour utiliser l\'écran partagé"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Balayez vers le haut pour changer d\'application"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Balayez l\'écran vers la droite pour changer rapidement d\'application"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Séparation horizontale"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Séparation verticale"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Séparation personnalisée"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Écran partagé dans le haut"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Écran partagé à la gauche"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Écran partagé à la droite"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Basculer l\'aperçu"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargée"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charge en cours..."</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Cette application utilise l\'appareil photo."</string>
<string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le microphone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Cette application superpose du contenu par-dessus d\'autres applications à l\'écran."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Montrer le pourcentage durant la charge (par défaut)"</item>
<item msgid="3327323682209964956">"Ne pas afficher cette icône"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Autre"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Séparateur d\'écran partagé"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Plein écran à la gauche"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index e37722a00c3e..7157cb56c005 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"L\'interface"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Supprimer de la liste"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Infos application"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vos écrans récents s\'affichent ici"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d écran dans Aperçu</item>
- <item quantity="other">%d écrans dans Aperçu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ouvrir le téléphone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ouvrir l\'assistance vocale"</string>
<string name="camera_label" msgid="7261107956054836961">"ouvrir l\'appareil photo"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau plan de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Ouvre les informations sur l\'application <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Lancement de <xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification masquée"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Volet des notifications"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Aucun élément récent"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Vous avez tout effacé."</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Infos application"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"épinglage d\'écran"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"L\'application <xliff:g id="APP">%s</xliff:g> est désactivée en mode sécurisé."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tout fermer"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Faire glisser ici pour utiliser l\'écran partagé"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Balayer l\'écran vers le haut pour changer d\'application"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Déplacer vers la droite pour changer rapidement d\'application"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Séparation horizontale"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Séparation verticale"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Séparation personnalisée"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Partager l\'écran en haut"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Partager l\'écran sur la gauche"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Partager l\'écran sur la droite"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Activer/Désactiver l\'aperçu"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargé"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"En charge"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Cette application utilise la caméra."</string>
<string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le micro."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Cette application se superpose aux autres applications sur l\'écran."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Afficher le pourcentage lorsque l\'appareil est en charge (option par défaut)"</item>
<item msgid="3327323682209964956">"Ne plus afficher cette icône"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Autre"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Séparateur d\'écran partagé"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Écran de gauche en plein écran"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 80f3c93cd725..f17243e1829e 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"IU sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Quitar da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información da aplicación"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"As túas pantallas recentes aparecen aquí"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Rexeitar aplicacións recentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d pantallas en visión xeral</item>
- <item quantity="one">Unha pantalla en visión xeral</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Non hai notificacións"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacións"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir asistente de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar novo deseño de tarefas"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaxes de axuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Rexeitar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Rexeitouse <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Rexeitáronse todas as aplicacións recentes."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre a información da aplicación <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación rexeitada"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Sombra de notificación"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A opción NFC está desactivada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A opción NFC está activada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Non hai elementos recentes"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Borraches todo"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Información da aplicación"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixación de pantalla"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Non foi posible iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"A aplicación <xliff:g id="APP">%s</xliff:g> está desactivada no modo seguro"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastrar aquí para usar a pantalla dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Pasar o dedo cara arriba para cambiar de aplicación"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arrastra cara á dereita para cambiar de aplicacións rapidamente"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dividir en horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dividir en vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dividir de xeito personalizado"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dividir pantalla na parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dividir pantalla á esquerda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dividir pantalla á dereita"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Activar/desactivar Visión xeral"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Queres seguir mostrando as notificacións desta aplicación?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Non se poden desactivar estas notificacións"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está utilizando a cámara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está utilizando o micrófono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación móstrase sobre outras aplicacións da pantalla."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Mostrar porcentaxe durante a carga (predeterminado)"</item>
<item msgid="3327323682209964956">"Non mostrar esta icona"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Outros"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor de pantalla dividida"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Pantalla completa á esquerda"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index cf5692b274cf..1d555557bd3d 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"સિસ્ટમ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"સાફ કરો"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"સૂચિમાંથી દૂર કરો"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ઍપ્લિકેશન માહિતી"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"તમારી તાજેતરની સ્ક્રીન્સ અહીં દેખાય છે"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"તાજેતરની ઍપ્લિકેશનો કાઢી નાખો."</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">વિહંગાવલોકનમાં %d સ્ક્રીન્સ</item>
- <item quantity="other">વિહંગાવલોકનમાં %d સ્ક્રીન્સ</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"કોઈ સૂચનાઓ નથી"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ચાલુ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"નોટિફિકેશનો"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ફોન ખોલો"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"વૉઇસ સહાય ખોલો"</string>
<string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string>
<string name="cancel" msgid="6442560571259935130">"રદ કરો"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"સહાય સંદેશનું ક્ષેત્ર"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"કન્ફર્મ કરો"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખો."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખી."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"તમામ તાજેતરની ઍપ્લિકેશનો કાઢી નાખી."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ઍપ્લિકેશન માહિતી ખોલો."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> પ્રારંભ કરી રહ્યું છે."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"સૂચના કાઢી નાખી."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"નોટિફિકેશન શેડ."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ઝડપી સેટિંગ્સ."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC અક્ષમ કરેલ છે"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC સક્ષમ કરેલ છે"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"કોઇ તાજેતરની આઇટમ્સ નથી"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"તમે બધું સાફ કર્યું"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ઍપ્લિકેશન માહિતી"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"સ્ક્રીન પિનિંગ"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"શોધ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> પ્રારંભ કરી શકાયું નથી."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"સુરક્ષિત મોડમાં <xliff:g id="APP">%s</xliff:g> અક્ષમ કરેલ છે."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"બધું સાફ કરો"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરવા માટે અહીં ખેંચો"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ઍપને ઝડપથી સ્વિચ કરવા માટે જમણે ખેંચો"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"આડું વિભક્ત કરો"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ઊભું વિભક્ત કરો"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"કસ્ટમ વિભક્ત કરો"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"સ્ક્રીનને ઉપરની તરફ વિભાજિત કરો"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"સ્ક્રીનને ડાબી તરફ વિભાજિત કરો"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"સ્ક્રીનને જમણી તરફ વિભાજિત કરો"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ઝલકને ટૉગલ કરો"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ચાર્જ થઈ ગયું"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ચાર્જ થઈ રહ્યું છે"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"નાનું કરો"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"આ નોટિફિકેશન બંધ કરી શકશો નહીં"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"આ ઍપ કૅમેરાનો ઉપયોગ કરી રહી છે."</string>
<string name="appops_microphone" msgid="741508267659494555">"આ ઍપ માઇક્રોફોનનો ઉપયોગ કરી રહી છે."</string>
<string name="appops_overlay" msgid="6165912637560323464">"આ ઍપ તમારી સ્ક્રીન પરની અન્ય ઍપની ઉપર પ્રદર્શિત થઈ રહી છે."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ચાર્જ થાય ત્યારે ટકાવારી બતાવો (ડિફોલ્ટ)"</item>
<item msgid="3327323682209964956">"આ આઇકન બતાવશો નહીં"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"અન્ય"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"સ્પ્લિટ-સ્ક્રીન વિભાજક"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ડાબી પૂર્ણ સ્ક્રીન"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index ac34e9a11c70..e6004f3e5b84 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"सिस्‍टम यूआई"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"साफ़ करें"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूची से निकालें"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ऐप की जानकारी"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"आपकी हाल की स्‍क्रीन यहां दिखाई देती हैं"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के ऐप्स खारिज करें"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d स्क्रीन की खास जानकारी</item>
- <item quantity="other">%d स्क्रीन की खास जानकारी</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई सूचना नहीं है"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाएं"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"फ़ोन खोलें"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"आवाज़ से डिवाइस को इस्तेमाल करें"</string>
<string name="camera_label" msgid="7261107956054836961">"कैमरा खोलें"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द करें"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"सहायता का मैसेज दिखाने की जगह"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि करें"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> को ख़ारिज करें."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खा़रिज कर दिया गया."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"हाल ही के सभी ऐप्लिकेशन ख़ारिज कर दिए गए."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ऐप्लिकेशन की जानकारी खोलें."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> प्रारंभ हो रहा है."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारिज की गई."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना शेड."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"त्वरित सेटिंग."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"एनएफ़सी"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC बंद है"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC चालू है"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"हाल ही का कोई आइटम नहीं"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"आपने सब कुछ साफ़ कर दिया है"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ऐप्लिकेशन की जानकारी"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्क्रीन पिन करना"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"सर्च"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ नहीं किया जा सका."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> को सुरक्षित-मोड में बंद किया गया."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"स्क्रीन के दो हिस्से में बंट जाने, स्पिल्ट स्क्रीन, का इस्तेमाल करने के लिए यहां खींचें और छोडें"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ऐप्लिकेशन को झटपट स्विच करने के लिए उसे दाईं ओर खींचें और छोड़ें"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अपने मुताबिक बांटें"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ऊपर की ओर दो स्क्रीन बनाएं"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"बाईं ओर दो स्क्रीन बनाएं"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"दाईं ओर दो स्क्रीन बनाएं"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"खास जानकारी टॉगल करें"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज हो गई है"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हो रही है"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"सूचनाएं छोटी करें"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ये सूचनाएं दिखाया जाना बंद नहीं किया जा सकता"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"यह ऐप्लिकेशन कैमरे का इस्तेमाल कर रहा है."</string>
<string name="appops_microphone" msgid="741508267659494555">"यह ऐप्लिकेशन माइक्रोफ़ोन का इस्तेमाल कर रहा है."</string>
<string name="appops_overlay" msgid="6165912637560323464">"यह ऐप्लिकेशन आपकी स्क्रीन पर इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"चार्ज होते समय प्रतिशत दिखाएं (डिफ़ॉल्ट)"</item>
<item msgid="3327323682209964956">"इस आइकॉन को ना दिखाएं"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"अन्य"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"विभाजित स्क्रीन विभाजक"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"बाईं स्क्रीन को पूर्ण स्क्रीन बनाएं"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 5df6999c7867..777a9ff6b97a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI sustava"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Očisti"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ukloni s popisa"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacije o aplikaciji"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ovdje se pojavljuju vaši nedavni zasloni"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Odbaci nedavne aplikacije"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d zaslon u Pregledu</item>
- <item quantity="few">%d zaslona u Pregledu</item>
- <item quantity="other">%d zaslona u Pregledu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bez obavijesti"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"U tijeku"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obavijesti"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otvaranje telefona"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otvaranje glasovne pomoći"</string>
<string name="camera_label" msgid="7261107956054836961">"otvaranje fotoaparata"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi izgled zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Odustani"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Područje poruke za pomoć"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Odbacivanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> odbačena je."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Odbačene su sve nedavne aplikacije."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otvaranje informacija o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Pokretanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obavijest je odbačena."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Zaslon obavijesti."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Brze postavke."</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nema nedavnih stavki"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Izbrisali ste sve"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"prikvačivanje zaslona"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pretraži"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> onemogućena je u sigurnom načinu."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši sve"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje da biste upotrebljavali podijeljeni zaslon"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prijeđite prstom prema gore da biste promijenili aplikaciju"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Povucite udesno da biste brzo promijenili aplikaciju"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podijeli vodoravno"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podijeli okomito"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podijeli prilagođeno"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Podijeli zaslon na vrhu"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Podijeli zaslon slijeva"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Podijeli zaslon zdesna"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Uključivanje/isključivanje pregleda"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjeno"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
@@ -622,6 +592,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obavijesti te aplikacije nastave prikazivati?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Te se obavijesti ne mogu isključiti"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija upotrebljava kameru."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija upotrebljava mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ova se aplikacija prikazuje preko drugih aplikacija na zaslonu."</string>
@@ -758,6 +729,7 @@
<item msgid="2139628951880142927">"Prikazuj postotak tijekom punjenja (zadano)"</item>
<item msgid="3327323682209964956">"Ne prikazuj tu ikonu"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Prikaži ikone obavijesti niskog prioriteta"</string>
<string name="other" msgid="4060683095962566764">"Ostalo"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Razdjelnik podijeljenog zaslona"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Lijevi zaslon u cijeli zaslon"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index f09a8b30a8d9..16db000c932e 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Rendszer UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Törlés"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eltávolítás a listából"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Alkalmazásinformáció"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"A legutóbbi képernyők itt jelennek meg"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Újabb alkalmazások elvetése"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d képernyő áttekintés alatt</item>
- <item quantity="one">1 képernyő áttekintés alatt</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nincs értesítés"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Folyamatban van"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Értesítések"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"telefon megnyitása"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"hangsegéd megnyitása"</string>
<string name="camera_label" msgid="7261107956054836961">"kamera megnyitása"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Új feladatelrendezés kiválasztása"</string>
<string name="cancel" msgid="6442560571259935130">"Mégse"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Súgószöveg területe"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Megerősítés"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"A(z) <xliff:g id="APP">%s</xliff:g> elvetése."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eltávolítva."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Az összes alkalmazás eltávolítva a nemrég használtak közül."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"A(z) <xliff:g id="APP">%s</xliff:g> alkalmazás adatainak megnyitása."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"A(z) <xliff:g id="APP">%s</xliff:g> indítása."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Értesítés elvetve."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Értesítési felület."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Gyorsbeállítások."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Az NFC ki van kapcsolva"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Az NFC be van kapcsolva"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nincsenek mostanában használt elemek"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Mindent törölt"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Az alkalmazás adatai"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"képernyő rögzítése"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"keresés"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Nem lehet elindítani a következőt: <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"A(z) <xliff:g id="APP">%s</xliff:g> csökkentett módban ki van kapcsolva."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Összes törlése"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Húzza ide az osztott képernyő használatához"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Váltás az alkalmazások között felfelé csúsztatással"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Húzza jobbra az ujját az alkalmazások közötti gyors váltáshoz"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Osztott vízszintes"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Osztott függőleges"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Osztott egyéni"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Osztott képernyő felülre"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Osztott képernyő balra"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Osztott képernyő jobbra"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Áttekintés be- és kikapcsolása"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Feltöltve"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Töltés"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Kis méret"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Továbbra is megjelenjenek az alkalmazás értesítései?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ezeket az értesítéseket nem lehet kikapcsolni"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ez az alkalmazás használja a kamerát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ez az alkalmazás használja a mikrofont."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ez az alkalmazás a képernyőn lévő egyéb alkalmazások előtt jelenik meg."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Százalékos érték töltés közben látható (alapértelmezett)"</item>
<item msgid="3327323682209964956">"Ne jelenjen meg ez az ikon"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Egyéb"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Elválasztó az osztott nézetben"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Bal oldali teljes képernyőre"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 8973ecf0022a..c1ee1d73aa32 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Համակարգային UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Մաքրել"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Հեռացնել ցանկից"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Տեղեկություններ ծրագրի մասին"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ձեր վերջին էկրանները տեսանելի են այստեղ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Անտեսել վերջին ծրագրերը"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">Համատեսքում ցուցադրված է %d էկրան</item>
- <item quantity="other">Համատեսքում ցուցադրված է %d էկրան</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ծանուցումներ չկան"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ընթացիկ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ծանուցումներ"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"բացել հեռախոսը"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"բացեք ձայնային հուշումը"</string>
<string name="camera_label" msgid="7261107956054836961">"բացել ֆոտոխցիկը"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Ընտրել առաջադրանքի նոր դասավորություն"</string>
<string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Օգնության հաղորդագրության դաշտ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Հաստատել"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Անտեսել <xliff:g id="APP">%s</xliff:g>-ը:"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>-ը անտեսված է:"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Բոլոր վերջին հավելվածները հեռացվել են ցուցակից:"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Բացել <xliff:g id="APP">%s</xliff:g> հավելվածի մասին տեղեկությունները"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Մեկնարկել <xliff:g id="APP">%s</xliff:g>-ը:"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Ծանուցումը անտեսվեց:"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Ծանուցումների վահանակ:"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Արագ կարգավորումներ:"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-ն անջատված է"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-ն միացված է"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Վերջին տարրեր չկան"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Դուք ջնջել եք ամենը"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Հավելվածի մասին"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"էկրանի ամրացում"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"որոնել"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Հնարավոր չէ գործարկել <xliff:g id="APP">%s</xliff:g>-ը:"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> հավելվածը անվտանգ ռեժիմում անջատված է:"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Մաքրել բոլորը"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Քաշեք այստեղ՝ էկրանի տրոհումն օգտագործելու համար"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Սահեցրեք վերև՝ մյուս հավելվածին անցնելու համար"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Քաշեք աջ՝ հավելվածների միջև անցնելու համար"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Հորիզոնական տրոհում"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Ուղղահայաց տրոհում"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Հատուկ տրոհում"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Տրոհել էկրանը վերևից"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Տրոհել էկրանը ձախից"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Տրոհել էկրանն աջից"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Միացնել/անջատել համատեսքը"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Լիցքավորված է"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Լիցքավորվում է"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Ծալել"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ցուցադրե՞լ ծանուցումներ այս հավելվածից։"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Այս ծանուցումները հնարավոր չէ անջատել"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Այս հավելվածն օգտագործում է տեսախցիկը:"</string>
<string name="appops_microphone" msgid="741508267659494555">"Այս հավելվածն օգտագործում է խոսափողը:"</string>
<string name="appops_overlay" msgid="6165912637560323464">"Այս հավելվածը ցուցադրվում է մյուս հավելվածների վրայից:"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Ցույց տալ տոկոսը լիցքավորելու ժամանակ (կանխադրված է)"</item>
<item msgid="3327323682209964956">"Ցույց չտալ այս պատկերակը"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Այլ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Տրոհված էկրանի բաժանիչ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ձախ էկրանը՝ լիաէկրան"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 2e3040c523f6..1cd4d303d385 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistem UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Bersihkan"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Hapus dari daftar"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info aplikasi"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Layar terkini Anda muncul di sini"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Tutup aplikasi terbaru"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d layar dalam Ringkasan</item>
- <item quantity="one">1 layar dalam Ringkasan</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada notifikasi"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifikasi"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"buka ponsel"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"buka bantuan suara"</string>
<string name="camera_label" msgid="7261107956054836961">"buka kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih tata letak tugas baru"</string>
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area pesan bantuan"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Menyingkirkan <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> disingkirkan."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaru telah ditutup."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Buka info aplikasi <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Memulai <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifikasi disingkirkan."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bayangan pemberitahuan."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setelan cepat."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dinonaktifkan"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC diaktifkan"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Tidak ada item baru-baru ini"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Anda sudah menghapus semua"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Info Aplikasi"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pin ke layar"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"telusuri"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Tidak dapat memulai <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dinonaktifkan dalam mode aman."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hapus semua"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Tarik ke sini untuk menggunakan layar terpisah"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Geser ke atas untuk beralih aplikasi"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Tarik ke kanan untuk beralih aplikasi dengan cepat"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Pisahkan Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pisahkan Vertikal"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pisahkan Khusus"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Pisahkan layar ke atas"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Pisahkan layar ke kiri"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Pisahkan layar ke kanan"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Aktifkan Ringkasan"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Terisi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengisi daya"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Perkecil"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tampilkan notifikasi dari aplikasi ini?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Notifikasi ini tidak dapat dinonaktifkan"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Aplikasi ini sedang menggunakan kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Aplikasi ini sedang menggunakan mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Aplikasi ini ditampilkan di atas aplikasi lain di layar."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Tampilkan persentase saat mengisi daya (default)"</item>
<item msgid="3327323682209964956">"Jangan tampilkan ikon ini"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Tampilkan ikon notifikasi prioritas rendah"</string>
<string name="other" msgid="4060683095962566764">"Lainnya"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Pembagi layar terpisah"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Layar penuh di kiri"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index fd15fc3d95b1..92d86aeec9c5 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Kerfisviðmót"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Hreinsa"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjarlægja af lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Upplýsingar um forrit"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Nýlegar skjámyndir birtast hér"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Hunsa nýleg forrit"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d skjámynd í yfirliti</item>
- <item quantity="other">%d skjámyndir í yfirliti</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Engar tilkynningar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Áframhaldandi"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Tilkynningar"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"opna síma"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"opna raddaðstoð"</string>
<string name="camera_label" msgid="7261107956054836961">"opna myndavél"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Velja nýtt útlit verkefna"</string>
<string name="cancel" msgid="6442560571259935130">"Hætta við"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Svæði hjálparskilaboða"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Staðfesta"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Hunsa <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> vísað frá."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Öll nýleg forrit fjarlægð."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Opna forritsupplýsingar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Ræsir <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Tilkynningu lokað."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Tilkynningasvæði."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Flýtistillingar."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Slökkt á NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Kveikt á NFC"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Engin nýleg atriði"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Þú hefur hreinsað allt"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Forritsupplýsingar"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"skjáfesting"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"leita"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Ekki var hægt að ræsa <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Slökkt er á <xliff:g id="APP">%s</xliff:g> í öruggri stillingu."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hreinsa allt"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dragðu hingað til að skipta skjánum"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Strjúktu upp til að skipta á milli forrita"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Dragðu til hægri til að skipta hratt á milli forrita"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Lárétt skipting"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Lóðrétt skipting"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Sérsniðin skipting"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Skipta skjá að ofanverðu"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Skipta skjá til vinstri"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Skipta skjá til hægri"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Kveikja/slökkva á yfirliti"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Fullhlaðin"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Í hleðslu"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minnka"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Sýna áfram tilkynningar frá þessu forriti?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ekki er hægt að slökkva á þessum tilkynningum"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"með <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Þetta forrit er að nota myndavélina."</string>
<string name="appops_microphone" msgid="741508267659494555">"Þetta forrit er að nota hljóðnemann."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Þetta forrit er að birta efni yfir öðrum forritum á skjánum þínum."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Sýna hlutfall meðan á hleðslu stendur (sjálfgefið)"</item>
<item msgid="3327323682209964956">"Ekki sýna þetta tákn"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Sýna tákn fyrir tilkynningar með litlum forgangi"</string>
<string name="other" msgid="4060683095962566764">"Annað"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Skjáskipting"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Vinstri á öllum skjánum"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 37fabb856729..3cac6c995ef5 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Rimuovi dall\'elenco"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informazioni applicazione"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Le tue schermate recenti vengono visualizzate in questa sezione"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignora app recenti"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d schermate in Panoramica</item>
- <item quantity="one">1 schermata in Panoramica</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nessuna notifica"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"In corso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifiche"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"apri telefono"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"apri Voice Assist"</string>
<string name="camera_label" msgid="7261107956054836961">"apri fotocamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Seleziona un nuovo layout per le attività"</string>
<string name="cancel" msgid="6442560571259935130">"Annulla"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area dei messaggi di assistenza"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confermo"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Elimina <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eliminata."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tutte le applicazioni recenti sono state rimosse."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Mostra informazioni sull\'applicazione <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Avvio di <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifica eliminata."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Area notifiche."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Impostazioni rapide."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC non attiva"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC attiva"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nessun elemento recente"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Hai cancellato tutto"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informazioni sull\'applicazione"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"blocco su schermo"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossibile avviare <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"L\'app <xliff:g id="APP">%s</xliff:g> è stata disattivata in modalità provvisoria."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Cancella tutto"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trascina qui per utilizzare la modalità Schermo diviso"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Scorri verso l\'alto per passare ad altre app"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Trascina verso destra per cambiare velocemente app"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisione in orizzontale"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisione in verticale"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisione personalizzata"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Schermo diviso in alto"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Schermo diviso a sinistra"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Schermo diviso a destra"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Attiva/disattiva la panoramica"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carica"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"In carica"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Riduci a icona"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuare a ricevere notifiche da questa app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Queste notifiche non possono essere disattivate"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"tramite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Questa app sta utilizzando la fotocamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Questa app sta utilizzando il microfono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Questa app è visualizzata sopra altre app sullo schermo."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostra la percentuale quando in carica (opzione predefinita)"</item>
<item msgid="3327323682209964956">"Non mostrare questa icona"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostra icone di notifiche con priorità bassa"</string>
<string name="other" msgid="4060683095962566764">"Altro"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Strumento per schermo diviso"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Schermata sinistra a schermo intero"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 0d60e6ca8fb9..a65b9170c06a 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -21,17 +21,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ממשק משתמש של המערכת"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ניקוי"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"הסר מהרשימה"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"פרטי אפליקציה"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"המסכים האחרונים מופיעים כאן"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"סגור אפליקציות אחרונות"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="two">‏%d מסכים ב’סקירה‘</item>
- <item quantity="many">‏%d מסכים ב’סקירה‘</item>
- <item quantity="other">‏%d מסכים ב’סקירה‘</item>
- <item quantity="one">מסך אחד ב’סקירה‘</item>
- </plurals>
- <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין הודעות"</string>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"אין התראות"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"מתמשך"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"התראות"</string>
<string name="battery_low_title" msgid="9187898087363540349">"ייתכן שהסוללה תתרוקן בקרוב"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"פתח את הטלפון"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"פתח את המסייע הקולי"</string>
<string name="camera_label" msgid="7261107956054836961">"פתח את המצלמה"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"בחר פריסה חדשה להצגת משימות"</string>
<string name="cancel" msgid="6442560571259935130">"ביטול"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"אזור הודעת עזרה"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"אישור"</string>
@@ -179,7 +168,7 @@
<string name="accessibility_battery_level_charging" msgid="1147587904439319646">"טעינת סוללה, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g>%%."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"הגדרות מערכת"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"התראות"</string>
- <string name="accessibility_overflow_action" msgid="5681882033274783311">"הצגת כל ההודעות"</string>
+ <string name="accessibility_overflow_action" msgid="5681882033274783311">"הצגת כל ההתראות"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"מחיקת התראה"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"‏GPS מופעל."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"‏השגת GPS."</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"סגור את <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> נדחה."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"כל האפליקציות האחרונות נסגרו."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"פתח מידע על האפליקציה <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"מפעיל את <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"התראה נדחתה."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"לוח התראות."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"הגדרות מהירות."</string>
@@ -263,10 +247,10 @@
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="notification_group_overflow_indicator_ambient" msgid="879560382990377886">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, +<xliff:g id="OVERFLOW">%2$s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
- <item quantity="two">יש בפנים עוד <xliff:g id="NUMBER_1">%s</xliff:g> הודעות.</item>
- <item quantity="many">יש בפנים עוד <xliff:g id="NUMBER_1">%s</xliff:g> הודעות.</item>
- <item quantity="other">יש בפנים עוד <xliff:g id="NUMBER_1">%s</xliff:g> הודעות.</item>
- <item quantity="one">יש בפנים עוד הודעה <xliff:g id="NUMBER_0">%s</xliff:g>.</item>
+ <item quantity="two">עוד <xliff:g id="NUMBER_1">%s</xliff:g> התראות נוספות.</item>
+ <item quantity="many">עוד <xliff:g id="NUMBER_1">%s</xliff:g> התראות.</item>
+ <item quantity="other">עוד <xliff:g id="NUMBER_1">%s</xliff:g> התראות נוספות.</item>
+ <item quantity="one">יש התראה נוספת.<xliff:g id="NUMBER_0">%s</xliff:g>.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"הגדרת התראות"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"הגדרות <xliff:g id="APP_NAME">%s</xliff:g>"</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"‏NFC מושבת"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"‏NFC מופעל"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"אין פריטים אחרונים"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"מחקת הכול"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"מידע על האפליקציה"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"הצמדת מסך"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"חיפוש"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"לא ניתן היה להפעיל את <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> מושבת במצב בטוח."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"נקה הכל"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"גרור לכאן כדי להשתמש במסך מפוצל"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"יש להחליק מעלה כדי להחליף אפליקציות"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"יש לגרור ימינה כדי לעבור במהירות בין אפליקציות"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"פיצול אופקי"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"פיצול אנכי"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"פיצול מותאם אישית"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"פיצול מסך למעלה"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"פיצול מסך לשמאל"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"פיצול מסך לימין"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"החלפת מצב של מסכים אחרונים"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"טעון"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"טוען"</string>
@@ -514,7 +483,7 @@
<string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"הנעילה בוטלה על ידי <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> פועל"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"המכשיר יישאר נעול עד שתבטל את נעילתו באופן ידני"</string>
- <string name="hidden_notifications_title" msgid="7139628534207443290">"קבל הודעות מהר יותר"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"קבלה מהירה של התראות"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"צפה בהן לפני שתבטל נעילה"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"לא, תודה"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"הגדר"</string>
@@ -608,14 +577,14 @@
<string name="enable_bluetooth_title" msgid="5027037706500635269">"‏האם להפעיל את ה-Bluetooth?"</string>
<string name="enable_bluetooth_message" msgid="9106595990708985385">"‏כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"הפעל"</string>
- <string name="show_silently" msgid="6841966539811264192">"הצג הודעות בלי להשמיע צליל"</string>
- <string name="block" msgid="2734508760962682611">"חסום את כל ההודעות"</string>
+ <string name="show_silently" msgid="6841966539811264192">"הצגת התראות בלי להשמיע צליל"</string>
+ <string name="block" msgid="2734508760962682611">"חסימת כל ההודעות"</string>
<string name="do_not_silence" msgid="6878060322594892441">"לא להשתיק"</string>
<string name="do_not_silence_block" msgid="4070647971382232311">"לא להשתיק או לחסום"</string>
<string name="tuner_full_importance_settings" msgid="3207312268609236827">"פקדים של הודעות הפעלה"</string>
<string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"פועל"</string>
<string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"כבוי"</string>
- <string name="power_notification_controls_description" msgid="4372459941671353358">"בעזרת פקדים של התראות הפעלה, אפשר להגדיר רמת חשיבות מ-0 עד 5 להתראות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצגה בראש רשימת ההודעות \n- אפשר הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מנע הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n- הסתרה ממסך הנעילה ומשורת הסטטוס \n- הצגה בתחתית רשימת ההתראות \n\n"<b>"רמה 0"</b>" \n- חסימה את כל ההתראות מהאפליקציה"</string>
+ <string name="power_notification_controls_description" msgid="4372459941671353358">"בעזרת פקדים של התראות הפעלה, אפשר להגדיר רמת חשיבות מ-0 עד 5 להתראות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצגה בראש רשימת ההתראות \n- אפשר הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מנע הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n- הסתרה ממסך הנעילה ומשורת הסטטוס \n- הצגה בתחתית רשימת ההתראות \n\n"<b>"רמה 0"</b>" \n- חסימה את כל ההתראות מהאפליקציה"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"התראות"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"ההודעות האלה לא יוצגו לך יותר"</string>
<string name="notification_channel_minimized" msgid="1664411570378910931">"ההודעות האלה ימוזערו"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"מזעור"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"שנמשיך להציג לך הודעות מהאפליקציה הזאת?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"לא ניתן לכבות את ההודעות האלה"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"האפליקציה הזו משתמשת במצלמה."</string>
<string name="appops_microphone" msgid="741508267659494555">"האפליקציה הזו משתמשת במיקרופון."</string>
<string name="appops_overlay" msgid="6165912637560323464">"האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך."</string>
@@ -644,7 +615,7 @@
<string name="inline_undo" msgid="558916737624706010">"ביטול"</string>
<string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
<string name="notification_menu_gear_description" msgid="2204480013726775108">"בקרת התראות"</string>
- <string name="notification_menu_snooze_description" msgid="3653669438131034525">"אפשרויות של דחיית הודעות לטיפול בהמשך"</string>
+ <string name="notification_menu_snooze_description" msgid="3653669438131034525">"אפשרויות של דחיית התראות לטיפול בהמשך"</string>
<string name="notification_menu_snooze_action" msgid="1112254519029621372">"הפעלת נודניק"</string>
<string name="snooze_undo" msgid="6074877317002985129">"ביטול"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"נדחה לטיפול בעוד <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"הצג באחוזים בזמן טעינה (ברירת מחדל)"</item>
<item msgid="3327323682209964956">"אל תציג את הסמל הזה"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"אחר"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"מחלק מסך מפוצל"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"מסך שמאלי מלא"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index c651f9eabdda..6617fddd386d 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"システムUI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"リストから削除"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"アプリ情報"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ここに最近の画面が表示されます"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"最近使ったアプリをクリア"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">[最近]に%d個の画面があります</item>
- <item quantity="one">[最近]に1個の画面があります</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"電話を起動"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"音声アシストを開く"</string>
<string name="camera_label" msgid="7261107956054836961">"カメラを起動"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"新しいタスクレイアウトの選択"</string>
<string name="cancel" msgid="6442560571259935130">"キャンセル"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ヘルプ メッセージ領域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>を削除します。"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>は削除されました。"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近のアプリケーションをすべて消去しました。"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"「<xliff:g id="APP">%s</xliff:g>」のアプリ情報を開きます。"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>を開始しています。"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"通知が削除されました。"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知シェード"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"クイック設定"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"最近のタスクはありません"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"すべてのタスクを消去しました"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"アプリ情報"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"画面固定"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"検索"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>を開始できません。"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」はセーフモードでは無効になります。"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"すべて消去"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"分割画面を使用するにはここにドラッグします"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"アプリを切り替えるには上にスワイプ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"右にドラッグするとアプリを素早く切り替えることができます"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"横に分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"縦に分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"分割(カスタム)"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"画面を上に分割"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"画面を左に分割"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"画面を右に分割"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"概要を切り替え"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"充電が完了しました"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電しています"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"このアプリからの通知を今後も表示しますか?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"この通知を OFF にすることはできません"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"このアプリはカメラを使用しています。"</string>
<string name="appops_microphone" msgid="741508267659494555">"このアプリはマイクを使用しています。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"このアプリは画面上で他のアプリの上に重ねて表示されます。"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"変更時に割合を表示(デフォルト)"</item>
<item msgid="3327323682209964956">"このアイコンを表示しない"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"その他"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"分割画面の分割線"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"左全画面"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index f91ffb054403..359e6894fab8 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"სისტემის UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"გასუფთავება"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"სიიდან ამოშლა"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"აპის შესახებ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"თქვენი ბოლო ეკრანები აქ გამოჩნდება"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ბოლო აპების გაუქმება"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d ეკრანი მიმოხილვაში</item>
- <item quantity="one">1 ეკრანი მიმოხილვაში</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"შეტყობინებები არ არის."</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"მიმდინარე"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"შეტყობინებები"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ტელეფონის გახსნა"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ხმოვანი დახმარების გახსნა"</string>
<string name="camera_label" msgid="7261107956054836961">"კამერის გახსნა"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ახალი ამოცანის განლაგების არჩევა"</string>
<string name="cancel" msgid="6442560571259935130">"გაუქმება"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"დამხმარე შეტყობინების არე"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"დადასტურება"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-ის უგულებელყოფა."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ამოშლილია სიიდან."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ყველა ბოლო აპლიკაცია გაუქმდა."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> აპლიკაციის ინფორმაციის გახსნა."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> იწყება."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"შეტყობინება წაიშალა."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"შეტყობინებების ფარდა"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"სწრაფი პარამეტრები"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC გათიშულია"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ჩართულია"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ბოლოს გამოყენებული ერთეულები არ არის"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ყველაფერი გასუფთავდა"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"აპლიკაციის შესახებ"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ეკრანზე ჩამაგრება"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ძიება"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>-ის გამოძახება ვერ მოხერხდა."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> გათიშულია უსაფრთხო რეჟიმში."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ყველას გასუფთავება"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ეკრანის გასაყოფად, ჩავლებით გადმოიტანეთ აქ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"გადაფურცლეთ ზემოთ აპების გადასართავად"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"აპების სწრაფად გადასართავად ჩავლებით გადაიტანეთ მარჯვნივ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ჰორიზონტალური გაყოფა"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ვერტიკალური გაყოფა"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ინდივიდუალური გაყობა"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ეკრანის გაყოფა ზემოთ"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ეკრანის გაყოფა მარცხნივ"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ეკრანის გაყოფა მარჯვნივ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"მიმოხილვის გადართვა"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"დატენილია"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"მიმდინარეობს დატენვა"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ჩაკეცვა"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ამ შეტყობინებათა გამორთვა ვერ მოხერხდება"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ეს აპი იყენებს კამერას."</string>
<string name="appops_microphone" msgid="741508267659494555">"ეს აპი იყენებს მიკროფონს."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ეს აპი თქვენს ეკრანზე ფარავს სხვა აპებს."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"პროცენტულობის დატენვისას ჩვენება (ნაგულისხმევი)"</item>
<item msgid="3327323682209964956">"აღარ მაჩვენო ეს ხატულა"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"სხვა"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"გაყოფილი ეკრანის რეჟიმის გამყოფი"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"მარცხენა ნაწილის სრულ ეკრანზე გაშლა"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b79ea7b18e79..6598bf04b050 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Жүйе интерфейсі"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Тазалау"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Тізімнен алу"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Қолданба ақпараты"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Мұнда жақындағы экрандар көрсетіледі"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Жуықта қолданылған қолданбаларды қоспау"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">«Шолу» ішінде %d экран</item>
- <item quantity="one">«Шолу» ішінде 1 экран</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Хабарлар жоқ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ағымдағы"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Хабарлар"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"телефонды ашу"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ашық дауыс көмекшісі"</string>
<string name="camera_label" msgid="7261107956054836961">"камераны ашу"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңа тапсырма пішімін таңдау"</string>
<string name="cancel" msgid="6442560571259935130">"Бас тарту"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Анықтама хабары аумағы"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Растау"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> қолданбасынан бас тарту."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> алынып тасталған."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Барлық жақындағы қабылданбаған қолданбалар."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> қолданбасы туралы ақпаратты ашады."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> іске қосылуда."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Хабар алынып тасталды."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Хабарландыру тақтасы"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Жылдам параметрлер."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өшірулі"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC қосулы"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Жақындағы элементтер жоқ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Сіз барлығын өшірдіңіз"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Қолданба туралы ақпарат"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"экранды бекіту"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"іздеу"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> іске қосу мүмкін болмады."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> қауіпсіз режимде өшіріледі."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Барлығын тазалау"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Бөлінген экранды пайдалану үшін осында сүйреңіз"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Қолданбалар арасында ауысу үшін жоғары сырғытыңыз"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Қолданбаларды жылдам ауыстырып қосу үшін оңға қарай сүйреңіз"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Бөлінген көлденең"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Бөлінген тік"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Бөлінген теңшелетін"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Экранды жоғарыға қарай бөлу"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Экранды солға қарай бөлу"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Экранды оңға қарай бөлу"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Шолуды қосу/өшіру"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Зарядталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядталуда"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Жасыру"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Осы қолданбаның хабарландырулары көрсетілсін бе?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Хабарландыруларды өшіру мүмкін емес"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Бұл қолданба камераны пайдалануда."</string>
<string name="appops_microphone" msgid="741508267659494555">"Бұл қолданба микрофонды пайдалануда."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Бұл қолданба экранда басқа қолданбалардың үстінен көрсетіліп тұр."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Зарядтау кезінде пайызды көрсету (әдепкі)"</item>
<item msgid="3327323682209964956">"Бұл белгішені көрсетпеу"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Басқа"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Бөлінген экран бөлгіші"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Сол жағын толық экранға шығару"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 0731a5e616b8..8545ad646827 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ចំណុច​ប្រទាក់​ប្រព័ន្ធ"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"សម្អាត"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"យក​ចេញ​ពី​បញ្ជី"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ព័ត៌មាន​កម្មវិធី"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"អេក្រង់​បច្ចុប្បន្ន​របស់​អ្នក​បង្ហាញ​នៅ​ទីនេះ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"បដិសេធ​កម្មវិធី​ថ្មីៗ"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">អេក្រង់ %d ក្នុងទិដ្ឋភាព</item>
- <item quantity="one">អេក្រង់ 1 ក្នុងទិដ្ឋភាព</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"គ្មាន​ការ​ជូន​ដំណឹង"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"បន្ត"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ការ​ជូន​ដំណឹង"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"បើក​ទូរស័ព្ទ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"បើកជំនួយសំឡេង"</string>
<string name="camera_label" msgid="7261107956054836961">"បើក​ម៉ាស៊ីន​ថត"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ជ្រើសប្លង់ភារកិច្ចថ្មី"</string>
<string name="cancel" msgid="6442560571259935130">"បោះ​បង់​"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"តំបន់សារ​ជំនួយ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"បញ្ជាក់"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"បោះបង់ <xliff:g id="APP">%s</xliff:g> ។"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> បដិសេធ។"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"កម្មវិធីថ្មីៗទាំងអស់ត្រូវបានបោះបង់។"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"បើកព័ត៌មានកម្មវិធី <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"ចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ។"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"បាន​បដិសេធ​ការ​ជូនដំណឹង"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ពណ៌​ការ​ជូន​ដំណឹង"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ការ​កំណត់​រហ័ស។"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"បាន​បិទ NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"បាន​បើក NFC"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"មិនមានធាតុថ្មីៗទេ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"អ្នកបានជម្រះអ្វីៗទាំងអស់"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ព័ត៌មាន​កម្មវិធី"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ការ​ភ្ជាប់​អេក្រង់"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"មិន​អាច​ចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ទេ។"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ត្រូវបានបិទដំណើរការក្នុងរបៀបសុវត្ថិភាព"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"សម្អាតទាំងអស់"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"អូសនៅទីនេះដើម្បីប្រើអេក្រង់បំបែក"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"អូស​ឡើង​លើ​ដើម្បី​ប្តូរ​កម្មវិធី"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"អូសទៅស្ដាំដើម្បីប្ដូរកម្មវិធីបានរហ័ស"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"បំបែកផ្តេក"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"បំបែកបញ្ឈរ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"បំបែកផ្ទាល់ខ្លួន"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"បំបែក​អេក្រង់​ទៅ​ខាងលើ"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"បំបែក​អេក្រង់​ទៅ​ខាងឆ្វេង"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"បំបែក​អេក្រង់​ទៅ​ខាងស្តាំ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"បិទ/បើក​ទិដ្ឋភាពរួម"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"បាន​បញ្ចូល​ថ្ម​​"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងសាក​ថ្ម"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"បង្រួម"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"បន្ត​បង្ហាញ​ការជូនដំណឹង​ពីកម្មវិធីនេះ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"​មិនអាច​បិទការជូនដំណឹង​ទាំងនេះបានទេ"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"កម្មវិធីនេះ​កំពុងប្រើ​កាមេរ៉ា។"</string>
<string name="appops_microphone" msgid="741508267659494555">"កម្មវិធីនេះ​កំពុងប្រើ​មីក្រូហ្វូន។"</string>
<string name="appops_overlay" msgid="6165912637560323464">"កម្មវិធីនេះ​កំពុងបង្ហាញ​ពីលើកម្មវិធី​ផ្សេងទៀត​នៅលើអេក្រង់​របស់អ្នក។"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"បង្ហាញភាគរយនៅពេលសាកថ្ម (លំនាំដើម)"</item>
<item msgid="3327323682209964956">"កុំបង្ហាញរូបតំណាងនេះ"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ផ្សេងៗ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"កម្មវិធីចែកអេក្រង់បំបែក"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"អេក្រង់ពេញខាងឆ្វេង"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index c4c642f01a9c..ccbb31e87e1b 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ಸಿಸ್ಟಂ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ತೆರವುಮಾಡು"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕು"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪರದೆಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು</item>
- <item quantity="other">ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ಅಧಿಸೂಚನೆಗಳು"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ಫೋನ್ ತೆರೆಯಿರಿ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ಧ್ವನಿ ಸಹಾಯಕವನ್ನು ತೆರೆ"</string>
<string name="camera_label" msgid="7261107956054836961">"ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ದೃಢೀಕರಿಸಿ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಿ."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ಇತ್ತೀಚಿನ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ ತೆರೆಯಿರಿ."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ಅಧಿಸೂಚನೆ ವಜಾಗೊಂಡಿದೆ."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ಅಧಿಸೂಚನೆಯ ಛಾಯೆ."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‍ಗಳು."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ನೀವು ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿರುವಿರಿ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ಸ್ಕ್ರೀನ್ ಪಿನ್ನಿಂಗ್"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ಹುಡುಕಾಟ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲು ಸಾದ್ಯವಿಲ್ಲ."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ವಿಭಜಿತ ಪರದೆಯನ್ನು ಬಳಸಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್‌ ಮಾಡಿ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬದಲಿಸಲು ತ್ವರಿತವಾಗಿ ಬಲಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ಮೇಲ್ಭಾಗಕ್ಕೆ ಪರದೆಯನ್ನು ವಿಭಜಿಸಿ"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ಎಡಕ್ಕೆ ಪರದೆಯನ್ನು ವಿಭಜಿಸಿ"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ಬಲಕ್ಕೆ ಪರದೆಯನ್ನು ವಿಭಜಿಸಿ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ಟಾಗಲ್ ನ ಅವಲೋಕನ"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ಕಿರಿದುಗೊಳಿಸಿ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ."</string>
<string name="appops_microphone" msgid="741508267659494555">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೇಲಿಂದ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ಚಾರ್ಜ್‌ ಮಾಡುವಾಗ ಪ್ರತಿಶತವನ್ನು ತೋರಿಸು (ಡಿಫಾಲ್ಟ್‌)"</item>
<item msgid="3327323682209964956">"ಈ ಐಕಾನ್ ತೋರಿಸಬೇಡ"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ಇತರ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"ಸ್ಪ್ಲಿಟ್-ಪರದೆ ಡಿವೈಡರ್"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ಎಡ ಪೂರ್ಣ ಪರದೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 90148806a142..716e2f258607 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"시스템 UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"목록에서 삭제"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"앱 정보"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"여기에 최근 화면이 표시됩니다."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"최근에 사용한 앱 숨기기"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">최근 사용에 화면 %d개 있음</item>
- <item quantity="one">최근 사용에 화면 1개 있음</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"휴대전화 열기"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"음성 지원 열기"</string>
<string name="camera_label" msgid="7261107956054836961">"카메라 열기"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"새 작업 레이아웃 선택"</string>
<string name="cancel" msgid="6442560571259935130">"취소"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"도움말 메시지 영역"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"확인"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>을(를) 숨깁니다."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>이(가) 제거되었습니다."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"최근 사용한 애플리케이션을 모두 닫았습니다."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> 애플리케이션 정보를 엽니다."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>을(를) 시작하는 중입니다."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"알림이 제거되었습니다."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"알림 세부정보"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"빠른 설정"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 사용 중지됨"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 사용 설정됨"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"최근 항목이 없습니다."</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"모든 항목을 삭제했습니다."</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"애플리케이션 정보"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"화면 고정"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"검색"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>을(를) 시작할 수 없습니다."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>은(는) 안전 모드에서 사용 중지됩니다."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"모두 지우기"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"여기를 드래그하여 분할 화면 사용하기"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"위로 스와이프하여 앱 전환"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"앱을 빠르게 전환하려면 오른쪽으로 드래그"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"수평 분할"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"수직 분할"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"맞춤 분할"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"위쪽으로 화면 분할"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"왼쪽으로 화면 분할"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"오른쪽으로 화면 분할"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"최근 사용 버튼 전환"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"충전됨"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"충전 중"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"최소화"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"이 앱의 알림을 계속 표시하시겠습니까?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"이 알림은 끌 수 없습니다"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"앱이 카메라를 사용 중입니다."</string>
<string name="appops_microphone" msgid="741508267659494555">"앱이 마이크를 사용 중입니다."</string>
<string name="appops_overlay" msgid="6165912637560323464">"앱이 화면의 다른 앱 위에 표시되고 있습니다."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"충전할 때 퍼센트 표시(기본값)"</item>
<item msgid="3327323682209964956">"이 아이콘 표시 안함"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"기타"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"화면 분할기"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"왼쪽 화면 전체화면"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 51cb1b1aaff5..2f49cdbd374a 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Тутум UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Тазалоо"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Тизмеден алып салуу"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Колдонмо тууралуу"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Акыркы экрандарыңыз бул жерден көрүнөт"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Акыркы колдонмолорду жок кылуу"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d экран Көз жүгүртүүдө</item>
- <item quantity="one">1 экран Көз жүгүртүүдө</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Билдирме жок"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Учурдагы"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Билдирмелер"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"телефонду ачуу"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"үн жардамчысысын ачуу"</string>
<string name="camera_label" msgid="7261107956054836961">"камераны ачуу"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңы тапшырманын планын тандаңыз"</string>
<string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Жардам билдирүүсү"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Ырастоо"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> этибарга албоо."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> жок болду."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Акыркы колдонмолордун баары көз жаздымда калтырылды."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> колдонмосу жөнүндө маалыматты ачыңыз."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> иштеп баштоодо."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Эскертме жок кылынды."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Билдирмелер тактасы."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Тез тууралоолор."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өчүрүлгөн"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC иштетилген"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Акыркы колдонмолор жок"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Баарын тазаладыңыз"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Колдонмо жөнүндө маалымат"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"экран кадоо"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"издөө"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> баштай алган жок."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> коопсуз режиминде өчүрүлдү."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Баарын тазалоо"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Экранды бөлүү үчүн бул жерге сүйрөңүз"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Колдонмолорду которуштуруу үчүн өйдө сүрүңүз"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Колдонмолорду тез которуштуруу үчүн оңго сүйрөңүз"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Туурасынан бөлүү"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Тигинен бөлүү"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ыңгайлаштырылган бөлүү"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Экранды өйдө жакка бөлүү"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Экранды сол жакка бөлүү"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Экранды оң жакка бөлүү"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Сереп салууну өчүрүү/күйгүзүү"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Кубатталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Кубатталууда"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Кичирейтүү"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Бул колдонмонун эскертмелери көрсөтүлө берсинби?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Бул эскертмелерди өчүрүүгө болбойт"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Бул колдонмо камераны колдонууда."</string>
<string name="appops_microphone" msgid="741508267659494555">"Бул колдонмо микрофонду колдонууда."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Бул колдонмо экрандагы башка терезелердин үстүнөн көрсөтүлүүдө."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Кубаттоо учурунда пайызы көрсөтүлсүн (демейки)"</item>
<item msgid="3327323682209964956">"Бул сөлөкөт көрсөтүлбөсүн"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Башка"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Экранды бөлгүч"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Сол жактагы экранды толук экран режимине өткөрүү"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index d442258ad8cb..dd874d5425a1 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ສ່ວນຕິດຕໍ່ຜູ່ໃຊ້ຂອງລະບົບ"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ລຶບ"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ເອົາອອກຈາກລາຍການ"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ຂໍ້ມູນແອັບຯ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ໜ້າຈໍຫຼ້າສຸດຂອງທ່ານຈະປາກົດຢູ່ບ່ອນນີ້"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ປິດແອັບຯຫຼ້າສຸດທີ່ໃຊ້"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d ໜ້າ​ຈໍ​ຢູ່​ໃນ​ພາບ​ລວມ</item>
- <item quantity="one">1 ​ໜ້າ​ຈໍ​ຢູ່​ໃນ​ພາບ​ລວມ</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ບໍ່ມີການແຈ້ງເຕືອນ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ດຳເນີນຢູ່"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ການແຈ້ງເຕືອນ"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"​ເປີດ​​ແປ້ນ​ໂທ​ລະ​ສັບ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ຊ່ວ​ເຫຼືອ​ເປີດ​ສຽງ"</string>
<string name="camera_label" msgid="7261107956054836961">"ເປີດ​ກ້ອງ"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກ​ແຜນ​ຜັງ​ໜ້າ​ວຽກ​ໃໝ່"</string>
<string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ຢືນຢັນ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"ປິດ <xliff:g id="APP">%s</xliff:g> ໄວ້."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"ປິດ <xliff:g id="APP">%s</xliff:g> ແລ້ວ."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ທຸກ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ບໍ່​ດົນ​ມາ​ນີ້​ຖືກ​ປ່ອຍ​ໄປ."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"ເປີດຂໍ້ມູນແອັບພລິເຄຊັນ <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"ກຳ​ລັງ​ເປີດ <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ປິດການແຈ້ງເຕືອນແລ້ວ."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ໜ້າຈໍແຈ້ງເຕືອນ."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ການຕັ້ງຄ່າດ່ວນ."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ບໍ່ມີລາຍການຫຼ້າສຸດ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ທ່ານລຶບລ້າງທຸກຢ່າງແລ້ວ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"​ຂໍ້​ມູນ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ການ​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ຊອກຫາ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"ບໍ່​ສາ​ມາດ​ເລີ່ມ <xliff:g id="APP">%s</xliff:g> ໄດ້."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ຖືກປິດໃຊ້ໃນໂໝດຄວາມມປອດໄພ."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ລຶບລ້າງທັງໝົດ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ລາກມາບ່ອນນີ້ເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ປັດຂື້ນເພື່ອສະຫຼັບແອັບ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ລາກໄປຂວາເພື່ອສະຫຼັບແອັບດ່ວນ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ການ​ແຍກ​ລວງ​ຂວາງ"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ການ​ແຍກ​ລວງ​ຕັ້ງ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ການ​ແຍກ​ກຳ​ນົດ​ເອງ"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Split screen to the top"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Split screen to the left"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Split screen to the right"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ສະຫຼັບພາບຮວມ"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ສາກເຕັມແລ້ວ."</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ກຳລັງສາກໄຟ"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ຫຍໍ້"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ບໍ່ສາມາດປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ແອັບນີ້ກຳລັງໃຊ້ກ້ອງຢູ່."</string>
<string name="appops_microphone" msgid="741508267659494555">"ແອັບນີ້ກຳລັງໃຊ້ໄມໂຄຣໂຟນຢູ່."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ແອັບນີ້ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ສະແດງເປີເຊັນເມື່ອກຳລັງສາກໄຟ (ຄ່າເລີ່ມຕົ້ນ)"</item>
<item msgid="3327323682209964956">"ຢ່າສະແດງໄອຄອນນີ້"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ອື່ນໆ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"ຕົວຂັ້ນການແບ່ງໜ້າຈໍ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ເຕັມໜ້າຈໍຊ້າຍ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index e26df8b29c4c..68e64d35072f 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistemos NS"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Išvalyti"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Pašalinti iš sąrašo"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Programos informacija"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Čia rodomi naujausi ekranai"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Atsisakyti naujausių programų"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d ekrano apžvalga</item>
- <item quantity="few">%d ekranų apžvalga</item>
- <item quantity="many">%d ekrano apžvalga</item>
- <item quantity="other">%d ekranų apžvalga</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nėra įspėjimų"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Vykstantys"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pranešimai"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"atidaryti telefoną"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"atidaryti „Voice Assist“"</string>
<string name="camera_label" msgid="7261107956054836961">"atidaryti fotoaparatą"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Pasirinkti naują užduoties išdėstymą"</string>
<string name="cancel" msgid="6442560571259935130">"Atšaukti"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Pagalbos pranešimo sritis"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Patvirtinkite"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Atsisakyti <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Atsisakyta programos „<xliff:g id="APP">%s</xliff:g>“."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Atsisakyta visų naujausių programų."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Atidaryti programos „<xliff:g id="APP">%s</xliff:g>“ informaciją."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Paleidžiama <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pranešimo atsisakyta."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pranešimų gaubtas."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Spartieji nustatymai."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"ALR"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"ALR išjungtas"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"ALR įjungtas"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nėra jokių naujausių elementų"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Viską išvalėte"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Programos informacija"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekrano prisegimas"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"paieška"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Nepavyko paleisti <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Programa „<xliff:g id="APP">%s</xliff:g>“ išjungta saugos režimu."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Išvalyti viską"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Vilkite čia, kad naudotumėte skaidytą ekraną"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Perbraukite aukštyn, kad perjungtumėte programas"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Vilkite į dešinę, kad greitai perjungtumėte programas"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontalus skaidymas"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikalus skaidymas"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tinkintas skaidymas"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Skaidyti ekraną į viršų"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Skaidyti ekraną į kairę"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Skaidyti ekraną į dešinę"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Perjungti apžvalgą"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Įkrautas"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kraunamas"</string>
@@ -626,6 +595,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Sumažinti"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Toliau rodyti iš šios programos gautus pranešimus?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Šių pranešimų negalima išjungti"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"naudojant „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="appops_camera" msgid="8100147441602585776">"Ši programa naudoja fotoaparatą."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ši programa naudoja mikrofoną."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ši programa rodoma ekrane virš kitų programų."</string>
@@ -764,6 +734,7 @@
<item msgid="2139628951880142927">"Rodyti procentus kraunant (numatytasis nustatymas)"</item>
<item msgid="3327323682209964956">"Nerodyti šios piktogramos"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Rodyti mažo prioriteto pranešimų piktogramas"</string>
<string name="other" msgid="4060683095962566764">"Kita"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Skaidyto ekrano daliklis"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Kairysis ekranas viso ekrano režimu"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 6f5e230a3efd..eb5e92c6a0a3 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistēmas UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Notīrīt"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Noņemšana no saraksta"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Lietotnes informācija"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Jūsu pēdējie ekrāni tiek rādīti šeit."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Nerādīt nesen izmantotās lietotnes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="zero">%d ekrānu sadaļā Kopsavilkums</item>
- <item quantity="one">%d ekrāns sadaļā Kopsavilkums</item>
- <item quantity="other">%d ekrāni sadaļā Kopsavilkums</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Paziņojumi"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"atvērt tālruni"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"atvērt balss palīgu"</string>
<string name="camera_label" msgid="7261107956054836961">"atvērt kameru"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Atlasiet jaunu uzdevumu izkārtojumu"</string>
<string name="cancel" msgid="6442560571259935130">"Atcelt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Palīdzības ziņojuma apgabals"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Apstiprināt"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Nerādīt lietotni <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Lietotne <xliff:g id="APP">%s</xliff:g> vairs netiek rādīta."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Visas nesen izmantotās lietojumprogrammas tika noņemtas."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Atveriet lietojumprogrammas <xliff:g id="APP">%s</xliff:g> informāciju."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Notiek lietotnes <xliff:g id="APP">%s</xliff:g> palaišana."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Paziņojums netiek rādīts."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Paziņojumu panelis"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ātrie iestatījumi"</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ir atspējoti"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ir iespējoti"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nav nesenu vienumu"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Visi uzdevumi ir notīrīti"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informācija par lietojumprogrammu"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Piespraust ekrānu"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"Meklēt"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Nevarēja palaist lietotni <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Lietotne <xliff:g id="APP">%s</xliff:g> ir atspējota drošajā režīmā."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Notīrīt visu"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Velciet šeit, lai izmantotu ekrāna sadalīšanu"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Velciet augšup, lai pārslēgtu lietotnes"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Lai ātri pārslēgtu lietotnes, velciet pa labi"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontāls dalījums"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikāls dalījums"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pielāgots dalījums"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Sadalīt ekrānu augšdaļā"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Sadalīt ekrānu kreisajā pusē"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Sadalīt ekrānu labajā pusē"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Pārskata pārslēgšana"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulators uzlādēts"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Notiek uzlāde"</string>
@@ -622,6 +592,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizēt"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vai turpināt rādīt paziņojumus no šīs lietotnes?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Šos paziņojumus nevar izslēgt."</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Šajā lietotnē tiek izmantota kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Šajā lietotnē tiek izmantots mikrofons."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Šī lietotne tiek rādīta ekrānā pāri citām lietotnēm."</string>
@@ -758,6 +730,8 @@
<item msgid="2139628951880142927">"Rādīt procentuālo vērtību uzlādes laikā (noklusējums)"</item>
<item msgid="3327323682209964956">"Nerādīt šo ikonu"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Citi"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Ekrāna sadalītājs"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Kreisā daļa pa visu ekrānu"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index d13193b7effa..9c428052294e 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Кориснички интерфејс на систем"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Исчисти"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Отстрани од списокот"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информации за апликацијата"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Вашите неодамнешни екрани се појавуваат тука"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Отфрли ги скорешните апликации"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d екран во Краток преглед</item>
- <item quantity="other">%d екрани во Краток преглед</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема известувања"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Во тек"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известувања"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"отвори телефон"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"отвори гласовна помош"</string>
<string name="camera_label" msgid="7261107956054836961">"отвори камера"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за пораки за помош"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Отфрли <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> е отфрлена."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Сите неодамнешни апликации се отфрлени."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Отвори информации за апликацијата <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Се стартува <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Известувањето е отфрлено."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Панел за известување"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Брзи поставки."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC е оневозможено"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC е овозможено"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Нема неодамнешни ставки"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Исчистивте сѐ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информации за апликацијата"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"прикачување екран"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"пребарај"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не може да се вклучи."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> е оневозможен во безбеден режим."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Исчисти ги сите"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Повлечете тука за да користите поделен екран"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Повлечете нагоре за да се префрлите од една на друга апликација"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Повлечете надесно за брзо префрлање меѓу апликациите"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Раздели хоризонтално"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Раздели вертикално"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Раздели прилагодено"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Поделен екран во горниот дел"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Поделен екран на левата страна"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Поделен екран на десната страна"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Вклучи/исклучи преглед"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Наполнета"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Се полни"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Минимизирај"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Известувањава не може да се исклучат"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Апликацијава ја користи камерата."</string>
<string name="appops_microphone" msgid="741508267659494555">"Апликацијава го користи микрофонот."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Апликацијава се прикажува врз други апликации на вашиот екран."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Прикажи процент кога се полни (стандардно)"</item>
<item msgid="3327323682209964956">"Не прикажувај ја иконава"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Друго"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Разделник на поделен екран"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Левиот на цел екран"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index a5cad4e0c6b6..62196eaaa415 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"സിസ്റ്റം UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"മായ്‌ക്കുക"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ലിസ്‌റ്റിൽ നിന്നും നീക്കംചെയ്യുക"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ആപ്പ് വിവരം"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"നിങ്ങളുടെ പുതിയ സ്ക്രീനുകൾ ഇവിടെ ദൃശ്യമാകുന്നു"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"സമീപകാല അപ്ലിക്കേഷനുകൾ നിരസിക്കുക"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">ചുരുക്കവിവരണത്തിലെ %d സ്‌ക്രീനുകൾ</item>
- <item quantity="one">ചുരുക്കവിവരണത്തിലെ ഒരു സ്‌ക്രീൻ</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"നടന്നുകൊണ്ടിരിക്കുന്നവ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"അറിയിപ്പുകൾ"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ഫോൺ തുറക്കുക"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"വോയ്‌സ് അസിസ്റ്റ് തുറക്കുക"</string>
<string name="camera_label" msgid="7261107956054836961">"ക്യാമറ തുറക്കുക"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്‌ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string>
<string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"സഹായ സന്ദേശ ഏരിയ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"സ്ഥിരീകരിക്കുക"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> നിരസിക്കുക."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> നിരസിച്ചു."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"അടുത്തിടെയുള്ള എല്ലാ അപ്ലിക്കേഷനും നിരസിച്ചു."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ആപ്പ് വിവരങ്ങൾ തുറക്കുക."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ആരംഭിക്കുന്നു."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"അറിയിപ്പ് നിരസിച്ചു."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"അറിയിപ്പ് ഷെയ്‌ഡ്."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ദ്രുത ക്രമീകരണങ്ങൾ."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"നിങ്ങൾ എല്ലാം മായ്ച്ചിരിക്കുന്നു"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ആപ്പ് വിവരം"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"സ്ക്രീൻ പിൻ ചെയ്യൽ"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"തിരയുക"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ആരംഭിക്കാനായില്ല."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"സുരക്ഷിത മോഡിൽ <xliff:g id="APP">%s</xliff:g> പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"എല്ലാം മായ്‌ക്കുക"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"സ്പ്ലിറ്റ് സ്ക്രീൻ ഉപയോഗിക്കുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ആപ്പുകൾ പെട്ടെന്ന് മാറാൻ വലത്തോട്ട് വലിച്ചിടുക"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"തിരശ്ചീനമായി വേർതിരിക്കുക"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ലംബമായി വേർതിരിക്കുക"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ഇഷ്‌ടാനുസൃതമായി വേർതിരിക്കുക"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"സ്ക്രീൻ മുകളിലേക്ക് സ്പ്ലിറ്റ് ചെയ്യുക"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"സ്ക്രീൻ ഇടതുവശത്തേക്ക് സ്പ്ലിറ്റ് ചെയ്യുക"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"സ്ക്രീൻ വലതുവശത്തേക്ക് പിളർത്തുക"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"അവലോകനം മാറ്റുക"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ചാർജായി"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ചാർജ്ജുചെയ്യുന്നു"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ചെറുതാക്കുക‍"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ഈ അറിയിപ്പുകൾ ഓഫാക്കാനാവില്ല"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ഈ ആപ്പ് ക്യാമറ ഉപയോഗിക്കുന്നുണ്ട്."</string>
<string name="appops_microphone" msgid="741508267659494555">"ഈ ആപ്പ് മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ഈ ആപ്പ് നിങ്ങളുടെ സ്‌ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ചാർജ്ജുചെയ്യുമ്പോൾ ശതമാനം കാണിക്കുക (ഡിഫോൾട്ട്)"</item>
<item msgid="3327323682209964956">"ഈ ഐക്കൺ കാണിക്കരുത്"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"മറ്റുള്ളവ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"സ്പ്ലിറ്റ്-സ്ക്രീൻ ഡിവൈഡർ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ഇടത് പൂർണ്ണ സ്ക്രീൻ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 978fc0e8df68..223f4929dfdd 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -21,12 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Систем UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Цэвэрлэх"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Жагсаалтаас устгах"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Апп мэдээлэл"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Таны саяхны дэлгэц энд харагдах болно"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Сүүлийн апп-уудыг хаах"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for status_bar_accessibility_recent_apps (9138535907802238759) -->
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Мэдэгдэл байхгүй"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Гарсан"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Мэдэгдэл"</string>
@@ -99,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"утас нээх"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"дуут туслахыг нээнэ"</string>
<string name="camera_label" msgid="7261107956054836961">"камер нээх"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Шинэ ажиллах талбарыг сонгоно уу"</string>
<string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Тусламжийн зурвасын хэсэг"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Баталгаажуулах"</string>
@@ -186,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-г хаах."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> байхгүй."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Хамгийн сүүлийн бүх програмыг арилгасан байна."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> апп-н мэдээллийг нээнэ үү."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж байна."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Мэдэгдэл хаагдсан."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Мэдэгдлийн хураангуй самбар"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Шуурхай тохиргоо."</string>
@@ -353,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-г цуцалсан"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-г идэвхжүүлсэн"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Сүүлийн үеийн зүйл байхгүй"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Та бүгдийг нь устгасан"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Аппликешны мэдээлэл"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"дэлгэц тогтоох"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"хайх"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж чадсангүй."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>-г аюулгүй горимд идэвхгүй болгосон."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Бүгдийг арилгах"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Хуваагдсан дэлгэцийг ашиглахын тулд энд чирэх"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Апп сэлгэхийн тулд дээш шударна уу"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Аппуудыг хурдан сэлгэхийн тулд баруун тийш чирнэ үү"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хэвтээ чиглэлд хуваах"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Босоо чиглэлд хуваах"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Хүссэн хэлбэрээр хуваах"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Дэлгэцийг дээд хэсэгт хуваах"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Дэлгэцийг зүүн хэсэгт хуваах"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Дэлгэцийг баруун хэсэгт хуваах"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Тоймыг унтраах/асаах"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Цэнэглэгдсэн"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Цэнэглэж байна"</string>
@@ -616,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Багасгах"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Эдгээр мэдэгдлийг унтраах боломжгүй"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Энэ апп камерыг ашиглаж байна."</string>
<string name="appops_microphone" msgid="741508267659494555">"Энэ апп микрофоныг ашиглаж байна."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Энэ аппыг таны дэлгэцэд бусад аппын дээр харуулж байна."</string>
@@ -750,6 +725,8 @@
<item msgid="2139628951880142927">"Цэнэглэх үед хувийг тогтмол харуулах (өгөгдмөл)"</item>
<item msgid="3327323682209964956">"Энэ дүрс тэмдгийг бүү үзүүл"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Бусад"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"\"Дэлгэц хуваах\" хуваагч"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Зүүн талын бүтэн дэлгэц"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 103ca46fe1a0..da37acbf49b5 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"सिस्टम UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"साफ करा"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूचीमधून काढा"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"अॅप माहिती"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"आपल्या अलीकडील स्क्रीन येथे दिसतात"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"अलीकडील अॅप्स डिसमिस करा"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">विहंगावलोकनात %d स्क्रीन</item>
- <item quantity="other">विहंगावलोकनात %d स्क्रीन</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"सूचना नाहीत"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"सुरु असलेले"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचना"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"फोन उघडा"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"व्हॉइस सहाय्य उघडा"</string>
<string name="camera_label" msgid="7261107956054836961">"कॅमेरा उघडा"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द करा"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मदत मेसेज परिसर"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"खात्री करा"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> डिसमिस करा."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> डिसमिस केला."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"अलीकडील सर्व अॅप्लिकेशन डिसमिस झाले."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> अॅप्लिकेशन माहिती उघडा."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> प्रारंभ करत आहे."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना डिसमिस केल्या."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना शेड."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"द्रुत सेटिंग्ज."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC अक्षम केले आहे"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC सक्षम केले आहे"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"अलीकडील कोणतेही आयटम नाहीत"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"तुम्ही सर्वकाही साफ केले"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"अॅप्लिकेशन माहिती"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्‍क्रीन पिन करणे"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"शोधा"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ करणे शक्य झाले नाही."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> सुरक्षित-मोडमध्ये अक्षम केला आहे."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सर्व साफ करा"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रीन वापर करण्यासाठी येथे ड्रॅग करा"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अ‍ॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"अॅप्स वर झटपट स्विच करण्यासाठी उजवीकडे ड्रॅग करा"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज विभाजित करा"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"अनुलंब विभाजित करा"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"कस्टम विभाजित करा"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"स्क्रीन शीर्षस्थानी विभाजित करा"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"स्क्रीन डावीकडे विभाजित करा"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"स्क्रीन उजवीकडे विभाजित करा"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"अवलोकन टॉगल करा."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज झाली"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज होत आहे"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"लहान करा"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"या सूचना बंद करता येत नाहीत"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"हे अॅप कॅमेरा वापरत आहे."</string>
<string name="appops_microphone" msgid="741508267659494555">"हे अॅप मायक्रोफोन वापरत आहे."</string>
<string name="appops_overlay" msgid="6165912637560323464">"हे अॅप स्क्रीनवरील इतर अॅप्स वर प्रदर्शित होत आहे."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"चार्ज करताना टक्केवारी दर्शवा (डीफॉल्ट)"</item>
<item msgid="3327323682209964956">"हे आयकन दाखवू नका"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"अन्य"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"विभाजित-स्क्रीन विभाजक"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"डावी फुल स्क्रीन"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 7a6a1e3051b3..cb4dd146c372 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI Sistem"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Pdm bersih"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alih keluar dari senarai"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Maklumat aplikasi"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Skrin terbaru anda terpapar di sini"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Buang aplikasi terbaharu"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d skrin dalam Gambaran Keseluruhan</item>
- <item quantity="one">1 skrin dalam Gambaran Keseluruhan</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"buka telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"buka bantuan suara"</string>
<string name="camera_label" msgid="7261107956054836961">"buka kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih reka letak tugas baharu"</string>
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bahagian mesej bantuan"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Sahkan"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ketepikan <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ditolak."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaharu diketepikan."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Buka maklumat aplikasi <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Memulakan <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pemberitahuan diketepikan."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bidai pemberitahuan."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tetapan pantas."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dilumpuhkan"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC didayakan"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Tiada item terbaharu"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Anda telah mengetepikan semua item"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Maklumat Aplikasi"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"penyematan skrin"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"cari"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Tidak dapat memulakan <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dilumpuhkan dalam mod selamat."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kosongkan semua"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Seret ke sini untuk menggunakan skrin pisah"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Leret ke atas untuk menukar apl"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Seret ke kanan untuk beralih apl dengan pantas"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Mendatar Terpisah"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Menegak Terpisah"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tersuai Terpisah"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Pisahkan skrin ke atas"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Pisahkan skrin ke kiri"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Pisahkan skrin ke kanan"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Togol Ikhtisar"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Sudah dicas"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengecas"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimumkan"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tunjukkan pemberitahuan daripada apl ini?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Pemberitahuan ini tidak boleh dimatikan"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Apl ini sedang menggunakan kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Apl ini sedang menggunakan mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Apl ini dipaparkan di atas apl lain pada skrin anda."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Tunjukkan peratusan semasa mengecas (lalai)"</item>
<item msgid="3327323682209964956">"Jangan tunjukkan ikon ini"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Lain-lain"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Pembahagi skrin pisah"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Skrin penuh kiri"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 62970aa3c7cb..777d96ec7725 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"စနစ်၏UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ရှင်းရန်"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"စာရင်းမှ ဖယ်မည်"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"အက်ပ်အချက်အလက်များ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"လတ်တလောအက်ပ်များအား ပယ်ရန်"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">ခြုံကြည့်မှုထဲမှ မျက်နှာပြင် %d ခု</item>
- <item quantity="one">ခြုံကြည့်မှုထဲမှ မျက်နှာပြင် 1 ခု</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"အကြောင်းကြားချက်များ မရှိ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"လက်ရှိအသုံးပြုမှု"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"အကြောင်းကြားချက်များ။"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"အသံ အကူအညီအား ဖွင့်ရန်"</string>
<string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string>
<string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"အတည်ပြုပါ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ကို ပယ်ရန်"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ထုတ်ထားသည်။"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"မကြာသေးမီက အပလီကေးရှင်းများအားလုံး ဖယ်ထုတ်ပြီးပါပြီ။"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> အပလီကေးရှင်းအချက်အလက်ကို ဖွင့်ပါ။"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>ကို စတင်နေသည်။"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"အကြောင်းကြားချက်ကိုဖယ်ရှားပြီး"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"အ​ကြောင်းကြားစာအကွက်"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"အမြန်လုပ် အပြင်အဆင်"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ကို ပိတ်ထားသည်"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ကို ဖွင့်ထားသည်"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"မကြာမီကဖွင့်ထားသည်များ မရှိပါ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"သင်အားလုံးကို ရှင်းလင်းပြီးပါပြီ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်းအင်ဖို"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"မျက်နှာပြင် ပင်ထိုးမှု"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ရှာဖွေရန်"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ကို မစနိုင်ပါ။"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ကို ဘေးကင်းလုံခြုံသည့်မုဒ်တွင် ပိတ်ထားပါသည်။"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"အားလုံး ဖယ်ရှားပါ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"မျက်နှာပြင် ခွဲခြမ်းပြသခြင်းကို အသုံးပြုရန် ဤနေရာသို့ ပွတ်၍ဆွဲထည့်ပါ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"အက်ပ်များကို ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"အက်ပ်များကို ပြောင်းရန် ညာဘက်သို့ ဖိဆွဲပါ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ရေပြင်ညီ ပိုင်းမည်"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ဒေါင်လိုက်ပိုင်းမည်"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"စိတ်ကြိုက် ပိုင်းမည်"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"မျက်နှာပြင်ကို အပေါ်သို့ ခွဲရန်"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"မျက်နှာပြင်ကို ဘယ်ဘက်သို့ ခွဲရန်"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"မျက်နှာပြင်ကို ညာဘက်သို့ ခွဲရန်"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ဖွင့်၊ ပိတ် အနှစ်ချုပ်"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ချုံ့ရန်"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ဤအကြောင်းကြားချက်များကို ပိတ်၍မရပါ"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ဤအက်ပ်က ကင်မရာကို အသုံးပြုနေသည်။"</string>
<string name="appops_microphone" msgid="741508267659494555">"ဤအက်ပ်က မိုက်ခရိုဖုန်းကို အသုံးပြုနေသည်။"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ဤအက်ပ်က ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"အားသွင်းနေစဉ်တွင် ရာခိုင်နှုန်းကိုပြပါ (ပုံသေ)"</item>
<item msgid="3327323682209964956">"ဤသင်္ကေတပုံကို မပြပါနှင့်"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"အခြား"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"မျက်နှာပြင်ခွဲခြမ်း ပိုင်းခြားပေးသည့်စနစ်"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ဘယ်ဘက် မျက်နှာပြင်အပြည့်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 81ff8e2ae967..9b27df51750e 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sys.gr.snitt"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Fjern fra listen"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om appen"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"De sist brukte skjermene dine vises her"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Avvis nylig brukte apper"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d skjermer i oversikten</item>
- <item quantity="one">1 skjerm i oversikten</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen varslinger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varsler"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"åpne telefonen"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"åpne talehjelp"</string>
<string name="camera_label" msgid="7261107956054836961">"åpne kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Velg en ny utforming for oppgaver"</string>
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område for hjelpemelding"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekreft"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Avvis <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> avvist."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle nylig brukte apper er avvist."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Åpne appinformasjonen for <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starter <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Varselet ble skjult."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Varselskygge."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtiginnstillinger."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er slått av"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er slått på"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Ingen nylige elementer"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Du har fjernet alt"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformasjon"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"én-appsmodus"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"Søk"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Kunne ikke starte <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er slått av i sikker modus."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tøm alt"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit for å bruke delt skjerm"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Sveip opp for å bytte apper"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Dra til høyre for å bytte apper raskt"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Del horisontalt"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Del vertikalt"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Del tilpasset"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Delt skjerm øverst"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Delt skjerm til venstre"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Delt skjerm til høyre"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Slå oversikten av eller på"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Oppladet"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Lader"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsette å vise varsler fra denne appen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Du kan ikke slå av disse varslene"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Denne appen bruker kameraet."</string>
<string name="appops_microphone" msgid="741508267659494555">"Denne appen bruker mikrofonen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Denne appen vises over andre apper på skjermen."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Vis prosentandel under lading (standard)"</item>
<item msgid="3327323682209964956">"Ikke vis dette ikonet"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Annet"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Skilleelement for delt skjerm"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Utvid den venstre delen av skjermen til hele skjermen"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 4f2845ee43ae..5119e5b30a25 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"प्रणाली UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"हटाउनुहोस्"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूचीबाट हटाउनुहोस्"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"अनुप्रयोगको जानकारी"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"तपाईँको हालको स्क्रिन यहाँ प्रकट हुन्छ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"नयाँ अनुप्रयोगहरू खारेज गर्नुहोस्"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other"> अवलोकनमा %d स्क्रिनहरू</item>
- <item quantity="one">अवलोकनमा 1 स्क्रिन</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कुनै सूचनाहरू छैन"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाहरू"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"फोन खोल्नुहोस्"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"आवाज सहायता खोल्नुहोस्"</string>
<string name="camera_label" msgid="7261107956054836961">"क्यामेरा खोल्नुहोस्"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि गर्नुहोस्"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> खारेज गर्नुहोस्।"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खारेज गरिएको छ।"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"सबै हालका अनुप्रयोगहरू खारेज गरियो।"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> अनुप्रयोग सम्बन्धी जानकारी खोल्नुहोस्।"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>सुरु गर्दै।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारेज।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना कक्ष।"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"द्रुत सेटिङहरू"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC लाई असक्षम पारिएको छ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC लाई सक्षम पारिएको छ"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"हालका कुनै पनि वस्तुहरू छैनन्"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"तपाईँले सबै कुरा खाली गर्नुभएको छ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग जानकारी"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"स्क्रिन पिन गर्दै"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"खोजी गर्नुहोस्"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"सुरु गर्न सकिएन <xliff:g id="APP">%s</xliff:g>।"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> लाई सुरक्षित-मोडमा असक्षम गरिएको छ।"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सबै हटाउनुहोस्"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रिनको प्रयोग गर्नाका लागि यहाँ तान्नुहोस्"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"अनुप्रयोगहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"तेर्सो रूपमा विभाजन गर्नुहोस्"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ठाडो रूपमा विभाजन गर्नुहोस्"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"आफू अनुकूल विभाजन गर्नुहोस्"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"विभाजित-स्क्रिनलाई शीर्ष स्थानमा राख्नुहोस्‌"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"विभाजित-स्क्रिनलाई बायाँतर्फ राख्नुहोस्‌"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"विभाजित-स्क्रिनलाई दायाँतर्फ राख्नुहोस्‌"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"परिदृश्य टगल गर्नुहोस्"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज भयो"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हुँदै"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"सानो बनाउनुहोस्"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"यी सूचनाहरूलाई निष्क्रिय पार्न सकिँदैन"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।"</string>
<string name="appops_microphone" msgid="741508267659494555">"यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्दै छ।"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"चार्ज गर्दा प्रतिशत देखाउनुहोस् (पूर्वनिर्धारित)"</item>
<item msgid="3327323682209964956">"यो आइकन नदेखाउनुहोस्"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"अन्य"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"विभाजित-स्क्रिन छुट्याउने"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"बायाँ भाग पूर्ण स्क्रिन"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 60ca5322976c..448a36efa297 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Systeem-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Verwijderen uit lijst"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"App-info"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Je recente schermen worden hier weergegeven"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Recente apps negeren"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d schermen in Overzicht</item>
- <item quantity="one">1 scherm in Overzicht</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Geen meldingen"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Actief"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Meldingen"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"telefoon openen"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"spraakassistent openen"</string>
<string name="camera_label" msgid="7261107956054836961">"camera openen"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Nieuwe taakindeling selecteren"</string>
<string name="cancel" msgid="6442560571259935130">"Annuleren"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Gebied voor Help-berichten"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestigen"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> sluiten."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwijderd."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle recente apps gesloten."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"App-gegevens voor <xliff:g id="APP">%s</xliff:g> openen."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> starten."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Melding verwijderd."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Meldingenpaneel."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Snelle instellingen."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is uitgeschakeld"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is ingeschakeld"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Geen recente items"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Je hebt alles gewist"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"App-informatie"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"scherm vastzetten"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"zoeken"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Kan <xliff:g id="APP">%s</xliff:g> niet starten."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is uitgeschakeld in de veilige modus"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alles wissen"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Sleep hier naartoe om het scherm te splitsen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Veeg omhoog om te schakelen tussen apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Sleep naar rechts om snel tussen apps te schakelen"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontaal splitsen"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verticaal splitsen"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Aangepast splitsen"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Scherm bovenaan gesplitst"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Scherm links gesplitst"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Scherm rechts gesplitst"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Overzicht in-/uitschakelen"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Opladen"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimaliseren"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Meldingen van deze app blijven weergeven?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Deze meldingen kunnen niet worden uitgeschakeld"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Deze app gebruikt de camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Deze app gebruikt de microfoon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Deze app wordt over andere apps op je scherm heen weergegeven."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Percentage weergeven tijdens opladen (standaard)"</item>
<item msgid="3327323682209964956">"Dit pictogram niet weergeven"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Overig"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Scheiding voor gesplitst scherm"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Linkerscherm op volledig scherm"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index a78f5cd4e552..a9441fa37352 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ସିଷ୍ଟମ୍ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ଖାଲି କରନ୍ତୁ"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ତାଲିକାରୁ ବାହାର କରନ୍ତୁ"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ଆପ୍‍ ସୂଚନା"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ଆପଣଙ୍କ ସମ୍ପ୍ରତି ସ୍କ୍ରୀନ୍‍‌ ଏଠାରେ ଦେଖାଯାଉଛି"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"କିଛି ସମୟ ପୂର୍ବରୁ ଇନଷ୍ଟଲ୍‌ ହୋଇଥିବା ଆପ୍‌ଗୁଡ଼ିକୁ ଖାରଜ କରନ୍ତୁ"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">ଓଭର୍‌ଭ୍ୟୁରେ %d ସ୍କ୍ରୀନ୍‍</item>
- <item quantity="one">ଓଭର୍‌ଭ୍ୟୁରେ 1 ସ୍କ୍ରୀନ୍‍</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ଚାଲୁଅଛି"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ବିଜ୍ଞପ୍ତି"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ଫୋନ୍‌ ଖୋଲନ୍ତୁ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ଭଏସ୍‍ ସହାୟକ ଖୋଲନ୍ତୁ"</string>
<string name="camera_label" msgid="7261107956054836961">"କ୍ୟାମେରା ଖୋଲନ୍ତୁ"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ନୂଆ ଟାସ୍କ ଲେଆଉଟ୍‍ ଚୟନ କରନ୍ତୁ"</string>
<string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ସାହାଯ୍ୟ ମେସେଜ୍ କ୍ଷେତ୍ର"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ।"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ କରିଦିଆଗଲା।"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ସମସ୍ତ ସମ୍ପ୍ରତି ଆପ୍ଲିକେଶନଗୁଡ଼ିକ ଖାରଜ କରାଯାଇଛି।"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ଆପ୍ଲିକେଶନ୍‍ ସୂଚନା ଖୋଲନ୍ତୁ।"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ଆରମ୍ଭ ହେଉଛି।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ବିଜ୍ଞପ୍ତି ଶେଡ୍‍।"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ଦ୍ରୁତ ସେଟିଙ୍ଗ।"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ଆପଣ ସୁବୁକିଛି ଖାଲି କରିଦେଇଛନ୍ତି"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ଆପ୍ଲିକେଶନ୍‍ ସୂଚନା"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ସ୍କ୍ରୀନ୍‌ ଲକ୍‌"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> କୁ ଆରମ୍ଭ କରାଯାଇପାରିଲା ନାହିଁ।"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ସୁରକ୍ଷିତ-ମୋଡ୍‌ରେ ଅକ୍ଷମ ଅଟେ।"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ସବୁ ଖାଲି କରନ୍ତୁ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ସ୍ପ୍ଲିଟ୍‍ ସ୍କ୍ରୀନ୍‍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏଠାକୁ ଡ୍ରାଗ୍‌ କରନ୍ତୁ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ଆପ୍‌କୁ ବଦଳ କରିବା ପାଇଁ ସ୍ଵାଇପ୍ କରନ୍ତୁ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ଆପ୍‌ଗୁଡ଼ିକ ମଧ୍ୟରେ ଶୀଘ୍ର ବଦଳ କରିବା ପାଇଁ ଡାହାଣକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ଭୂସମାନ୍ତର ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ଭୂଲମ୍ବ ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"କଷ୍ଟମ୍‍ କରି ଭାଗ କରନ୍ତୁ"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ସ୍କ୍ରୀନ୍‌କୁ ଉପର ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ସ୍କ୍ରୀନ୍‌କୁ ବାମ ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ସ୍କ୍ରୀନ୍‌କୁ ଡାହାଣ ଆଡ଼କୁ ଭାଗ କରନ୍ତୁ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀକୁ ଟୋଗଲ୍ କରନ୍ତୁ"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ଚାର୍ଜ ହୋଇଗଲା"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ଚାର୍ଜ କରାଯାଉଛି"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ଛୋଟ କରନ୍ତୁ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ବନ୍ଦ କରିହେବ ନାହିଁ"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ଏହି ଆପ୍ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string>
<string name="appops_microphone" msgid="741508267659494555">"ଏହି ଆପ୍, ମାଇକ୍ରୋଫୋନ୍‍ ବ୍ୟବହାର କରୁଛି।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି।"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ଚାର୍ଜ କରାଯିବାବେଳେ ଶତକଡ଼ା ଦେଖାନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
<item msgid="3327323682209964956">"ଏହି ଆଇକନ୍‍ ଦେଖାନ୍ତୁ ନାହିଁ"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ଅନ୍ୟାନ୍ୟ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"ସ୍ପ୍ଲିଟ୍‍-ସ୍କ୍ରୀନ ବିଭାଜକ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ବାମ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 7e9a9163c2a8..57971eb84e9e 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ਸਿਸਟਮ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ਹਟਾਓ"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾਓ"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ਐਪ ਜਾਣਕਾਰੀ"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ਤੁਹਾਡੀਆਂ ਹਾਲੀਆ ਸਕ੍ਰੀਨਾਂ ਇੱਥੇ ਪ੍ਰਗਟ ਹੋਣਗੀਆਂ"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ਹਾਲੀਆ ਐਪਾਂ ਨੂੰ ਖਾਰਜ ਕਰੋ"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">ਰੂਪ-ਰੇਖਾ ਵਿੱਚ %d ਸਕ੍ਰੀਨਾਂ</item>
- <item quantity="other">ਰੂਪ-ਰੇਖਾ ਵਿੱਚ %d ਸਕ੍ਰੀਨਾਂ</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ਜਾਰੀ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ਸੂਚਨਾਵਾਂ"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ਫ਼ੋਨ ਖੋਲ੍ਹੋ"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ ਖੋਲ੍ਹੋ"</string>
<string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string>
<string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖਾਰਜ ਕਰੋ।"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ਰੱਦ ਕੀਤਾ।"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ਸਾਰੀਆਂ ਹਾਲੀਆ ਐਪਲੀਕੇਸ਼ਨਾਂ ਰੱਦ ਕੀਤੀਆਂ।"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ਐਪਲੀਕੇਸ਼ਨਾਂ ਜਾਣਕਾਰੀ ਖੋਲ੍ਹੋ।"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ਸੂਚਨਾ ਰੱਦ ਕੀਤੀ।"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ਸੂਚਨਾ ਸ਼ੇਡ।"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ।"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ਤੁਸੀਂ ਸਭ ਕੁਝ ਸਾਫ਼ ਕਰ ਦਿੱਤਾ ਹੈ"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਣਕਾਰੀ"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ਸਕ੍ਰੀਨ ਪਿਨਿੰਗ"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ਖੋਜੋ"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਸੁਰੱਖਿਅਤ-ਮੋਡ ਵਿੱਚ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ਐਪਾਂ ਵਿਚਾਲੇ ਤੇਜ਼ੀ ਨਾਲ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਘਸੀਟੋ"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ਹੌਰੀਜ਼ੌਂਟਲ ਸਪਲਿਟ"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ਵਰਟੀਕਲ ਸਪਲਿਟ"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਵਿਉਂਂਤੀ ਸਪਲਿਟ"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"ਸਕ੍ਰੀਨ ਨੂੰ ਉੱਪਰ ਵੱਲ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"ਸਕ੍ਰੀਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"ਸਕ੍ਰੀਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਵਿਭਾਜਿਤ ਕਰੋ"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"ਰੂਪ-ਰੇਖਾ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ਚਾਰਜ ਹੋਇਆ"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ਚਾਰਜ ਕਰ ਰਿਹਾ ਹੈ"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ਛੋਟਾ ਕਰੋ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ਇਹ ਐਪ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
<string name="appops_microphone" msgid="741508267659494555">"ਇਹ ਐਪ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string>
<string name="appops_overlay" msgid="6165912637560323464">"ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ।"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਪ੍ਰਤੀਸ਼ਤਤਾ ਦਿਖਾਓ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item>
<item msgid="3327323682209964956">"ਇਸ ਪ੍ਰਤੀਕ ਨੂੰ ਨਾ ਦਿਖਾਓ"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ਹੋਰ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਡਿਵਾਈਡਰ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ਖੱਬੇ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 22ef98c6b06a..2510aba89edb 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Interfejs"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Usuń z listy"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacje o aplikacji"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Tutaj pojawią się ostatnie ekrany"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ukryj ostatnie aplikacje"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="few">%d ekrany w widoku przeglądu</item>
- <item quantity="many">%d ekranów w widoku przeglądu</item>
- <item quantity="other">%d ekranu w widoku przeglądu</item>
- <item quantity="one">1 ekran w widoku przeglądu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Brak powiadomień"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otwórz telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otwórz pomoc głosową"</string>
<string name="camera_label" msgid="7261107956054836961">"otwórz aparat"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Wybierz nowy układ zadań"</string>
<string name="cancel" msgid="6442560571259935130">"Anuluj"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Obszar komunikatu pomocy"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potwierdź"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Usuń stąd <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>: zamknięto."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Wszystkie ostatnie aplikacje zostały zamknięte."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otwórz informacje o aplikacji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Uruchamiam <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Zamknięto powiadomienie."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Obszar powiadomień."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Szybkie ustawienia."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"Komunikacja NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Komunikacja NFC jest wyłączona"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Komunikacja NFC jest włączona"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Brak ostatnich elementów"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Wszystko zostało wyczyszczone"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacje o aplikacji"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"przypinanie ekranu"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"szukaj"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Nie udało się uruchomić aplikacji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacja <xliff:g id="APP">%s</xliff:g> została wyłączona w trybie bezpiecznym."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Wyczyść wszystko"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Przeciągnij tutaj, by podzielić ekran"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Przesuń w górę, by przełączyć aplikacje"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Szybko przeciągnij w prawo, by przełączyć aplikacje"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podziel poziomo"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podziel pionowo"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podziel niestandardowo"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Podziel ekran u góry"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Podziel ekran z lewej"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Podziel ekran z prawej"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Przełącz Przegląd"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Naładowana"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Ładowanie"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizuj"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Nadal pokazywać powiadomienia z tej aplikacji?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tych powiadomień nie można wyłączyć"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ta aplikacja używa aparatu."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ta aplikacja używa mikrofonu."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacja wyświetla się nad innymi aplikacjami na ekranie."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Pokazuj procent podczas ładowania (domyślnie)"</item>
<item msgid="3327323682209964956">"Nie pokazuj tej ikony"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Inne"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Linia dzielenia ekranu"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Lewa część ekranu na pełnym ekranie"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index f26d1babed99..507c6b0aa704 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Interf sist"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inform. do app"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d telas em \"Visão geral\"</item>
- <item quantity="other">%d telas em \"Visão geral\"</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir telefone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir assistência de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre informações do app <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação dispensada."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Aba de notificações."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configurações rápidas."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nenhum item recente"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Você limpou tudo"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arraste para a direita para alternar rapidamente entre os apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dividir a tela para a parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dividir a tela para a esquerda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dividir a tela para a direita"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Alternar Visão geral"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Carregando"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostrar porcentagem durante o carregamento (padrão)"</item>
<item msgid="3327323682209964956">"Não mostrar este ícone"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostrar ícones de notificações de baixa prioridade"</string>
<string name="other" msgid="4060683095962566764">"Outros"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor de tela"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Lado esquerdo em tela cheia"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index e6ed4dc6636b..f3c993f62d87 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"IU do sistema"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info. da aplicação"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Os ecrãs recentes aparecem aqui"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicações recentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d ecrãs na Vista geral</item>
- <item quantity="one">1 ecrã na Vista geral</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir telemóvel"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir assistente de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir câmara"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo esquema de tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ignorar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ignorado."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todas as aplicações recentes foram ignoradas."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abrir as informações da aplicação <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"A iniciar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação ignorada."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Painel de notificações."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Definições rápidas."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"O NFC está desativado"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"O NFC está ativado"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nenhum item recente"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Limpou tudo"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações da aplicação"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação no ecrã"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar o <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para utilizar o ecrã dividido"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslizar rapidamente para cima para mudar de aplicação"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arraste para a direita para mudar rapidamente de aplicação."</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Ecrã dividido na parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Ecrã dividido à esquerda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Ecrã dividido à direita"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Ativar/desativar Vista geral"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"A carregar"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Pretende continuar a ver notificações desta aplicação?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar estas notificações."</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"através da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Esta aplicação está a utilizar a câmara."</string>
<string name="appops_microphone" msgid="741508267659494555">"Esta aplicação está a utilizar o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Esta aplicação está a sobrepor-se a outras aplicações no ecrã."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostrar a percentagem durante o carregamento (predefinição)"</item>
<item msgid="3327323682209964956">"Não mostrar este ícone"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostrar ícones de notificações de prioridade baixa"</string>
<string name="other" msgid="4060683095962566764">"Outro"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor do ecrã dividido"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ecrã esquerdo inteiro"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index f26d1babed99..507c6b0aa704 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Interf sist"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Remover da lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Inform. do app"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d telas em \"Visão geral\"</item>
- <item quantity="other">%d telas em \"Visão geral\"</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"abrir telefone"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"abrir assistência de voz"</string>
<string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Descartar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Abre informações do app <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação dispensada."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Aba de notificações."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configurações rápidas."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nenhum item recente"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Você limpou tudo"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Arraste para a direita para alternar rapidamente entre os apps"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Dividir a tela para a parte superior"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Dividir a tela para a esquerda"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Dividir a tela para a direita"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Alternar Visão geral"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Carregando"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Mostrar porcentagem durante o carregamento (padrão)"</item>
<item msgid="3327323682209964956">"Não mostrar este ícone"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Mostrar ícones de notificações de baixa prioridade"</string>
<string name="other" msgid="4060683095962566764">"Outros"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divisor de tela"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Lado esquerdo em tela cheia"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index c553f6e480fe..53d8277e6b89 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI sistem"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ștergeți"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminați din listă"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info aplicație"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ecranele dvs. recente apar aici"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Renunțați la aplicațiile recente"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="few">%d ecrane în Recente</item>
- <item quantity="other">%d de ecrane în Recente</item>
- <item quantity="one">Un ecran în Recente</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nicio notificare"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfășurare"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"deschideți telefonul"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"deschideți asistentul vocal"</string>
<string name="camera_label" msgid="7261107956054836961">"deschideți camera foto"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Selectați noul aspect pentru activitate"</string>
<string name="cancel" msgid="6442560571259935130">"Anulați"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona mesajelor de ajutor"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmați"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Închideți <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> a fost eliminată."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toate aplicațiile recente au fost închise."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Deschideți informațiile despre aplicația <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Se inițiază <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificarea a fost închisă."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Fereastră pentru notificări."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setări rapide."</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Serviciul NFC este dezactivat"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Serviciul NFC este activat"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Niciun element recent"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Ați șters tot"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informații despre aplicație"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixarea ecranului"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"căutare"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> nu a putut porni."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplicația <xliff:g id="APP">%s</xliff:g> este dezactivată în modul sigur."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ștergeți tot"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trageți aici pentru a folosi ecranul împărțit"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Glisați în sus pentru a comuta între aplicații"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Glisați la dreapta pentru a comuta rapid între aplicații"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divizare pe orizontală"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divizare pe verticală"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divizare personalizată"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Divizați ecranul în partea de sus"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Divizați ecranul la stânga"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Divizați ecranul la dreapta"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Comutați secțiunea Recente"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Încărcată"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Se încarcă"</string>
@@ -622,6 +592,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizați"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Doriți să continuați afișarea notificărilor de la această aplicație?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Aceste notificări nu pot fi dezactivate"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Această aplicație folosește camera foto."</string>
<string name="appops_microphone" msgid="741508267659494555">"Această aplicație folosește microfonul."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Această aplicație se afișează pe alte aplicații de pe ecran."</string>
@@ -758,6 +730,8 @@
<item msgid="2139628951880142927">"Afișează procentajul când se încarcă (prestabilit)"</item>
<item msgid="3327323682209964956">"Nu afișa această pictogramă"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Altele"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Separator pentru ecranul împărțit"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Partea stângă pe ecran complet"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 07aa66aadd7f..b180f8748503 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Интерфейс системы"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Удалить из списка"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"О приложении"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Здесь будут показаны недавние приложения."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Закрыть недавние приложения"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">Показан %d экран</item>
- <item quantity="few">Показано %d экрана</item>
- <item quantity="many">Показано %d экранов</item>
- <item quantity="other">Показано %d экранов</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"Открыть телефон."</string>
<string name="voice_assist_label" msgid="3956854378310019854">"включить аудиоподсказки"</string>
<string name="camera_label" msgid="7261107956054836961">"Открыть камеру."</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string>
<string name="cancel" msgid="6442560571259935130">"Отмена"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Справочное сообщение"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Подтвердить"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Удаление приложения <xliff:g id="APP">%s</xliff:g> из списка."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" удалено из списка."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Все недавние приложения закрыты."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Открыть информацию о приложении \"<xliff:g id="APP">%s</xliff:g>\""</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Запуск приложения <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Уведомление закрыто"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Панель уведомлений"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Быстрые настройки"</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"Модуль NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Модуль NFC отключен"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Модуль NFC включен"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Здесь пока ничего нет."</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Вы очистили всё"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Сведения о приложении"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Заблокировать в приложении"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"поиск"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Не удалось запустить приложение \"<xliff:g id="APP">%s</xliff:g>\""</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" отключено в безопасном режиме."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистить все"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетащите сюда, чтобы разделить экран"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Чтобы переключиться между приложениями, проведите по экрану вверх."</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Перетащите вправо, чтобы быстро переключиться между приложениями"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Разделить по горизонтали"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Разделить по вертикали"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Разделить по-другому"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Разделить экран по верхнему краю"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Разделить экран по левому краю"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Разделить экран по правому краю"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Переключить режим обзора"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Батарея заряжена"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядка батареи"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Свернуть"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Показывать уведомления от этого приложения?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Эти уведомления нельзя отключить."</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Это приложение использует камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Это приложение использует микрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Это приложение располагается поверх других приложений."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Показывать процент во время зарядки (по умолчанию)"</item>
<item msgid="3327323682209964956">"Не показывать этот значок"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Другое"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Разделитель экрана"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Левый во весь экран"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index aac62a25e5a9..0eae821378b7 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"පද්ධති UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"හිස් කරන්න"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ලැයිස්තුවෙන් ඉවත් කරන්න"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"යෙදුම් තොරතුරු"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"මෙහි ඔබගේ මෑතක තිර පෙන්නුම් කරයි"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"මෑත යෙදුම් ඉවතලන්න"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">විශ්ලේෂණය තුළ තිර %d යි</item>
- <item quantity="other">විශ්ලේෂණය තුළ තිර %d</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"දැනුම්දීම් නැත"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දැනට පවතින"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"දැනුම්දීම්"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"දුරකථනය විවෘත කරන්න"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"විවෘත හඬ සහාය"</string>
<string name="camera_label" msgid="7261107956054836961">"කැමරාව විවෘත කරන්න"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"නව කාර්යය සැකැස්ම තෝරන්න"</string>
<string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"උදවු පණිවිඩ ප්‍රදේශය"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"තහවුරු කරන්න"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ඉවතලන්න."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> අස් කර ඇත."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"සියලුම මෑත යෙඳුම් අස් කරන ලදි."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> යෙදුම් තොරතුරු විවෘත කරයි."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ආරම්භ කරමින්."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"දැනුම්දීම නිෂ්ප්‍රභා කරඇත."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"දැනුම්දීම් ආවරණය."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ක්ෂණික සැකසීම්."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC අබලයි"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC සබලයි"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"මෑත අයිතම නැත"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"ඔබ සියලු දේ හිස් කර ඇත"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"යෙදුම් තොරතුරු"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"තිර ඇමිණීම"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"සෙවීම"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ආරම්භ කළ නොහැක."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ආරක්ෂිත ප්‍රකාරය තුළ අබලයි."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"සියල්ල හිස් කරන්න"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"බෙදුම් තිරය භාවිත කිරීමට මෙතැනට අදින්න"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"යෙදුම් මාරු කිරීමට ස්වයිප් කරන්න"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ඉක්මනින් යෙදුම් මාරු කිරීමට දකුණට අදින්න"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"තිරස්ව වෙන් කරන්න"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"සිරස්ව වෙන් කරන්න"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"අභිමත ලෙස වෙන් කරන්න"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"තිරය ඉහළට බෙදන්න"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"තිරය වමට බෙදන්න"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"තිරය දකුණට බෙදන්න"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"දළ විශ්ලේෂණය ටොගල කරන්න"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"අරෝපිතයි"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ආරෝපණය වෙමින්"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"කුඩා කරන්න"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"මෙම දැනුම්දීම් ක්‍රියාවිරහිත කළ නොහැකිය"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"මෙම යෙදුම කැමරාව භාවිතා කරයි."</string>
<string name="appops_microphone" msgid="741508267659494555">"මෙම යෙදුම මයික්‍රෆෝනය භාවිතා කරයි."</string>
<string name="appops_overlay" msgid="6165912637560323464">"මෙම යෙදුම් ඔබගේ තිරය මත අනෙකුත් යෙදුම්වලට උඩින් සංදර්ශනය වේ."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ආරෝපණය වන විට ප්‍රතිශතය පෙන්වන්න (පෙරනිමි)"</item>
<item msgid="3327323682209964956">"මෙම නිරූපකය නොපෙන්වන්න"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"වෙනත්"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"බෙදුම්-තිර වෙන්කරණය"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"වම් පූර්ණ තිරය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 58e176a9ba8d..6c6ad14136db 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI systému"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazať"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrániť zo zoznamu"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"O aplikácii"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaše nedávne obrazovky sa zobrazia tu."</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zatvoriť nedávne aplikácie"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="few">%d obrazovky v Prehľade</item>
- <item quantity="many">%d obrazovky v Prehľade</item>
- <item quantity="other">%d obrazoviek v Prehľade</item>
- <item quantity="one">1 obrazovka v Prehľade</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Upozornenia"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"otvoriť telefón"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otvoriť hlasového asistenta"</string>
<string name="camera_label" msgid="7261107956054836961">"spustiť fotoaparát"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Vyberte nové rozloženie úlohy"</string>
<string name="cancel" msgid="6442560571259935130">"Zrušiť"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblasť správy pomocníka"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdiť"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Zavrieť aplikáciu <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všetky nedávne aplikácie boli odmietnuté."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Otvoriť informácie o aplikácii <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Spúšťa sa aplikácia <xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Upozornenie bolo zrušené."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Panel upozornení."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rýchle nastavenia."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je deaktivované"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je aktivované"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Žiadne nedávne položky"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Vymazali ste všetko"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informácie o aplikácii"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pripnutie obrazovky"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"hľadať"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikáciu <xliff:g id="APP">%s</xliff:g> sa nepodarilo spustiť"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikácia <xliff:g id="APP">%s</xliff:g> je v núdzovom režime zakázaná."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazať všetko"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Presuňte okno sem a použite tak rozdelenú obrazovku"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Potiahnutím nahor prepnete aplikácie"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Presunutím doprava rýchlo prepnete aplikácie"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Rozdeliť vodorovné"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Rozdeliť zvislé"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Rozdeliť vlastné"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Rozdelená obrazovka hore"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Rozdelená obrazovka naľavo"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Rozdelená obrazovka napravo"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Prepnúť prehľad"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabitá"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíja sa"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovať"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Tieto upozornenia sa nedajú vypnúť"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Táto aplikácia používa fotoaparát."</string>
<string name="appops_microphone" msgid="741508267659494555">"Táto aplikácia používa mikrofón."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Táto aplikácia sa zobrazuje cez ďalšie aplikácie na obrazovke."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Zobrazovať percentá počas nabíjania (predvolené)"</item>
<item msgid="3327323682209964956">"Nezobrazovať túto ikonu"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Ďalšie"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Rozdeľovač obrazovky"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ľavá – na celú obrazovku"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 1323fcd3ccf1..f94ee6024cbe 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sistemski uporabniški vmesnik"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Počisti"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrani s seznama"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Podatki o aplikaciji"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaši nedavni zasloni so prikazani tu"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zapre nedavne aplikacije"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d zaslon v pregledu</item>
- <item quantity="two">%d zaslona v pregledu</item>
- <item quantity="few">%d zasloni v pregledu</item>
- <item quantity="other">%d zaslonov v pregledu</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Obvestila"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"odpri telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"odpri glasovnega pomočnika"</string>
<string name="camera_label" msgid="7261107956054836961">"odpri fotoaparat"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Izberite novo postavitev opravil"</string>
<string name="cancel" msgid="6442560571259935130">"Prekliči"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Območje sporočila pomoči"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potrdite"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Opusti aplikacijo <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> je bila odstranjena."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Vse nedavne aplikacije so bile opuščene."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Odpiranje podatkov o aplikaciji <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Zaganjanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obvestilo je bilo odstranjeno."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Zaslon z obvestili."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hitre nastavitve."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Tehnologija NFC je onemogočena"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Tehnologija NFC je omogočena"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Ni nedavnih elementov"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Vse te počistili"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Podatki o aplikaciji"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pripenjanje zaslona"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"iskanje"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacije <xliff:g id="APP">%s</xliff:g> ni bilo mogoče zagnati."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je v varnem načinu onemogočena."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši vse"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povlecite sem za razdeljeni zaslon"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Za preklop aplikacij povlecite navzgor"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Povlecite v desno za hiter preklop med aplikacijami"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Razdeli vodoravno"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Razdeli navpično"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Razdeli po meri"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Razdeljen zaslon na vrhu"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Razdeljen zaslon na levi"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Razdeljen zaslon na desni"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Vklop/izklop pregleda"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulator napolnjen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Polnjenje"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimiraj"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite, da so obvestila te aplikacije še naprej prikazana?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Teh obvestil ni mogoče izklopiti"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ta aplikacija uporablja fotoaparat."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ta aplikacija uporablja mikrofon."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacija prekriva druge aplikacije na zaslonu."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Prikaži odstotek med polnjenjem (privzeto)"</item>
<item msgid="3327323682209964956">"Ne prikaži te ikone"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Drugo"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Razdelilnik zaslonov"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Levi v celozaslonski način"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 8f0866536946..7869cd940505 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Ndërfaqja e përdoruesit të sistemit"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Pastro"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Hiq nga lista"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informacioni i aplikacionit"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ekranet e tua më të fundit shfaqen këtu"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Largo aplikacionet më të fundit"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d ekrane te \"Përmbledhja\"</item>
- <item quantity="one">1 ekran te \"Përmbledhja\"</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Asnjë njoftim"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Në vazhdim"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Njoftimet"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"hap telefonin"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"hap ndihmën zanore"</string>
<string name="camera_label" msgid="7261107956054836961">"hap kamerën"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Zgjidh strukturën e re të detyrës"</string>
<string name="cancel" msgid="6442560571259935130">"Anulo"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona e mesazhit të ndihmës"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmo"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Largo <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> është hequr."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Të gjitha aplikacionet e fundit u larguan."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Hap informacionin e aplikacionit <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Po nis <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Njoftimi është hequr."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Streha e njoftimeve."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Cilësime të shpejta."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC është çaktivizuar"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC është aktivizuar"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Nuk ka asnjë artikull të fundit"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"I ke pastruar të gjitha"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacioni i aplikacionit"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"gozhdimi i ekranit"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"kërko"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> nuk mundi të nisej."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> është i çaktivizuar në modalitetin e sigurt."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Pastroji të gjitha"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Zvarrit këtu për të përdorur ekranin e ndarë"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Zvarrit djathtas për të ndërruar aplikacionet me shpejtësi"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Ndaje horizontalisht"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Ndaj vertikalisht"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ndaj të personalizuarën"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Ndaje ekranin lart"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Ndaje ekranin në të majtë"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Ndaje ekranin në të djathtë"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Kalo te përmbledhja"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"I ngarkuar"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Po ngarkohet"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimizo"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Këto njoftime nuk mund të çaktivizohen"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ky aplikacion po përdor kamerën."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ky aplikacion po përdor mikrofonin."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ky aplikacion po shfaqet mbi aplikacionet e tjera në ekran."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Shfaq përqindjen gjatë ngarkimit (e parazgjedhur)"</item>
<item msgid="3327323682209964956">"Mos e shfaq këtë ikonë"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Të tjera"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Ndarësi i ekranit të ndarë"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ekrani i plotë majtas"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 609f332622f0..420056ecd927 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -21,15 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI система"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Обриши"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Уклањање са листе"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информације о апликацији"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Недавни екрани се појављују овде"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Одбаци недавне апликације"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d екран у Прегледу</item>
- <item quantity="few">%d екрана у Прегледу</item>
- <item quantity="other">%d екрана у Прегледу</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нема обавештења"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текуће"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Обавештења"</string>
@@ -102,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"отвори телефон"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"отвори гласовну помоћ"</string>
<string name="camera_label" msgid="7261107956054836961">"отвори камеру"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Изабери нови распоред задатака"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област поруке за помоћ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string>
@@ -189,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Одбаците <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Апликација <xliff:g id="APP">%s</xliff:g> је одбачена."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Све недавно коришћене апликације су одбачене."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Отворите информације о апликацији <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Покрећемо <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Обавештење је одбачено."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Прозор са обавештењима."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Брза подешавања."</string>
@@ -358,23 +343,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC је онемогућен"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC је омогућен"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Нема недавних ставки"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Обрисали сте све"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Информације о апликацији"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"качење екрана"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"претражи"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Покретање апликације <xliff:g id="APP">%s</xliff:g> није успело."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Апликација <xliff:g id="APP">%s</xliff:g> је онемогућена у безбедном режиму."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Обриши све"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Превуците овде да бисте користили раздељени екран"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Превуците нагоре да бисте мењали апликације"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Превуците удесно да бисте брзо променили апликације"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Подели хоризонтално"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Подели вертикално"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Прилагођено дељење"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Подели екран нагоре"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Подели екран налево"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Подели екран надесно"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Укључи/искључи преглед"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Напуњена је"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Пуњење"</string>
@@ -622,6 +592,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Умањи"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Желите ли да се обавештења из ове апликације и даље приказују?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Не можете да искључите ова обавештења"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ова апликација користи камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ова апликација користи микрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ова апликација се приказује преко других апликација на екрану."</string>
@@ -758,6 +730,8 @@
<item msgid="2139628951880142927">"Прикажи проценат током пуњења (подразумевано)"</item>
<item msgid="3327323682209964956">"Не приказуј ову икону"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Друго"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Разделник подељеног екрана"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Режим целог екрана за леви екран"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 72ae99b0ebfc..238cc9bc7820 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Gränssnitt"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ta bort från listan"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Info om appen"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Dina senaste skärmar visas här"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Avvisa nya appar"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d skärmar i översikten</item>
- <item quantity="one">En skärm i översikten</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Aviseringar"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"öppna mobilen"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"öppna röstassistenten"</string>
<string name="camera_label" msgid="7261107956054836961">"öppna kameran"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Välj en ny layout för uppgiften"</string>
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område för hjälpmeddelande"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekräfta"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ta bort <xliff:g id="APP">%s</xliff:g> från listan."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> togs bort permanent."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alla appar har tagits bort från listan Senaste."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Öppna appinformation för <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Startar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Meddelandet ignorerades."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Meddelandepanel."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Snabbinställningar."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC är inaktiverat"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC är aktiverat"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Listan med de senaste åtgärderna är tom"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Du har tömt listan"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformation"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fästa skärmen"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"sök"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Det gick inte att starta appen <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> är inaktiverad i säkert läge."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Rensa alla"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit för att dela upp skärmen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Byt appar genom att svepa uppåt"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Tryck och dra åt höger för att snabbt byta mellan appar"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dela horisontellt"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dela vertikalt"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dela anpassad"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Delad skärm till överkanten"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Delad skärm åt vänster"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Delad skärm åt höger"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Aktivera och inaktivera översikten"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laddat"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laddar"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Minimera"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Vill du fortsätta visa aviseringar för den här appen?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"De här aviseringarna kan inte inaktiveras"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Kameran används av appen."</string>
<string name="appops_microphone" msgid="741508267659494555">"Mikrofonen används av appen."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Appen visas över andra appar på skärmen."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Visa procent under laddning (standard)"</item>
<item msgid="3327323682209964956">"Visa inte den här ikonen"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Annat"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Avdelare för delad skärm"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Helskärm på vänster skärm"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index a73d0e7dd5b1..54e8544beca2 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Kiolesura"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Futa"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ondoa kwenye orodha"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Taarifa za programu-matumizi"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Skrini zako za hivi majuzi huonekana hapa"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ondosha programu za hivi karibuni"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">Skrini %d katika Muhtasari</item>
- <item quantity="one">Skrini 1 katika Muhtasari</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Hakuna arifa"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Inaendelea"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Arifa"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"fungua simu"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"fungua mapendekezo ya sauti"</string>
<string name="camera_label" msgid="7261107956054836961">"fungua kamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Chagua muundo mpya wa kazi"</string>
<string name="cancel" msgid="6442560571259935130">"Ghairi"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Sehemu ya ujumbe wa usaidizi"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Thibitisha"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Ondoa <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> imeondolewa."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Programu za hivi majuzi zimeondolewa."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Fungua maelezo kuhusu programu ya <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Inaanzisha <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Arifa imetupwa."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kivuli cha arifa."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mipangilio ya haraka."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC imezimwa"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC imewashwa"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Hakuna vipengee vya hivi karibuni"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Umeondoa vipengee vyote"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Maelezo ya Programu"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kubandika kwenye skirini"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"tafuta"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Haikuweza kuanzisha <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> imezimwa katika hali salama."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Futa zote"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Buruta hapa ili utumie skrini iliyogawanywa"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Telezesha kidole juu ili ubadilishe programu"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Buruta kulia ili ubadilishe programu haraka"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gawanya Mlalo"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Gawanya Wima"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Maalum Iliyogawanywa"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Gawa skrini kuelekea juu"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Gawa skrini upande wa kushoto"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Gawa skrini upande wa kulia"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Washa Muhtasari"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Betri imejaa"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Inachaji"</string>
@@ -618,6 +589,7 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Punguza"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Ungependa kuendelea kuonyesha arifa kutoka programu hii?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Huwezi kuzima arifa hizi"</string>
+ <string name="notification_delegate_header" msgid="9167022191405284627">"kupitia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="appops_camera" msgid="8100147441602585776">"Programu hii inatumia kamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Programu hii inatumia maikrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Programu hii inachomoza kwenye programu zingine zilizo katika skrini yako."</string>
@@ -752,6 +724,7 @@
<item msgid="2139628951880142927">"Onyesha asilimia wakati inachaji (chaguomsingi)"</item>
<item msgid="3327323682209964956">"Usionyeshe aikoni hii"</item>
</string-array>
+ <string name="tuner_low_priority" msgid="1325884786608312358">"Onyesha aikoni za arifa zisizo muhimu"</string>
<string name="other" msgid="4060683095962566764">"Nyingine"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Kitenganishi cha skrini inayogawanywa"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Skrini nzima ya kushoto"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 02457d94cbad..becd903534d4 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"சாதனத்தின் UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"அழி"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"பட்டியலில் இருந்து அகற்று"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"பயன்பாட்டுத் தகவல்"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"சமீபத்திய திரைகள் இங்கு தோன்றும்"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"சமீபத்திய பயன்பாடுகளை நிராகரி"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">மேலோட்டப் பார்வையில் %d திரைகள்</item>
- <item quantity="one">மேலோட்டப் பார்வையில் 1 திரை</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"அறிவிப்புகள் இல்லை"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"செயலில் இருக்கும்"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"அறிவிப்புகள்"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ஃபோனைத் திற"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"குரல் உதவியைத் திற"</string>
<string name="camera_label" msgid="7261107956054836961">"கேமராவைத் திற"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string>
<string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"உதவிச் செய்திக்கான பகுதி"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"உறுதிப்படுத்துக"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ஐ நிராகரி."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> விலக்கப்பட்டது."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"எல்லா சமீபத்திய பயன்பாடுகளும் விலக்கப்பட்டன."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> பயன்பாட்டின் தகவலைத் திற."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ஐத் தொடங்குகிறது."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"அறிவிப்பு நிராகரிக்கப்பட்டது."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"அறிவிப்பு விவரம்."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"உடனடி அமைப்பு."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC முடக்கப்பட்டது"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC இயக்கப்பட்டது"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"சமீபத்திய பணிகள் இல்லை"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"எல்லாவற்றையும் அழித்துவிட்டீர்கள்"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"பயன்பாட்டு தகவல்"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"திரையை பின் செய்தல்"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"தேடு"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ஐத் தொடங்க முடியவில்லை."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"பாதுகாப்புப் பயன்முறையில் <xliff:g id="APP">%s</xliff:g> முடக்கப்பட்டது."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"அனைத்தையும் அழி"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"திரைப் பிரிப்பைப் பயன்படுத்த, இங்கே இழுக்கவும்"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ஆப்ஸை வேகமாக மாற்ற, வலப்புறம் இழுக்கவும்"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"தனிவிருப்பத்தில் பிரி"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"திரையை மேல்புறமாகப் பிரி"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"திரையை இடப்புறமாகப் பிரி"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"திரையை வலப்புறமாகப் பிரி"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"மேலோட்டப் பார்வையை நிலைமாற்று"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"சார்ஜ் செய்யப்பட்டது"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜ் ஆகிறது"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"சிறிதாக்கு"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"இந்த அறிவிப்புகளை ஆஃப் செய்ய முடியாது"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"இந்த ஆப்ஸானது கேமராவை உபயோகிக்கிறது."</string>
<string name="appops_microphone" msgid="741508267659494555">"இந்த ஆப்ஸானது, மைக்ரோஃபோனை உபயோகிக்கிறது."</string>
<string name="appops_overlay" msgid="6165912637560323464">"இந்த ஆப்ஸானது, உங்கள் திரையில் பிற ஆப்ஸின் இடைமுகத்தின் மேல் தோன்றுகிறது."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"சார்ஜ் செய்யும் போது சதவீதத்தைக் காட்டு (இயல்பு)"</item>
<item msgid="3327323682209964956">"இந்த ஐகானைக் காட்டாதே"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"மற்றவை"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"திரையைப் பிரிக்கும் பிரிப்பான்"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"இடது புறம் முழுத் திரை"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index a6d769937fa9..b895ae69bf09 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"సిస్టమ్ UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"క్లియర్ చేయండి"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"జాబితా నుండి తీసివేయండి"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"యాప్ సమాచారం"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"మీ ఇటీవలి స్క్రీన్‌లు ఇక్కడ కనిపిస్తాయి"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ఇటీవలి అనువర్తనాలను తీసివేయండి"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">స్థూలదృష్టిలో %d స్క్రీన్‌లు ఉన్నాయి</item>
- <item quantity="one">స్థూలదృష్టిలో 1 స్క్రీన్ ఉంది</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"నోటిఫికేషన్‌లు లేవు"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"కొనసాగుతున్నవి"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"నోటిఫికేషన్‌లు"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"ఫోన్‌ను తెరువు"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"వాయిస్ అసిస్టెంట్‌ను తెరువు"</string>
<string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్‌ను ఎంచుకోండి"</string>
<string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"సహాయ సందేశ ప్రాంతం"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"నిర్ధారించు"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ని తీసివేయండి."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> తీసివేయబడింది."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"అన్ని ఇటీవలి అనువర్తనాలు తీసివేయబడ్డాయి."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> అనువర్తన సమాచారాన్ని తెరుస్తుంది."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>ని ప్రారంభిస్తోంది."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"నోటిఫికేషన్ తీసివేయబడింది."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"నోటిఫికేషన్ షేడ్."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"శీఘ్ర సెట్టింగ్‌లు."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC నిలిపివేయబడింది"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ప్రారంభించబడింది"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ఇటీవలి అంశాలు ఏవీ లేవు"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"మీరు అన్నింటినీ తీసివేసారు"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"అనువర్తన సమాచారం"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"స్క్రీన్ పిన్నింగ్"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"వెతుకు"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ని ప్రారంభించడం సాధ్యపడలేదు."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> సురక్షిత-మోడ్‌లో నిలిపివేయబడింది."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"అన్నీ తీసివేయి"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"విభజన స్క్రీన్‌ను ఉపయోగించడానికి ఇక్కడ లాగండి"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"యాప్‌లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపుకు లాగండి"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"సమతలంగా విభజించు"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"లంబంగా విభజించు"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"అనుకూలంగా విభజించు"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"స్క్రీన్‌ని ఎగువకు విభజించు"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"స్క్రీన్‌ని ఎడమ వైపుకి విభజించు"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"స్క్రీన్‌ని కుడి వైపుకి విభజించు"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"స్థూలదృష్టిని టోగుల్ చేయి"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ఛార్జ్ చేయబడింది"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ఛార్జ్ అవుతోంది"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"కుదించు"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ఈ నోటిఫికేషన్‌లను ఆఫ్ చేయలేరు"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"ఈ యాప్ ఈ కెమెరాను ఉపయోగిస్తోంది."</string>
<string name="appops_microphone" msgid="741508267659494555">"ఈ యాప్ మైక్రోఫోన్‌ను ఉపయోగిస్తుంది."</string>
<string name="appops_overlay" msgid="6165912637560323464">"ఈ యాప్ మీ స్క్రీన్‌లోని ఇతర యాప్‌లపై ప్రదర్శించబడుతోంది."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"ఛార్జ్ అవుతున్నప్పుడు శాతాన్ని చూపు (డిఫాల్ట్)"</item>
<item msgid="3327323682209964956">"ఈ చిహ్నాన్ని చూపవద్దు"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"ఇతరం"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"విభజన స్క్రీన్ విభాగిని"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"ఎడమవైపు పూర్తి స్క్రీన్"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8c786874dad3..4df01edb8112 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"ส่วนติดต่อผู้ใช้ของระบบ"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"ล้างข้อมูล"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ลบจากรายการ"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ข้อมูลแอปพลิเคชัน"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"หน้าจอล่าสุดของคุณแสดงที่นี่"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ปิดแอปพลิเคชันล่าสุด"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d หน้าจอในภาพรวม</item>
- <item quantity="one">1 หน้าจอในภาพรวม</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"เปิดโทรศัพท์"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"เปิดตัวช่วยเสียง"</string>
<string name="camera_label" msgid="7261107956054836961">"เปิดกล้อง"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"เลือกรูปแบบงานใหม่"</string>
<string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"พื้นที่ข้อความช่วยเหลือ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"ยืนยัน"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"ยกเลิก <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ถูกลบไปแล้ว"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ปิดแอปพลิเคชันล่าสุดทั้งหมดแล้ว"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"เปิดข้อมูลแอปพลิเคชัน <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"กำลังเริ่มต้น <xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"ปิดการแจ้งเตือนแล้ว"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"หน้าต่างแจ้งเตือน"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"การตั้งค่าด่วน"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ถูกปิดใช้งาน"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"เปิดใช้งาน NFC แล้ว"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"ไม่มีรายการล่าสุด"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"คุณได้ล้างทุกอย่างแล้ว"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ข้อมูลแอปพลิเคชัน"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"การตรึงหน้าจอ"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ค้นหา"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"ไม่สามารถเริ่มใช้ <xliff:g id="APP">%s</xliff:g>"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ปิดใช้ในโหมดปลอดภัย"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ล้างทั้งหมด"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"ลากมาที่นี่เพื่อใช้การแยกหน้าจอ"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"เลื่อนขึ้นเพื่อสลับแอป"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"ลากไปทางขวาเพื่อสลับแอปอย่างรวดเร็ว"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"แยกในแนวนอน"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"แยกในแนวตั้ง"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"แยกแบบกำหนดเอง"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"แยกหน้าจอไปด้านบน"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"แยกหน้าจอไปทางซ้าย"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"แยกหน้าจอไปทางขวา"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"สลับภาพรวม"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ชาร์จแล้ว"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"กำลังชาร์จ"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"ย่อเล็กสุด"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ปิดการแจ้งเตือนเหล่านี้ไม่ได้"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"แอปนี้กำลังใช้กล้อง"</string>
<string name="appops_microphone" msgid="741508267659494555">"แอปนี้กำลังใช้ไมโครโฟน"</string>
<string name="appops_overlay" msgid="6165912637560323464">"แอปนี้กำลังแสดงทับแอปอื่นๆ ในหน้าจอ"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"แสดงเปอร์เซ็นต์เมื่อชาร์จ (ค่าเริ่มต้น)"</item>
<item msgid="3327323682209964956">"อย่าแสดงไอคอนนี้"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"อื่นๆ"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"เส้นแบ่งหน้าจอ"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"เต็มหน้าจอทางซ้าย"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 21cf1f2637eb..71a26acd2348 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI ng System"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"I-clear"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Alisin mula sa listahan"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Impormasyon ng app"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Lumalabas dito ang iyong kamakailang screen"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Huwag pansinin ang kamakailang apps"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d screen sa Pangkalahatang-ideya</item>
- <item quantity="other">%d na screen sa Pangkalahatang-ideya</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"buksan ang telepono"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"buksan ang voice assist"</string>
<string name="camera_label" msgid="7261107956054836961">"buksan ang camera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Pumili ng bagong layout ng gawain"</string>
<string name="cancel" msgid="6442560571259935130">"Kanselahin"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Lugar ng mensahe ng tulong"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kumpirmahin"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"I-dismiss ang <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Hindi pinansin ang <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Na-dismiss ang lahat ng kamakailang application."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Buksan ang impormasyon ng <xliff:g id="APP">%s</xliff:g> application."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Sinisimulan ang <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Na-dismiss ang notification."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mga mabilisang setting."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"Naka-disable ang NFC"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"Naka-enable ang NFC"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Walang kamakailang item"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Na-clear mo ang lahat"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Impormasyon ng Application"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"pagpi-pin sa screen"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"maghanap"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Hindi masimulan <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Naka-disable ang <xliff:g id="APP">%s</xliff:g> sa safe-mode."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"I-clear lahat"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"I-drag dito upang magamit ang split screen"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Mag-swipe pataas upang lumipat ng app"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"I-drag pakanan para mabilisang magpalipat-lipat ng app"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"I-split ang screen pataas"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"I-split ang screen pakaliwa"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"I-split ang screen pakanan"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"I-toggle ang Overview"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nasingil na"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nagcha-charge"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"I-minimize"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Patuloy na ipakita ang mga notification mula sa app na ito?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Hindi maaaring i-off ang mga notification na ito"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ginagamit ng app na ito ang camera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ginagamit ng app na ito ang mikropono."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ipinapakita ang app na ito sa ibabaw ng iba pang app sa iyong screen."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Ipakita ang porsyento kapag nagcha-charge (default)"</item>
<item msgid="3327323682209964956">"Huwag ipakita ang icon na ito"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Iba pa"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Divider ng split-screen"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"I-full screen ang nasa kaliwa"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index fb200ecf120c..b3809c416355 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Sist Arayüzü"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Listeden kaldır"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Uygulama bilgileri"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Son ekranlarınız burada görünür"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Son uygulamaları kapat"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">Genel Bakış\'ta %d ekran</item>
- <item quantity="one">Genel Bakış\'ta 1 ekran</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildirim yok"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sürüyor"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Bildirimler"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"telefonu aç"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"sesli yardımı aç"</string>
<string name="camera_label" msgid="7261107956054836961">"kamerayı aç"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni görev düzenini seçin"</string>
<string name="cancel" msgid="6442560571259935130">"İptal"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı alanı"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Onaylayın"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> uygulamasını kapat."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> kaldırıldı."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tüm son uygulamalar kapatıldı."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> uygulaması bilgilerini açın."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> başlatılıyor."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildirim kapatıldı."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildirim gölgesi."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hızlı ayarlar."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC devre dışı"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC etkin"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Yeni öğe yok"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Her şeyi sildiniz"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Uygulama Bilgileri"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekran sabitleme"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"ara"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> başlatılamadı."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>, güvenli modda devre dışıdır."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tümünü temizle"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölünmüş olarak kullanmak için burayı sürükleyin"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Uygulamaları hızlıca değiştirmek için sağa kaydırın"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Yatay Ayırma"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dikey Ayırma"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Özel Ayırma"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Ekranı yukarıya doğru böl"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Ekranı sola doğru böl"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Ekranı sağa doğru böl"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Genel bakışı aç/kapat"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Şarj oldu"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Şarj oluyor"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Küçült"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirimler kapatılamaz"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Bu uygulama kamerayı kullanıyor."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu uygulama mikrofonu kullanıyor."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu uygulama, ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Şarj olurken yüzdeyi göster (varsayılan)"</item>
<item msgid="3327323682209964956">"Bu simgeyi gösterme"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Diğer"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Bölünmüş ekran ayırıcı"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Solda tam ekran"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 82b56a2fd4c2..a52ec2a211c2 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -21,16 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Інтерфейс системи"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очист."</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Видалити зі списку"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Про додаток"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ваші останні екрани відображаються тут"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Відхилити останні програми"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">На панелі огляду %d екран</item>
- <item quantity="few">На панелі огляду %d екрани</item>
- <item quantity="many">На панелі огляду %d екранів</item>
- <item quantity="other">На панелі огляду %d екрана</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Сповіщення"</string>
@@ -103,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"відкрити телефон"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"запустити голосові підказки"</string>
<string name="camera_label" msgid="7261107956054836961">"відкрити камеру"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string>
<string name="cancel" msgid="6442560571259935130">"Скасувати"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Область довідкового повідомлення"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Підтвердити"</string>
@@ -190,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Видалити додаток <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Програму <xliff:g id="APP">%s</xliff:g> закрито."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Усі останні додатки закрито."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Відкрити інформацію про додаток <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Запуск додатка <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Сповіщення відхилено."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Панель сповіщень."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Швидке налаштування."</string>
@@ -361,23 +345,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC вимкнено"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ввімкнено"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Немає нещодавніх завдань"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Ви очистили все"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Інформація про додаток"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"закріпити екран"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"пошук"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Не вдалося запустити <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Додаток <xliff:g id="APP">%s</xliff:g> вимкнено в безпечному режимі."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистити все"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетягніть сюди, щоб увімкнути режим розділеного екрана"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Проводьте пальцем угору, щоб переходити між додатками"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Перетягуйте праворуч, щоб швидко переходити між додатками"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Розділити горизонтально"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Розділити вертикально"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Розділити (власний варіант)"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Розділити екран угорі"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Розділити екран ліворуч"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Розділити екран праворуч"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Увімкнути або вимкнути огляд"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заряджено"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Заряджається"</string>
@@ -626,6 +595,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Згорнути"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Чи показувати сповіщення з цього додатка надалі?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Ці сповіщення не можна вимкнути"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Цей додаток використовує камеру."</string>
<string name="appops_microphone" msgid="741508267659494555">"Цей додаток використовує мікрофон."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Цей додаток відображається поверх інших додатків на екрані."</string>
@@ -764,6 +735,8 @@
<item msgid="2139628951880142927">"Показувати відсотки під час заряджання (за умовчанням)"</item>
<item msgid="3327323682209964956">"Не показувати цей значок"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Інше"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Розділювач екрана"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Ліве вікно на весь екран"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index b02ceae289e0..eb0c60b2d550 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"‏سسٹم UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"صاف کریں"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"فہرست سے ہٹائیں"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ایپ کی معلومات"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"آپ کی حالیہ اسکرینز یہاں ظاہر ہوتی ہیں"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"حالیہ ایپس برخاست کریں"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">‏عمومی جائزہ میں ‎%d اسکرینز</item>
- <item quantity="one">عمومی جائزہ میں 1 اسکرین</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"کوئی اطلاعات نہیں ہیں"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"جاری"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اطلاعات"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"فون کھولیں"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"صوتی معاون کھولیں"</string>
<string name="camera_label" msgid="7261107956054836961">"کیمرا کھولیں"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string>
<string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"امدادی پیغام کا علاقہ"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"تصدیق کریں"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> کو مسترد کریں۔"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> کو ہٹا دیا گیا۔"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"سبھی حالیہ ایپلیکیشنز کو برخاست کر دیا گیا۔"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ایپلیکیشن معلومات کھولیں۔"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> شروع ہو رہی ہے۔"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"اطلاع مسترد ہوگئی۔"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"اطلاعاتی شیڈ۔"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"فوری ترتیبات۔"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"‏NFC غیر فعال ہے"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"‏NFC فعال ہے"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"کوئی حالیہ آئٹم نہیں"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"آپ نے سب کچھ صاف کر دیا ہے"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"ایپلیکیشن کی معلومات"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"اسکرین کو پن کرنا"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"تلاش کریں"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> کو شروع نہیں کیا جا سکا۔"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"محفوظ موڈ میں <xliff:g id="APP">%s</xliff:g> غیر فعال ہوتی ہے۔"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"سبھی کو صاف کریں"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"اسپلٹ اسکرین استعمال کرنے کیلئے یہاں گھسیٹیں"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"تیزی سے ایپس کو سوئچ کرنے کے لیے دائیں طرف گھسیٹیں"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"بلحاظ افقی الگ کریں"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"بلحاظ عمودی الگ کریں"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"بلحاظ حسب ضرورت الگ کریں"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"اسکرین کو اوپر کی جانب تقسیم کریں"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"اسکرین کو بائیں جانب تقسیم کریں"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"اسکرین کو دائیں جانب تقسیم کریں"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"مجموعی جائزہ ٹوگل کریں"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"چارج ہوگئی"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"چارج ہو رہی ہے"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"چھوٹا کریں"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"ان اطلاعات کو آف نہیں کیا جا سکتا"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"یہ ایپ کیمرے کا استعمال کر رہی ہے۔"</string>
<string name="appops_microphone" msgid="741508267659494555">"یہ ایپ مائیکروفون کا استعمال کر رہی ہے۔"</string>
<string name="appops_overlay" msgid="6165912637560323464">"یہ ایپ آپ کی اسکرین پر دیگر ایپس پر ڈسپلے کر رہی ہے۔"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"چارج ہوتے وقت فیصد دکھائیں (ڈیفالٹ)"</item>
<item msgid="3327323682209964956">"یہ آئیکن نہ دکھائیں"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"دیگر"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"سپلٹ اسکرین تقسیم کار"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"بائیں فل اسکرین"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index a128e7ff21fc..e7c33001e455 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI tizimi"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Tozalash"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Ro‘yxatdan o‘chirish"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ilova haqida"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Yaqinda ish-gan ilovalar bu yerda ko‘rinadi"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"So‘nggi dasturlarni tozalash"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">Umumiy ma’lumot bo‘limida %d ta ekran bor</item>
- <item quantity="one">Umumiy ma’lumot bo‘limida 1 ta ekran bor</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Bildirishnomalar yo‘q"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Hali bajarilmagan"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Eslatmalar"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"telefonni ochish"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"ovozli yordamni yoqish"</string>
<string name="camera_label" msgid="7261107956054836961">"kamerani ochish"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Yangi vazifa tartibini tanlash"</string>
<string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yordam xabari"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"OK"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Olib tashlash: <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> olib tashlangan."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Yaqinda ishlatilgan barcha ilovalar olib tashlandi."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"<xliff:g id="APP">%s</xliff:g> ilovasi haqidagi ma’lumotlarni ochadi."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ishga tushirilmoqda."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Xabarnoma e‘tiborsiz qoldirildi."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Xabarnoma soyasi."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tezkor sozlamalar."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC o‘chiq"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC yoniq"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Hozircha hech narsa yo‘q"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Hammasi o‘chirildi"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Ilova haqida ma’lumot"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekranni mahkamlash"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"qidirish"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"“<xliff:g id="APP">%s</xliff:g>” ilovasini ishga tushirib bo‘lmadi."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Xavfsiz rejimda <xliff:g id="APP">%s</xliff:g> ilovasi o‘chirib qo‘yildi."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hammasini tozalash"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranni bo‘lish xususiyatidan foydalanish uchun bu yerga torting"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Ilovalarni almashtirish uchun ekranni tepaga suring"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Ilovalarni tezkor almashtirish uchun o‘ngga torting"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gorizontal yo‘nalishda bo‘lish"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikal yo‘nalishda bo‘lish"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Boshqa usulda bo‘lish"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Ekranni tepaga qadash"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Ekranni chap tomonga qadash"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Ekranni o‘ng tomonga qadash"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Umumiy nazar rejimini almashtirish"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Batareya quvvati to‘ldi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Quvvat olmoqda"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Kichraytirish"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu ilovadan keladigan bildirishnomalar chiqaversinmi?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirishnomalarni chiqmaydigan qilish imkonsiz"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Bu ilova kameradan foydalanmoqda."</string>
<string name="appops_microphone" msgid="741508267659494555">"Bu ilova mikrofondan foydalanmoqda."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Bu ilova ekranda boshqa ilovalar ustidan ochilgan."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Quvvat olayotganda foizda ko‘rsatilsin (birlamchi)"</item>
<item msgid="3327323682209964956">"Bu belgi boshqa ko‘rsatilmasin"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Boshqa"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Ekranni ikkiga bo‘lish chizig‘i"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Chapda to‘liq ekran"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index c7b9178a3f83..4356ac5cf758 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Giao diện người dùng hệ thống"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Xóa"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Xóa khỏi danh sách"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Thông tin ứng dụng"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Màn hình gần đây của bạn sẽ xuất hiện tại đây"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loại bỏ các ứng dụng gần đây"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">%d màn hình trong Tổng quan</item>
- <item quantity="one">1 màn hình trong Tổng quan</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"mở điện thoại"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"mở trợ lý thoại"</string>
<string name="camera_label" msgid="7261107956054836961">"mở máy ảnh"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Chọn bố cục tác vụ mới"</string>
<string name="cancel" msgid="6442560571259935130">"Hủy"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Vùng thông báo trợ giúp"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Xác nhận"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Xóa bỏ <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> đã bị loại bỏ."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Đã bỏ qua tất cả các ứng dụng gần đây."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Mở thông tin ứng dụng <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Bắt đầu <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Đã loại bỏ thông báo."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bóng thông báo."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Cài đặt nhanh."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC đã được tắt"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC đã được bật"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Không có mục gần đây nào"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Bạn đã xóa mọi nội dung"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Thông tin ứng dụng"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"khóa màn hình"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"tìm kiếm"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Không thể khởi động <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> bị tắt ở chế độ an toàn."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Xóa tất cả"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Kéo vào đây để sử dụng chế độ chia đôi màn hình"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Vuốt lên để chuyển đổi ứng dụng"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Kéo sang phải để chuyển đổi nhanh giữa các ứng dụng"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Phân tách ngang"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Phân tách dọc"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tùy chỉnh phân tách"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Chia đôi màn hình lên trên"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Chia đôi màn hình sang trái"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Chia đôi màn hình sang phải"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Bật/tắt chế độ xem Tổng quan"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Đã sạc đầy"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Đang sạc"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Thu nhỏ"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Tiếp tục hiển thị các thông báo từ ứng dụng này?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Không thể tắt các thông báo này"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Ứng dụng này đang sử dụng máy ảnh."</string>
<string name="appops_microphone" msgid="741508267659494555">"Ứng dụng này đang sử dụng micrô."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Ứng dụng này đang hiển thị chồng lên các ứng dụng khác trên màn hình."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Hiển thị phần trăm khi sạc (mặc định)"</item>
<item msgid="3327323682209964956">"Không hiển thị biểu tượng này"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Khác"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Bộ chia chia đôi màn hình"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Toàn màn hình bên trái"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 0bfcdcfdfedd..542426656427 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"系统界面"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"从列表中删除"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"应用信息"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近浏览过的屏幕会显示在此处"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"关闭最近运行的应用"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">概览中有 %d 个屏幕</item>
- <item quantity="one">概览中有 1 个屏幕</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"打开电话"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"打开语音助理"</string>
<string name="camera_label" msgid="7261107956054836961">"打开相机"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"选择新的任务布局"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"帮助消息区域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"确认"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"移除<xliff:g id="APP">%s</xliff:g>。"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"已删除<xliff:g id="APP">%s</xliff:g>"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"已关闭所有最近用过的应用。"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"打开<xliff:g id="APP">%s</xliff:g>应用信息。"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在启动<xliff:g id="APP">%s</xliff:g>。"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"已关闭通知。"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知栏。"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快捷设置。"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已启用"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"近期没有任何内容"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"您已清除所有内容"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"应用信息"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"固定屏幕"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"搜索"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"无法启动<xliff:g id="APP">%s</xliff:g>。"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>已在安全模式下停用。"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"拖动到此处即可使用分屏功能"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑动可切换应用"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"向右拖动可快速切换应用"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自定义分割"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"将屏幕分隔线移到上方"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"将屏幕分隔线移到左侧"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"将屏幕分隔线移到右侧"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"切换概览"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已充满"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"正在充电"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要继续显示来自此应用的通知吗?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"无法关闭这些通知"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"此应用正在使用摄像头。"</string>
<string name="appops_microphone" msgid="741508267659494555">"此应用正在使用麦克风。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"此应用正显示在屏幕上其他应用的上层。"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"充电时显示百分比(默认)"</item>
<item msgid="3327323682209964956">"不显示此图标"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"其他"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"分屏分隔线"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"左侧全屏"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index cf93802ba8a4..38e8b3cdb911 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"系統使用者介面"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資料"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近的螢幕顯示在這裡"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程式"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">概覽中有 %d 個畫面</item>
- <item quantity="one">概覽中有 1 個畫面</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"無通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"持續進行"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"開啟電話"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"開啟語音助手"</string>
<string name="camera_label" msgid="7261107956054836961">"開啟相機"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"選取新的工作版面配置"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"所有最近使用的應用程式均已關閉。"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"開啟「<xliff:g id="APP">%s</xliff:g>」應用程式的資料。"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"通知已關閉。"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知欄。"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快速設定。"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"沒有最近項目"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"您已清除所有項目"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資料"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"螢幕固定"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」已在安全模式中停用。"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"在這裡拖曳即可分割螢幕"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑動即可切換應用程式"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"向右拖曳即可快速切換應用程式"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"將分割畫面顯示喺頂部"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"將分割畫面顯示喺左邊"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"將分割畫面顯示喺右邊"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"切換概覽"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已完成充電"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示此應用程式的通知嗎?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"此應用程式目前使用相機。"</string>
<string name="appops_microphone" msgid="741508267659494555">"此應用程式目前使用麥克風。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"此應用程式目前透過其他應用程式在畫面上顯示內容。"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"充電時顯示百分比 (預設)"</item>
<item msgid="3327323682209964956">"不顯示這個圖示"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"其他"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"分割畫面分隔線"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"左邊全螢幕"</string>
@@ -826,7 +801,7 @@
<string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string>
<string name="notification_channel_hints" msgid="7323870212489152689">"提示"</string>
- <string name="instant_apps" msgid="6647570248119804907">"即時應用程式"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"免安裝應用程式"</string>
<string name="instant_apps_title" msgid="8738419517367449783">"<xliff:g id="APP">%1$s</xliff:g> 運作中"</string>
<string name="instant_apps_message" msgid="1183313016396018086">"已開啟免安裝應用程式。"</string>
<string name="instant_apps_message_with_help" msgid="6179830437630729747">"已開啟免安裝應用程式。輕按即可瞭解詳情。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index c5a2f9091c9a..e399c44612fa 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"系統 UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"從清單中移除"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"你最近的螢幕會顯示在這裡"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程式"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="other">總覽中有 %d 個畫面</item>
- <item quantity="one">總覽中有 1 個畫面</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"沒有通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"開啟電話"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"開啟語音小幫手"</string>
<string name="camera_label" msgid="7261107956054836961">"開啟攝影機"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"關閉「<xliff:g id="APP">%s</xliff:g>」。"</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近使用的應用程式已全部關閉。"</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"開啟「<xliff:g id="APP">%s</xliff:g>」應用程式資訊。"</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"已關閉通知。"</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"通知欄。"</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快捷設定。"</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"最近沒有任何項目"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"你已清除所有工作"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資訊"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"螢幕固定"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」在安全模式中為停用狀態。"</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"拖曳到這裡即可使用分割畫面"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑動即可切換應用程式"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"向右拖曳即可快速切換應用程式"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"將分割畫面顯示在頂端"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"將分割畫面顯示在左邊"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"將分割畫面顯示在右邊"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"切換總覽"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已充飽"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示這個應用程式的通知嗎?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"這個應用程式正在使用相機。"</string>
<string name="appops_microphone" msgid="741508267659494555">"這個應用程式正在使用麥克風。"</string>
<string name="appops_overlay" msgid="6165912637560323464">"這個應用程式顯示在畫面上其他應用程式的上層。"</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"充電時顯示百分比 (預設)"</item>
<item msgid="3327323682209964956">"不顯示這個圖示"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"其他"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"分割畫面分隔線"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"以全螢幕顯示左側畫面"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 2fc207a5e699..3887f14e91f0 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -21,14 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"Uhlelo lwe-UI"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Sula"</string>
- <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Susa ohlwini"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ulwazi lwensiza"</string>
- <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Izikrini zakho zakamuva zivela lapha"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Susa izinhlelo zokusebenza zakamumva"</string>
- <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
- <item quantity="one">%d izikrini eziku-Buka konke</item>
- <item quantity="other">%d izikrini eziku-Buka konke</item>
- </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Azikho izaziso"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Izaziso"</string>
@@ -101,7 +93,6 @@
<string name="phone_label" msgid="2320074140205331708">"vula ifoni"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"vula isilekeleli sezwi"</string>
<string name="camera_label" msgid="7261107956054836961">"vula ikhamera"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Khetha isakhiwo somsebenzi omusha"</string>
<string name="cancel" msgid="6442560571259935130">"Khansela"</string>
<string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Indawo yosizo lomlayezo"</string>
<string name="biometric_dialog_confirm" msgid="6468457350041712674">"Qinisekisa"</string>
@@ -188,11 +179,6 @@
<skip />
<!-- no translation found for accessibility_work_mode (702887484664647430) -->
<skip />
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Cashisa i-<xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ivaliwe."</string>
- <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Zonke izinhlelo zokusebenza zakamuva zicashisiwe."</string>
- <string name="accessibility_recents_item_open_app_info" msgid="5107479759905883540">"Vula ulwazi lohlelo lokusebenza le-<xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iqala i-<xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Isaziso sichithiwe."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Umthunzi wesaziso."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Izilingiselelo ezisheshayo."</string>
@@ -355,23 +341,8 @@
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"I-NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"I-NFC ikhutshaziwe"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"I-NFC inikwe amandla"</string>
- <string name="recents_empty_message" msgid="808480104164008572">"Azikho izinto zakamuva"</string>
- <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Usule yonke into"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Ulwazi lohlelo lokusebenza"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ukuphina isikrini"</string>
- <string name="recents_search_bar_label" msgid="8074997400187836677">"sesha"</string>
- <string name="recents_launch_error_message" msgid="2969287838120550506">"Ayikwazanga ukuqala i-<xliff:g id="APP">%s</xliff:g>."</string>
- <string name="recents_launch_disabled_message" msgid="1624523193008871793">"I-<xliff:g id="APP">%s</xliff:g> ikhutshaziwe kumodi yokuphepha."</string>
- <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Sula konke"</string>
- <string name="recents_drag_hint_message" msgid="2649739267073203985">"Hudulela lapha ukuze usebenzise ukuhlukanisa kwesikrini"</string>
<string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza"</string>
<string name="recents_quick_scrub_onboarding" msgid="2778062804333285789">"Hudula ngqo ukuze ushintshe ngokushesha izinhlelo zokusebenza"</string>
- <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Hlukanisa okuvundlile"</string>
- <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Hlukanisa okumile"</string>
- <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Hlukanisa kwezifiso"</string>
- <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"Hlukanisela isikrini phezulu"</string>
- <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"Hlukanisela isikrini ngakwesokunxele"</string>
- <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Hlukanisela isikrini ngakwesokudla"</string>
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Guqula ukubuka konke"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kushajiwe"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Iyashaja"</string>
@@ -618,6 +589,8 @@
<string name="inline_minimize_button" msgid="966233327974702195">"Nciphisa"</string>
<string name="inline_keep_showing_app" msgid="1723113469580031041">"Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?"</string>
<string name="notification_unblockable_desc" msgid="1037434112919403708">"Lezi zaziso azikwazi ukuvalwa"</string>
+ <!-- no translation found for notification_delegate_header (9167022191405284627) -->
+ <skip />
<string name="appops_camera" msgid="8100147441602585776">"Lolu hlelo lokusebenza lusebenzisa ikhamera."</string>
<string name="appops_microphone" msgid="741508267659494555">"Lolu hlelo lokusebenza lusebenzisa imakrofoni."</string>
<string name="appops_overlay" msgid="6165912637560323464">"Lolu hlelo lokusebenza luboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho."</string>
@@ -752,6 +725,8 @@
<item msgid="2139628951880142927">"Bonisa iphesentheji uma ishaja (okuzenzakalelayo)"</item>
<item msgid="3327323682209964956">"Ungabonisi lesi sithonjana"</item>
</string-array>
+ <!-- no translation found for tuner_low_priority (1325884786608312358) -->
+ <skip />
<string name="other" msgid="4060683095962566764">"Okunye"</string>
<string name="accessibility_divider" msgid="5903423481953635044">"Isihlukanisi sokuhlukanisa isikrini"</string>
<string name="accessibility_action_divider_left_full" msgid="2801570521881574972">"Isikrini esigcwele esingakwesokunxele"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 0027cc606bad..b3567f892c44 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -129,12 +129,7 @@
<color name="smart_reply_button_stroke">#ffdadce0</color>
<!-- Biometric dialog colors -->
- <color name="biometric_dialog_bg_color">#ffffffff</color> <!-- 100% white -->
- <color name="biometric_dialog_text_dark_color">#dd000000</color> <!-- 87% black -->
- <color name="biometric_dialog_text_light_color">#89000000</color> <!-- 54% black -->
<color name="biometric_dialog_dim_color">#80000000</color> <!-- 50% black -->
- <color name="biometric_dialog_error_color">#fff44336</color> <!-- red -->
- <color name="biometric_dialog_biometric_color">#ff008577</color> <!-- teal -->
<!-- Logout button -->
<color name="logout_button_bg_color">#ccffffff</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 9fe771868568..525421a6870a 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -844,7 +844,7 @@
<dimen name="burn_in_prevention_offset_y">50dp</dimen>
<!-- The maximum offset in either direction that icons move to prevent burn-in on AOD. -->
- <dimen name="default_burn_in_prevention_offset">5dp</dimen>
+ <dimen name="default_burn_in_prevention_offset">15dp</dimen>
<dimen name="corner_size">8dp</dimen>
<dimen name="top_padding">0dp</dimen>
@@ -932,4 +932,19 @@
<!-- How much we expand the touchable region of the status bar below the notch to catch touches
that just start below the notch. -->
<dimen name="display_cutout_touchable_region_size">12dp</dimen>
+
+ <!-- Height of icons in Ongoing App Ops dialog. Both App Op icon and application icon -->
+ <dimen name="ongoing_appops_dialog_icon_height">48dp</dimen>
+ <!-- Margin between text lines in Ongoing App Ops dialog -->
+ <dimen name="ongoing_appops_dialog_text_margin">15dp</dimen>
+ <!-- Padding around Ongoing App Ops dialog content -->
+ <dimen name="ongoing_appops_dialog_content_padding">24dp</dimen>
+ <!-- Margins around the Ongoing App Ops chip. In landscape, the side margins are 0 -->
+ <dimen name="ongoing_appops_chip_margin">12dp</dimen>
+ <!-- Start and End padding for Ongoing App Ops chip -->
+ <dimen name="ongoing_appops_chip_side_padding">6dp</dimen>
+ <!-- Padding between background of Ongoing App Ops chip and content -->
+ <dimen name="ongoing_appops_chip_bg_padding">4dp</dimen>
+ <!-- Radius of Ongoing App Ops chip corners -->
+ <dimen name="ongoing_appops_chip_bg_corner_radius">12dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 0cf7306cbe4b..7d09c0079ae8 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -185,6 +185,39 @@
<string name="screenshot_failed_to_capture_text">Taking screenshots isn\'t allowed by the app or
your organization</string>
+ <!-- Notification title displayed for screen recording [CHAR LIMIT=50]-->
+ <string name="screenrecord_name">Screen Recording</string>
+ <!-- Description of the screen recording notification channel [CHAR LIMIT=NONE]-->
+ <string name="screenrecord_channel_description">Ongoing notification for a screen record session</string>
+ <!-- Label for the button to begin screen recording [CHAR LIMIT=NONE]-->
+ <string name="screenrecord_start_label">Start Recording</string>
+ <!-- Label for the checkbox to enable microphone input during screen recording [CHAR LIMIT=NONE]-->
+ <string name="screenrecord_mic_label">Record voiceover</string>
+ <!-- Label for the checkbox to enable showing location of touches during screen recording [CHAR LIMIT=NONE]-->
+ <string name="screenrecord_taps_label">Show taps</string>
+ <!-- Label for notification action to stop and save the screen recording [CHAR LIMIT=35] -->
+ <string name="screenrecord_stop_label">Stop</string>
+ <!-- Label for notification action to pause screen recording [CHAR LIMIT=35] -->
+ <string name="screenrecord_pause_label">Pause</string>
+ <!-- Label for notification action to resume screen recording [CHAR LIMIT=35] -->
+ <string name="screenrecord_resume_label">Resume</string>
+ <!-- Label for notification action to cancel and discard screen recording [CHAR LIMIT=35] -->
+ <string name="screenrecord_cancel_label">Cancel</string>
+ <!-- Label for notification action to share screen recording [CHAR LIMIT=35] -->
+ <string name="screenrecord_share_label">Share</string>
+ <!-- Label for notification action to delete a screen recording file [CHAR LIMIT=35] -->
+ <string name="screenrecord_delete_label">Delete</string>
+ <!-- A toast message shown after successfully canceling a screen recording [CHAR LIMIT=NONE] -->
+ <string name="screenrecord_cancel_success">Screen recording canceled</string>
+ <!-- Notification text shown after saving a screen recording to prompt the user to view it [CHAR LIMIT=100] -->
+ <string name="screenrecord_save_message">Screen recording saved, tap to view</string>
+ <!-- A toast message shown after successfully deleting a screen recording [CHAR LIMIT=NONE] -->
+ <string name="screenrecord_delete_description">Screen recording deleted</string>
+ <!-- A toast message shown when there is an error deleting a screen recording [CHAR LIMIT=NONE] -->
+ <string name="screenrecord_delete_error">Error deleting screen recording</string>
+ <!-- A toast message shown when the screen recording cannot be started due to insufficient permissions [CHAR LIMIT=NONE] -->
+ <string name="screenrecord_permission_error">Failed to get permissions</string>
+
<!-- Title for the USB function chooser in UsbPreferenceActivity. [CHAR LIMIT=30] -->
<string name="usb_preference_title">USB file transfer options</string>
<!-- Label for the MTP USB function in UsbPreferenceActivity. [CHAR LIMIT=50] -->
@@ -1529,9 +1562,6 @@
<!-- Notification: Control panel: Label that displays when the app's notifications cannot be blocked. -->
<string name="notification_unblockable_desc">These notifications can\'t be turned off</string>
- <!-- Notification: Control panel: Label for the app that posted this notification, if it's not the package that the notification was posted for -->
- <string name="notification_delegate_header">via <xliff:g id="app_name" example="YouTube">%1$s</xliff:g></string>
-
<!-- Notification Inline controls: describes what the app is doing in the background [CHAR_LIMIT=NONE] -->
<string name="appops_camera">This app is using the camera.</string>
<!-- Notification Inline controls: describes what the app is doing in the background [CHAR_LIMIT=NONE] -->
@@ -2208,4 +2238,39 @@
app for debugging. Will not be seen by users. [CHAR LIMIT=20] -->
<string name="heap_dump_tile_name">Dump SysUI Heap</string>
+ <!-- Content description for ongoing privacy chip. Use with a single app [CHAR LIMIT=NONE]-->
+ <string name="ongoing_privacy_chip_content_single_app"><xliff:g id="app" example="Example App">%1$s</xliff:g> is using your <xliff:g id="types_list" example="camera, location">%2$s</xliff:g>.</string>
+
+ <!-- Content description for ongoing privacy chip. Use with multiple apps [CHAR LIMIT=NONE]-->
+ <string name="ongoing_privacy_chip_content_multiple_apps">Applications are using your <xliff:g id="types_list" example="camera, location">%s</xliff:g>.</string>
+
+ <!-- Action on Ongoing Privacy Dialog to open application [CHAR LIMIT=10]-->
+ <string name="ongoing_privacy_dialog_open_app">Open app</string>
+
+ <!-- Action on Ongoing Privacy Dialog to dismiss [CHAR LIMIT=10]-->
+ <string name="ongoing_privacy_dialog_cancel">Cancel</string>
+
+ <!-- Action on Ongoing Privacy Dialog to dismiss [CHAR LIMIT=10]-->
+ <string name="ongoing_privacy_dialog_okay">Okay</string>
+
+ <!-- Action on Ongoing Privacy Dialog to open privacy hub [CHAR LIMIT=10]-->
+ <string name="ongoing_privacy_dialog_open_settings">Settings</string>
+
+ <!-- Text for item in Ongoing Privacy Dialog when only one app is using a particular type of app op [CHAR LIMIT=NONE] -->
+ <string name="ongoing_privacy_dialog_app_item"><xliff:g id="app" example="Example App">%1$s</xliff:g> is using your <xliff:g id="type" example="camera">%2$s</xliff:g> for the last <xliff:g id="time" example="3">%3$d</xliff:g> min</string>
+
+ <!-- Text for item in Ongoing Privacy Dialog when only multiple apps are using a particular type of app op [CHAR LIMIT=NONE] -->
+ <string name="ongoing_privacy_dialog_apps_item"><xliff:g id="apps" example="Camera, Phone">%1$s</xliff:g> are using your <xliff:g id="type" example="camera">%2$s</xliff:g></string>
+
+ <!-- Text for Ongoing Privacy Dialog when a single app is using app ops [CHAR LIMIT=NONE] -->
+ <string name="ongoing_privacy_dialog_single_app"><xliff:g id="app" example="Example App">%1$s</xliff:g> is using your <xliff:g id="types_list" example="camera, location">%2$s</xliff:g></string>
+
+ <!-- Text for camera app op [CHAR LIMIT=12]-->
+ <string name="privacy_type_camera">camera</string>
+
+ <!-- Text for location app op [CHAR LIMIT=12]-->
+ <string name="privacy_type_location">location</string>
+
+ <!-- Text for microphone app op [CHAR LIMIT=12]-->
+ <string name="privacy_type_microphone">microphone</string>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 6bc2a6352e3d..6244e1c4a509 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -503,4 +503,13 @@
<item name="chargingAnimColor">@android:color/white</item>
<item name="android:textColor">@android:color/white</item>
</style>
+
+ <!-- Screen recording -->
+ <style name="ScreenRecord" parent="Theme.SystemUI.Dialog.GlobalActions">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowIsFloating">true</item>
+ <item name="android:backgroundDimEnabled">true</item>
+ <item name="android:windowCloseOnTouchOutside">true</item>
+ </style>
</resources>
diff --git a/packages/SystemUI/res/xml/fileprovider.xml b/packages/SystemUI/res/xml/fileprovider.xml
index 4aaa90fb5c53..fa6468fefe04 100644
--- a/packages/SystemUI/res/xml/fileprovider.xml
+++ b/packages/SystemUI/res/xml/fileprovider.xml
@@ -17,4 +17,5 @@
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="leak" path="leak/"/>
+ <external-path name="screenrecord" path="."/>
</paths> \ No newline at end of file
diff --git a/services/tests/wmtests/src/com/android/server/am/DummyAmTests.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/StatsLogCompat.java
index 023e4ab6636f..5bc1f2511411 100644
--- a/services/tests/wmtests/src/com/android/server/am/DummyAmTests.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/StatsLogCompat.java
@@ -14,33 +14,22 @@
* limitations under the License.
*/
-package com.android.server.am;
+package com.android.systemui.shared.system;
-import android.platform.test.annotations.Presubmit;
-
-import org.junit.Test;
-
-import androidx.test.filters.FlakyTest;
+import android.util.StatsLog;
/**
- * Dummy test for com.android.server.am.
- * TODO(b/113800711): Remove this class once the actual tests are moved from servicestests.
+ * Wrapper class to make StatsLog hidden API accessible.
*/
-public class DummyAmTests {
-
- @Presubmit
- @Test
- public void preSubmitTest() {}
-
- @FlakyTest
- @Presubmit
- @Test
- public void flakyPreSubmitTest() {}
-
- @Test
- public void postSubmitTest() {}
-
- @FlakyTest
- @Test
- public void flakyPostSubmitTest() {}
+public class StatsLogCompat {
+
+ /**
+ * StatsLog.write(StatsLog.LAUNCHER_EVENT, int action, int src_state, int dst_state,
+ * byte[] extension, boolean is_swipe_up_enabled);
+ */
+ public static void write(int action, int srcState, int dstState, byte [] extension,
+ boolean swipeUpEnabled) {
+ StatsLog.write(19, action, srcState, dstState, extension,
+ swipeUpEnabled);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 28eff46db1d0..013745aea409 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -16,6 +16,8 @@ import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.plugins.PluginManager;
+import java.util.Objects;
+
/**
* Switch to show plugin clock when plugin is connected, otherwise it will show default clock.
*/
@@ -35,6 +37,10 @@ public class KeyguardClockSwitch extends FrameLayout {
public void onPluginConnected(ClockPlugin plugin, Context pluginContext) {
View view = plugin.getView();
if (view != null) {
+ disconnectPlugin();
+ // For now, assume that the most recently connected plugin is the
+ // selected clock face. In the future, the user should be able to
+ // pick a clock face from the available plugins.
mClockPlugin = plugin;
addView(view, -1,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
@@ -46,10 +52,8 @@ public class KeyguardClockSwitch extends FrameLayout {
@Override
public void onPluginDisconnected(ClockPlugin plugin) {
- View view = plugin.getView();
- if (view != null) {
- mClockPlugin = null;
- removeView(view);
+ if (Objects.equals(plugin, mClockPlugin)) {
+ disconnectPlugin();
mClockView.setVisibility(View.VISIBLE);
}
}
@@ -148,6 +152,16 @@ public class KeyguardClockSwitch extends FrameLayout {
}
}
+ private void disconnectPlugin() {
+ if (mClockPlugin != null) {
+ View view = mClockPlugin.getView();
+ if (view != null) {
+ removeView(view);
+ }
+ mClockPlugin = null;
+ }
+ }
+
@VisibleForTesting (otherwise = VisibleForTesting.NONE)
PluginListener getClockPluginListener() {
return mClockPluginListener;
diff --git a/packages/SystemUI/src/com/android/systemui/InitController.java b/packages/SystemUI/src/com/android/systemui/InitController.java
index 52ba66a93524..81d32517b27a 100644
--- a/packages/SystemUI/src/com/android/systemui/InitController.java
+++ b/packages/SystemUI/src/com/android/systemui/InitController.java
@@ -22,6 +22,11 @@ import java.util.ArrayList;
*/
public class InitController {
+ /**
+ * If a task is added after all tasks are executed, then we've done something terribly wrong
+ */
+ private boolean mTasksExecuted = false;
+
private final ArrayList<Runnable> mTasks = new ArrayList<>();
/**
@@ -29,6 +34,9 @@ public class InitController {
* @param runnable the task to be executed
*/
public void addPostInitTask(Runnable runnable) {
+ if (mTasksExecuted) {
+ throw new IllegalStateException("post init tasks have already been executed!");
+ }
mTasks.add(runnable);
}
@@ -39,5 +47,7 @@ public class InitController {
while (!mTasks.isEmpty()) {
mTasks.remove(0).run();
}
+
+ mTasksExecuted = true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
index 8fc46891c3a1..67bc8b626689 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogImpl.java
@@ -18,6 +18,7 @@ package com.android.systemui.biometrics;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.content.res.Configuration;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricPromptReceiver;
@@ -53,6 +54,7 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
private static final int MSG_BUTTON_POSITIVE = 8;
private Map<Integer, BiometricDialogView> mDialogs; // BiometricAuthenticator type, view
+ private SomeArgs mCurrentDialogArgs;
private BiometricDialogView mCurrentDialog;
private WindowManager mWindowManager;
private IBiometricPromptReceiver mReceiver;
@@ -64,7 +66,7 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_SHOW_DIALOG:
- handleShowDialog((SomeArgs) msg.obj);
+ handleShowDialog((SomeArgs) msg.obj, false /* skipAnimation */);
break;
case MSG_BIOMETRIC_AUTHENTICATED:
handleBiometricAuthenticated();
@@ -116,6 +118,15 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
@Override
public void start() {
+ createDialogs();
+
+ if (!mDialogs.isEmpty()) {
+ getComponent(CommandQueue.class).addCallbacks(this);
+ mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+ }
+ }
+
+ private void createDialogs() {
final PackageManager pm = mContext.getPackageManager();
mDialogs = new HashMap<>();
if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) {
@@ -125,11 +136,6 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mDialogs.put(BiometricAuthenticator.TYPE_FINGERPRINT,
new FingerprintDialogView(mContext, mCallback));
}
-
- if (!mDialogs.isEmpty()) {
- getComponent(CommandQueue.class).addCallbacks(this);
- mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
- }
}
@Override
@@ -172,7 +178,8 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mHandler.obtainMessage(MSG_HIDE_DIALOG, false /* userCanceled */).sendToTarget();
}
- private void handleShowDialog(SomeArgs args) {
+ private void handleShowDialog(SomeArgs args, boolean skipAnimation) {
+ mCurrentDialogArgs = args;
final int type = args.argi1;
mCurrentDialog = mDialogs.get(type);
@@ -188,6 +195,7 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
mReceiver = (IBiometricPromptReceiver) args.arg2;
mCurrentDialog.setBundle((Bundle)args.arg1);
mCurrentDialog.setRequireConfirmation((boolean)args.arg3);
+ mCurrentDialog.setSkipIntro(skipAnimation);
mWindowManager.addView(mCurrentDialog, mCurrentDialog.getLayoutParams());
mDialogShowing = true;
}
@@ -268,4 +276,18 @@ public class BiometricDialogImpl extends SystemUI implements CommandQueue.Callba
private void handleUserCanceled() {
handleHideDialog(true /* userCanceled */);
}
+
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ final boolean wasShowing = mDialogShowing;
+ if (mDialogShowing) {
+ mCurrentDialog.forceRemove();
+ mDialogShowing = false;
+ }
+ createDialogs();
+ if (wasShowing) {
+ handleShowDialog(mCurrentDialogArgs, true /* skipAnimation */);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
index d902b7266549..79351151affb 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java
@@ -17,7 +17,7 @@
package com.android.systemui.biometrics;
import android.content.Context;
-import android.graphics.Color;
+import android.content.res.TypedArray;
import android.graphics.PixelFormat;
import android.hardware.biometrics.BiometricPrompt;
import android.os.Binder;
@@ -66,7 +66,7 @@ public abstract class BiometricDialogView extends LinearLayout {
private final float mAnimationTranslationOffset;
private final int mErrorColor;
private final int mTextColor;
- private final float mDisplayWidth;
+ private final float mDialogWidth;
private final DialogViewCallback mCallback;
private ViewGroup mLayout;
@@ -76,6 +76,7 @@ public abstract class BiometricDialogView extends LinearLayout {
private int mLastState;
private boolean mAnimatingAway;
private boolean mWasForceRemoved;
+ private boolean mSkipIntro;
protected boolean mRequireConfirmation;
protected abstract void updateIcon(int lastState, int newState);
@@ -122,14 +123,16 @@ public abstract class BiometricDialogView extends LinearLayout {
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mAnimationTranslationOffset = getResources()
.getDimension(R.dimen.biometric_dialog_animation_translation_offset);
- mErrorColor = Color.parseColor(
- getResources().getString(R.color.biometric_dialog_error_color));
- mTextColor = Color.parseColor(
- getResources().getString(R.color.biometric_dialog_text_light_color));
+
+ TypedArray array = getContext().obtainStyledAttributes(
+ new int[]{android.R.attr.colorError, android.R.attr.textColorSecondary});
+ mErrorColor = array.getColor(0, 0);
+ mTextColor = array.getColor(1, 0);
+ array.recycle();
DisplayMetrics metrics = new DisplayMetrics();
mWindowManager.getDefaultDisplay().getMetrics(metrics);
- mDisplayWidth = metrics.widthPixels;
+ mDialogWidth = Math.min(metrics.widthPixels, metrics.heightPixels);
// Create the dialog
LayoutInflater factory = LayoutInflater.from(getContext());
@@ -196,8 +199,7 @@ public abstract class BiometricDialogView extends LinearLayout {
final Button negative = mLayout.findViewById(R.id.button2);
final Button positive = mLayout.findViewById(R.id.button1);
- mDialog.getLayoutParams().width = (int) mDisplayWidth;
-
+ mDialog.getLayoutParams().width = (int) mDialogWidth;
mLastState = STATE_NONE;
updateState(STATE_AUTHENTICATING);
@@ -226,20 +228,21 @@ public abstract class BiometricDialogView extends LinearLayout {
negative.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT));
- if (!mWasForceRemoved) {
- // Dim the background and slide the dialog up
- mDialog.setTranslationY(mAnimationTranslationOffset);
- mLayout.setAlpha(0f);
- postOnAnimation(mShowAnimationRunnable);
- } else {
+ if (mWasForceRemoved || mSkipIntro) {
// Show the dialog immediately
mLayout.animate().cancel();
mDialog.animate().cancel();
mDialog.setAlpha(1.0f);
mDialog.setTranslationY(0);
mLayout.setAlpha(1.0f);
+ } else {
+ // Dim the background and slide the dialog up
+ mDialog.setTranslationY(mAnimationTranslationOffset);
+ mLayout.setAlpha(0f);
+ postOnAnimation(mShowAnimationRunnable);
}
mWasForceRemoved = false;
+ mSkipIntro = false;
}
private void setDismissesDialog(View v) {
@@ -294,6 +297,13 @@ public abstract class BiometricDialogView extends LinearLayout {
mWasForceRemoved = true;
}
+ /**
+ * Skip the intro animation
+ */
+ public void setSkipIntro(boolean skip) {
+ mSkipIntro = skip;
+ }
+
public boolean isAnimatingAway() {
return mAnimatingAway;
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index c5664605dcef..5d99c571ee20 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -141,7 +141,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi
}
private void updateBrightnessAndReady() {
- if (mRegistered) {
+ if (mRegistered || mDebugBrightnessBucket != -1) {
int sensorValue = mDebugBrightnessBucket == -1
? mLastSensorValue : mDebugBrightnessBucket;
int brightness = computeBrightness(sensorValue);
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 512cd82731c2..dc7b1ef9a092 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -82,6 +82,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.util.EmergencyAffordanceManager;
+import com.android.internal.util.ScreenRecordHelper;
import com.android.internal.util.ScreenshotHelper;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
@@ -158,6 +159,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final boolean mShowSilentToggle;
private final EmergencyAffordanceManager mEmergencyAffordanceManager;
private final ScreenshotHelper mScreenshotHelper;
+ private final ScreenRecordHelper mScreenRecordHelper;
/**
* @param context everything needs a context :(
@@ -199,6 +201,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
mScreenshotHelper = new ScreenshotHelper(context);
+ mScreenRecordHelper = new ScreenRecordHelper(context);
Dependency.get(ConfigurationController.class).addCallback(this);
}
@@ -522,7 +525,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
- private class ScreenshotAction extends SinglePressAction {
+ private class ScreenshotAction extends SinglePressAction implements LongPressAction {
public ScreenshotAction() {
super(R.drawable.ic_screenshot, R.string.global_action_screenshot);
}
@@ -552,6 +555,16 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public boolean showBeforeProvisioning() {
return false;
}
+
+ @Override
+ public boolean onLongPress() {
+ if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SCREENRECORD_LONG_PRESS)) {
+ mScreenRecordHelper.launchRecordPrompt();
+ } else {
+ onPress();
+ }
+ return true;
+ }
}
private class BugReportAction extends SinglePressAction implements LongPressAction {
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt
new file mode 100644
index 000000000000..3953139d43fd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.privacy
+
+import android.app.ActivityManager
+import android.app.AppOpsManager
+import android.content.Context
+import android.graphics.Color
+import android.os.UserHandle
+import android.os.UserManager
+import android.util.AttributeSet
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.android.systemui.Dependency
+import com.android.systemui.R
+import com.android.systemui.appops.AppOpItem
+import com.android.systemui.appops.AppOpsController
+
+class OngoingPrivacyChip @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttrs: Int = 0,
+ defStyleRes: Int = 0
+) : LinearLayout(context, attrs, defStyleAttrs, defStyleRes) {
+
+ companion object {
+ val OPS = intArrayOf(AppOpsManager.OP_CAMERA,
+ AppOpsManager.OP_RECORD_AUDIO,
+ AppOpsManager.OP_COARSE_LOCATION,
+ AppOpsManager.OP_FINE_LOCATION)
+ }
+
+ private lateinit var appName: TextView
+ private lateinit var iconsContainer: LinearLayout
+ private var privacyList = emptyList<PrivacyItem>()
+ private val appOpsController = Dependency.get(AppOpsController::class.java)
+ private val userManager = context.getSystemService(UserManager::class.java)
+ private val currentUser = ActivityManager.getCurrentUser()
+ private val currentUserIds = userManager.getProfiles(currentUser).map { it.id }
+ private var listening = false
+
+ var builder = PrivacyDialogBuilder(context, privacyList)
+
+ private val callback = object : AppOpsController.Callback {
+ override fun onActiveStateChanged(
+ code: Int,
+ uid: Int,
+ packageName: String,
+ active: Boolean
+ ) {
+ val userId = UserHandle.getUserId(uid)
+ if (userId in currentUserIds) {
+ updatePrivacyList()
+ }
+ }
+ }
+
+ override fun onFinishInflate() {
+ super.onFinishInflate()
+
+ appName = findViewById(R.id.app_name)
+ iconsContainer = findViewById(R.id.icons_container)
+ }
+
+ fun setListening(listen: Boolean) {
+ if (listening == listen) return
+ listening = listen
+ if (listening) {
+ appOpsController.addCallback(OPS, callback)
+ updatePrivacyList()
+ } else {
+ appOpsController.removeCallback(OPS, callback)
+ }
+ }
+
+ private fun updatePrivacyList() {
+ privacyList = currentUserIds.flatMap { appOpsController.getActiveAppOpsForUser(it) }
+ .mapNotNull { toPrivacyItem(it) }
+ builder = PrivacyDialogBuilder(context, privacyList)
+ updateView()
+ }
+
+ private fun toPrivacyItem(appOpItem: AppOpItem): PrivacyItem? {
+ val type: PrivacyType = when (appOpItem.code) {
+ AppOpsManager.OP_CAMERA -> PrivacyType.TYPE_CAMERA
+ AppOpsManager.OP_COARSE_LOCATION -> PrivacyType.TYPE_LOCATION
+ AppOpsManager.OP_FINE_LOCATION -> PrivacyType.TYPE_LOCATION
+ AppOpsManager.OP_RECORD_AUDIO -> PrivacyType.TYPE_MICROPHONE
+ else -> return null
+ }
+ val app = PrivacyApplication(appOpItem.packageName, context)
+ return PrivacyItem(type, app, appOpItem.timeStarted)
+ }
+
+ // Should only be called if the builder icons or app changed
+ private fun updateView() {
+ fun setIcons(dialogBuilder: PrivacyDialogBuilder, iconsContainer: ViewGroup) {
+ iconsContainer.removeAllViews()
+ dialogBuilder.generateIcons().forEach {
+ it.mutate()
+ it.setTint(Color.WHITE)
+ iconsContainer.addView(ImageView(context).apply {
+ setImageDrawable(it)
+ maxHeight = this@OngoingPrivacyChip.height
+ })
+ }
+ }
+
+ if (privacyList.isEmpty()) {
+ visibility = GONE
+ return
+ } else {
+ generateContentDescription()
+ visibility = VISIBLE
+ setIcons(builder, iconsContainer)
+ appName.visibility = GONE
+ builder.app?.let {
+ appName.apply {
+ setText(it.applicationName)
+ setTextColor(Color.WHITE)
+ visibility = VISIBLE
+ }
+ }
+ }
+ requestLayout()
+ }
+
+ private fun generateContentDescription() {
+ val typesText = builder.generateTypesText()
+ if (builder.app != null) {
+ contentDescription = context.getString(R.string.ongoing_privacy_chip_content_single_app,
+ builder.app?.applicationName, typesText)
+ } else {
+ contentDescription = context.getString(
+ R.string.ongoing_privacy_chip_content_multiple_apps, typesText)
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
new file mode 100644
index 000000000000..1d0e16ed3334
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.privacy
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.Context
+import android.content.DialogInterface
+import android.graphics.drawable.Drawable
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.android.systemui.Dependency
+import com.android.systemui.R
+import com.android.systemui.plugins.ActivityStarter
+
+class OngoingPrivacyDialog constructor(
+ val context: Context,
+ val dialogBuilder: PrivacyDialogBuilder
+) {
+
+ val iconHeight = context.resources.getDimensionPixelSize(
+ R.dimen.ongoing_appops_dialog_icon_height)
+ val textMargin = context.resources.getDimensionPixelSize(
+ R.dimen.ongoing_appops_dialog_text_margin)
+ val iconColor = context.resources.getColor(
+ com.android.internal.R.color.text_color_primary, context.theme)
+
+ fun createDialog(): Dialog {
+ val builder = AlertDialog.Builder(context)
+ .setNeutralButton(R.string.ongoing_privacy_dialog_open_settings, null)
+ if (dialogBuilder.app != null) {
+ builder.setPositiveButton(R.string.ongoing_privacy_dialog_open_app,
+ object : DialogInterface.OnClickListener {
+ val intent = context.packageManager
+ .getLaunchIntentForPackage(dialogBuilder.app.packageName)
+
+ override fun onClick(dialog: DialogInterface?, which: Int) {
+ Dependency.get(ActivityStarter::class.java).startActivity(intent, false)
+ }
+ })
+ builder.setNegativeButton(R.string.ongoing_privacy_dialog_cancel, null)
+ } else {
+ builder.setPositiveButton(R.string.ongoing_privacy_dialog_okay, null)
+ }
+ builder.setView(getContentView())
+ return builder.create()
+ }
+
+ fun getContentView(): View {
+ val layoutInflater = LayoutInflater.from(context)
+ val contentView = layoutInflater.inflate(R.layout.ongoing_privacy_dialog_content, null)
+
+ val iconsContainer = contentView.findViewById(R.id.icons_container) as LinearLayout
+ val textContainer = contentView.findViewById(R.id.text_container) as LinearLayout
+
+ addIcons(dialogBuilder, iconsContainer)
+ val lm = ViewGroup.MarginLayoutParams(
+ ViewGroup.MarginLayoutParams.WRAP_CONTENT,
+ ViewGroup.MarginLayoutParams.WRAP_CONTENT)
+ lm.topMargin = textMargin
+ val now = System.currentTimeMillis()
+ dialogBuilder.generateText(now).forEach {
+ val text = layoutInflater.inflate(R.layout.ongoing_privacy_text_item, null) as TextView
+ text.setText(it)
+ textContainer.addView(text, lm)
+ }
+ return contentView
+ }
+
+ private fun addIcons(dialogBuilder: PrivacyDialogBuilder, iconsContainer: LinearLayout) {
+
+ fun LinearLayout.addIcon(icon: Drawable) {
+ val image = ImageView(context).apply {
+ setImageDrawable(icon.apply {
+ setBounds(0, 0, iconHeight, iconHeight)
+ maxHeight = this@addIcon.height
+ })
+ adjustViewBounds = true
+ }
+ addView(image, LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.MATCH_PARENT)
+ }
+
+ dialogBuilder.generateIcons().forEach {
+ it.mutate()
+ it.setTint(iconColor)
+ iconsContainer.addIcon(it)
+ }
+ dialogBuilder.app.let {
+ it?.icon?.let { iconsContainer.addIcon(it) }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt
new file mode 100644
index 000000000000..2f86f78d7669
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.privacy
+
+import android.content.Context
+import com.android.systemui.R
+import java.lang.IllegalStateException
+import java.lang.Math.max
+
+class PrivacyDialogBuilder(val context: Context, itemsList: List<PrivacyItem>) {
+ companion object {
+ val MILLIS_IN_MINUTE: Long = 1000 * 60
+ }
+
+ private val itemsByType: Map<PrivacyType, List<PrivacyItem>>
+ val app: PrivacyApplication?
+
+ init {
+ itemsByType = itemsList.groupBy { it.privacyType }
+ val apps = itemsList.map { it.application }.distinct()
+ val singleApp = apps.size == 1
+ app = if (singleApp) apps.get(0) else null
+ }
+
+ private fun buildTextForItem(type: PrivacyType, now: Long): String {
+ val items = itemsByType.getOrDefault(type, emptyList<PrivacyItem>())
+ return when (items.size) {
+ 0 -> throw IllegalStateException("List cannot be empty")
+ 1 -> {
+ val item = items.get(0)
+ val minutesUsed = max(((now - item.timeStarted) / MILLIS_IN_MINUTE).toInt(), 1)
+ context.getString(R.string.ongoing_privacy_dialog_app_item,
+ item.application.applicationName, type.getName(context), minutesUsed)
+ }
+ else -> {
+ val apps = items.map { it.application.applicationName }.joinToString()
+ context.getString(R.string.ongoing_privacy_dialog_apps_item,
+ apps, type.getName(context))
+ }
+ }
+ }
+
+ private fun buildTextForApp(types: Set<PrivacyType>): List<String> {
+ app?.let {
+ val typesText = types.map { it.getName(context) }.sorted().joinToString()
+ return listOf(context.getString(R.string.ongoing_privacy_dialog_single_app,
+ it.applicationName, typesText))
+ } ?: throw IllegalStateException("There has to be a single app")
+ }
+
+ fun generateText(now: Long): List<String> {
+ if (app == null || itemsByType.keys.size == 1) {
+ return itemsByType.keys.map { buildTextForItem(it, now) }
+ } else {
+ return buildTextForApp(itemsByType.keys)
+ }
+ }
+
+ fun generateTypesText() = itemsByType.keys.map { it.getName(context) }.sorted().joinToString()
+
+ fun generateIcons() = itemsByType.keys.map { it.getIcon(context) }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt
new file mode 100644
index 000000000000..f4099021a0bd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.privacy
+
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.graphics.drawable.Drawable
+import com.android.systemui.R
+
+typealias Privacy = PrivacyType
+
+enum class PrivacyType(val nameId: Int, val iconId: Int) {
+ TYPE_CAMERA(R.string.privacy_type_camera, com.android.internal.R.drawable.ic_camera),
+ TYPE_LOCATION(R.string.privacy_type_location, R.drawable.stat_sys_location),
+ TYPE_MICROPHONE(R.string.privacy_type_microphone, R.drawable.ic_mic_26dp);
+
+ fun getName(context: Context) = context.resources.getString(nameId)
+
+ fun getIcon(context: Context) = context.resources.getDrawable(iconId, null)
+}
+
+data class PrivacyItem(
+ val privacyType: PrivacyType,
+ val application: PrivacyApplication,
+ val timeStarted: Long
+)
+
+data class PrivacyApplication(val packageName: String, val context: Context) {
+ var icon: Drawable? = null
+ var applicationName: String
+
+ init {
+ try {
+ val app: ApplicationInfo = context.packageManager
+ .getApplicationInfo(packageName, 0)
+ icon = context.packageManager.getApplicationIcon(app)
+ applicationName = context.packageManager.getApplicationLabel(app) as String
+ } catch (e: PackageManager.NameNotFoundException) {
+ applicationName = packageName
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index b988c552991c..3ee6195858d6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter;
import android.annotation.ColorInt;
import android.app.ActivityManager;
import android.app.AlarmManager;
+import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -31,33 +32,38 @@ import android.graphics.Color;
import android.graphics.Rect;
import android.media.AudioManager;
import android.os.Handler;
+import android.os.Looper;
import android.provider.AlarmClock;
import android.service.notification.ZenModeConfig;
-import android.widget.FrameLayout;
-import androidx.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
import android.view.View;
import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import androidx.annotation.VisibleForTesting;
+
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.privacy.OngoingPrivacyChip;
+import com.android.systemui.privacy.OngoingPrivacyDialog;
import com.android.systemui.qs.QSDetail.Callback;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
-import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.phone.StatusIconContainer;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.policy.DateView;
@@ -118,6 +124,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private BatteryMeterView mBatteryMeterView;
private Clock mClockView;
private DateView mDateView;
+ private OngoingPrivacyChip mPrivacyChip;
private NextAlarmController mAlarmController;
private ZenModeController mZenController;
@@ -185,6 +192,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mClockView = findViewById(R.id.clock);
mClockView.setOnClickListener(this);
mDateView = findViewById(R.id.date);
+ mPrivacyChip = findViewById(R.id.privacy_chip);
+ mPrivacyChip.setOnClickListener(this);
}
private void updateStatusText() {
@@ -205,7 +214,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
boolean ringerVisible = false;
if (!ZenModeConfig.isZenOverridingRinger(mZenController.getZen(),
- mZenController.getConfig())) {
+ mZenController.getConsolidatedPolicy())) {
if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate);
mRingerModeTextView.setText(R.string.qs_status_phone_vibrate);
@@ -263,6 +272,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements
newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE;
mBatteryMeterView.useWallpaperTextColor(shouldUseWallpaperTextColor);
mClockView.useWallpaperTextColor(shouldUseWallpaperTextColor);
+
+ MarginLayoutParams lm = (MarginLayoutParams) mPrivacyChip.getLayoutParams();
+ int sideMargins = lm.leftMargin;
+ int topBottomMargins = (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
+ ? 0 : sideMargins;
+ lm.setMargins(sideMargins, topBottomMargins, sideMargins, topBottomMargins);
+ mPrivacyChip.setLayoutParams(lm);
}
@Override
@@ -421,6 +437,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
return;
}
mHeaderQsPanel.setListening(listening);
+ mPrivacyChip.setListening(listening);
mListening = listening;
if (listening) {
@@ -443,6 +460,19 @@ public class QuickStatusBarHeader extends RelativeLayout implements
} else if (v == mBatteryMeterView) {
Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(new Intent(
Intent.ACTION_POWER_USAGE_SUMMARY),0);
+ } else if (v == mPrivacyChip) {
+ Handler mUiHandler = new Handler(Looper.getMainLooper());
+ mUiHandler.post(() -> {
+ Dialog mDialog = new OngoingPrivacyDialog(mContext,
+ mPrivacyChip.getBuilder()).createDialog();
+ mDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
+ SystemUIDialog.setShowForAllUsers(mDialog, true);
+ SystemUIDialog.registerDismissListener(mDialog);
+ SystemUIDialog.setWindowOnTop(mDialog);
+ mUiHandler.post(() -> mDialog.show());
+ mHost.collapsePanels();
+ });
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index d42127e74944..0638998d8e67 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -194,6 +194,7 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
}
setClickable(state.state != Tile.STATE_UNAVAILABLE);
+ setLongClickable(state.handlesLongClick);
mIcon.setIcon(state, allowAnimations);
setContentDescription(state.contentDescription);
@@ -287,10 +288,14 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
info.setText(label);
info.setChecked(b);
info.setCheckable(true);
- info.addAction(
- new AccessibilityNodeInfo.AccessibilityAction(
- AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK.getId(),
- getResources().getString(R.string.accessibility_long_click_tile)));
+ if (isLongClickable()) {
+ info.addAction(
+ new AccessibilityNodeInfo.AccessibilityAction(
+ AccessibilityNodeInfo.AccessibilityAction
+ .ACTION_LONG_CLICK.getId(),
+ getResources().getString(
+ R.string.accessibility_long_click_tile)));
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
index f2ead1cbca94..d7ac2532982d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
@@ -18,7 +18,6 @@ package com.android.systemui.qs.tiles;
import android.app.ActivityManager;
import android.content.Intent;
-import android.graphics.drawable.Drawable;
import android.provider.MediaStore;
import android.service.quicksettings.Tile;
import android.widget.Switch;
@@ -50,7 +49,9 @@ public class FlashlightTile extends QSTileImpl<BooleanState> implements
@Override
public BooleanState newTileState() {
- return new BooleanState();
+ BooleanState state = new BooleanState();
+ state.handlesLongClick = false;
+ return state;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
new file mode 100644
index 000000000000..a9896f51369c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
@@ -0,0 +1,451 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.screenrecord;
+
+import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Icon;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.media.MediaRecorder;
+import android.media.ThumbnailUtils;
+import android.media.projection.MediaProjection;
+import android.media.projection.MediaProjectionManager;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.IBinder;
+import android.provider.MediaStore;
+import android.provider.Settings;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Surface;
+import android.widget.Toast;
+
+import androidx.core.content.FileProvider;
+
+import com.android.systemui.R;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * A service which records the device screen and optionally microphone input.
+ */
+public class RecordingService extends Service {
+ private static final int NOTIFICATION_ID = 1;
+ private static final String TAG = "RecordingService";
+ private static final String CHANNEL_ID = "screen_record";
+ private static final String EXTRA_RESULT_CODE = "extra_resultCode";
+ private static final String EXTRA_DATA = "extra_data";
+ private static final String EXTRA_PATH = "extra_path";
+ private static final String EXTRA_USE_AUDIO = "extra_useAudio";
+ private static final String EXTRA_SHOW_TAPS = "extra_showTaps";
+ private static final int REQUEST_CODE = 2;
+
+ private static final String ACTION_START = "com.android.systemui.screenrecord.START";
+ private static final String ACTION_STOP = "com.android.systemui.screenrecord.STOP";
+ private static final String ACTION_PAUSE = "com.android.systemui.screenrecord.PAUSE";
+ private static final String ACTION_RESUME = "com.android.systemui.screenrecord.RESUME";
+ private static final String ACTION_CANCEL = "com.android.systemui.screenrecord.CANCEL";
+ private static final String ACTION_SHARE = "com.android.systemui.screenrecord.SHARE";
+ private static final String ACTION_DELETE = "com.android.systemui.screenrecord.DELETE";
+
+ private static final int TOTAL_NUM_TRACKS = 1;
+ private static final String RECORD_DIR = "Captures"; // TODO: use a translatable string
+ private static final int VIDEO_BIT_RATE = 6000000;
+ private static final int VIDEO_FRAME_RATE = 30;
+ private static final int AUDIO_BIT_RATE = 16;
+ private static final int AUDIO_SAMPLE_RATE = 44100;
+ private static final String FILE_PROVIDER = "com.android.systemui.fileprovider";
+
+ private MediaProjectionManager mMediaProjectionManager;
+ private MediaProjection mMediaProjection;
+ private Surface mInputSurface;
+ private VirtualDisplay mVirtualDisplay;
+ private MediaRecorder mMediaRecorder;
+ private Notification.Builder mRecordingNotificationBuilder;
+
+ private boolean mUseAudio;
+ private boolean mShowTaps;
+ private File mTempFile;
+
+ /**
+ * Get an intent to start the recording service.
+ *
+ * @param context Context from the requesting activity
+ * @param resultCode The result code from {@link android.app.Activity#onActivityResult(int, int,
+ * android.content.Intent)}
+ * @param data The data from {@link android.app.Activity#onActivityResult(int, int,
+ * android.content.Intent)}
+ * @param useAudio True to enable microphone input while recording
+ * @param showTaps True to make touches visible while recording
+ */
+ public static Intent getStartIntent(Context context, int resultCode, Intent data,
+ boolean useAudio, boolean showTaps) {
+ return new Intent(context, RecordingService.class)
+ .setAction(ACTION_START)
+ .putExtra(EXTRA_RESULT_CODE, resultCode)
+ .putExtra(EXTRA_DATA, data)
+ .putExtra(EXTRA_USE_AUDIO, useAudio)
+ .putExtra(EXTRA_SHOW_TAPS, showTaps);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ Log.d(TAG, "RecordingService is starting");
+ if (intent == null) {
+ return Service.START_NOT_STICKY;
+ }
+ String action = intent.getAction();
+
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+
+ switch (action) {
+ case ACTION_START:
+ int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, Activity.RESULT_CANCELED);
+ mUseAudio = intent.getBooleanExtra(EXTRA_USE_AUDIO, false);
+ mShowTaps = intent.getBooleanExtra(EXTRA_SHOW_TAPS, false);
+ Intent data = intent.getParcelableExtra(EXTRA_DATA);
+ if (data != null) {
+ mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
+ startRecording();
+ }
+ break;
+
+ case ACTION_CANCEL:
+ stopRecording();
+
+ // Delete temp file
+ if (!mTempFile.delete()) {
+ Log.e(TAG, "Error canceling screen recording!");
+ Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
+ .show();
+ } else {
+ Toast.makeText(this, R.string.screenrecord_cancel_success, Toast.LENGTH_LONG)
+ .show();
+ }
+
+ // Close quick shade
+ sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ break;
+
+ case ACTION_STOP:
+ stopRecording();
+
+ // Move temp file to user directory
+ File recordDir = new File(
+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),
+ RECORD_DIR);
+ recordDir.mkdirs();
+
+ String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")
+ .format(new Date());
+ Path path = new File(recordDir, fileName).toPath();
+
+ try {
+ Files.move(mTempFile.toPath(), path);
+ Notification notification = createSaveNotification(path);
+ notificationManager.notify(NOTIFICATION_ID, notification);
+ } catch (IOException e) {
+ e.printStackTrace();
+ Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
+ .show();
+ }
+ break;
+
+ case ACTION_PAUSE:
+ mMediaRecorder.pause();
+ setNotificationActions(true, notificationManager);
+ break;
+
+ case ACTION_RESUME:
+ mMediaRecorder.resume();
+ setNotificationActions(false, notificationManager);
+ break;
+
+ case ACTION_SHARE:
+ File shareFile = new File(intent.getStringExtra(EXTRA_PATH));
+ Uri shareUri = FileProvider.getUriForFile(this, FILE_PROVIDER, shareFile);
+
+ Intent shareIntent = new Intent(Intent.ACTION_SEND)
+ .setType("video/mp4")
+ .putExtra(Intent.EXTRA_STREAM, shareUri);
+ String shareLabel = getResources().getString(R.string.screenrecord_share_label);
+
+ // Close quick shade
+ sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+
+ // Remove notification
+ notificationManager.cancel(NOTIFICATION_ID);
+
+ startActivity(Intent.createChooser(shareIntent, shareLabel)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ break;
+ case ACTION_DELETE:
+ // Close quick shade
+ sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+
+ File file = new File(intent.getStringExtra(EXTRA_PATH));
+ if (file.delete()) {
+ Toast.makeText(
+ this,
+ R.string.screenrecord_delete_description,
+ Toast.LENGTH_LONG).show();
+
+ // Remove notification
+ notificationManager.cancel(NOTIFICATION_ID);
+ } else {
+ Log.e(TAG, "Error deleting screen recording!");
+ Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
+ .show();
+ }
+ break;
+ }
+ return Service.START_STICKY;
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ mMediaProjectionManager =
+ (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
+ }
+
+ /**
+ * Begin the recording session
+ */
+ private void startRecording() {
+ try {
+ mTempFile = File.createTempFile("temp", ".mp4");
+ Log.d(TAG, "Writing video output to: " + mTempFile.getAbsolutePath());
+
+ setTapsVisible(mShowTaps);
+
+ // Set up media recorder
+ mMediaRecorder = new MediaRecorder();
+ if (mUseAudio) {
+ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+ }
+ mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
+ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
+
+ // Set up video
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
+ int screenWidth = metrics.widthPixels;
+ int screenHeight = metrics.heightPixels;
+ mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
+ mMediaRecorder.setVideoSize(screenWidth, screenHeight);
+ mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE);
+ mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE);
+
+ // Set up audio
+ if (mUseAudio) {
+ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+ mMediaRecorder.setAudioChannels(TOTAL_NUM_TRACKS);
+ mMediaRecorder.setAudioEncodingBitRate(AUDIO_BIT_RATE);
+ mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLE_RATE);
+ }
+
+ mMediaRecorder.setOutputFile(mTempFile);
+ mMediaRecorder.prepare();
+
+ // Create surface
+ mInputSurface = mMediaRecorder.getSurface();
+ mVirtualDisplay = mMediaProjection.createVirtualDisplay(
+ "Recording Display",
+ screenWidth,
+ screenHeight,
+ metrics.densityDpi,
+ DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
+ mInputSurface,
+ null,
+ null);
+
+ mMediaRecorder.start();
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+
+ createRecordingNotification();
+ }
+
+ private void createRecordingNotification() {
+ NotificationChannel channel = new NotificationChannel(
+ CHANNEL_ID,
+ getString(R.string.screenrecord_name),
+ NotificationManager.IMPORTANCE_HIGH);
+ channel.setDescription(getString(R.string.screenrecord_channel_description));
+ channel.enableVibration(true);
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.createNotificationChannel(channel);
+
+ mRecordingNotificationBuilder = new Notification.Builder(this, CHANNEL_ID)
+ .setSmallIcon(R.drawable.ic_android)
+ .setContentTitle(getResources().getString(R.string.screenrecord_name))
+ .setUsesChronometer(true)
+ .setOngoing(true);
+ setNotificationActions(false, notificationManager);
+ Notification notification = mRecordingNotificationBuilder.build();
+ startForeground(NOTIFICATION_ID, notification);
+ }
+
+ private void setNotificationActions(boolean isPaused, NotificationManager notificationManager) {
+ String pauseString = getResources()
+ .getString(isPaused ? R.string.screenrecord_resume_label
+ : R.string.screenrecord_pause_label);
+ Intent pauseIntent = isPaused ? getResumeIntent(this) : getPauseIntent(this);
+
+ mRecordingNotificationBuilder.setActions(
+ new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_android),
+ getResources().getString(R.string.screenrecord_stop_label),
+ PendingIntent
+ .getService(this, REQUEST_CODE, getStopIntent(this),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .build(),
+ new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_android), pauseString,
+ PendingIntent.getService(this, REQUEST_CODE, pauseIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .build(),
+ new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_android),
+ getResources().getString(R.string.screenrecord_cancel_label),
+ PendingIntent
+ .getService(this, REQUEST_CODE, getCancelIntent(this),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .build());
+ notificationManager.notify(NOTIFICATION_ID, mRecordingNotificationBuilder.build());
+ }
+
+ private Notification createSaveNotification(Path path) {
+ Uri saveUri = FileProvider.getUriForFile(this, FILE_PROVIDER, path.toFile());
+ Log.d(TAG, "Screen recording saved to " + path.toString());
+
+ Intent viewIntent = new Intent(Intent.ACTION_VIEW)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ .setDataAndType(saveUri, "video/mp4");
+
+ Notification.Action shareAction = new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_android),
+ getResources().getString(R.string.screenrecord_share_label),
+ PendingIntent.getService(
+ this,
+ REQUEST_CODE,
+ getShareIntent(this, path.toString()),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .build();
+
+ Notification.Action deleteAction = new Notification.Action.Builder(
+ Icon.createWithResource(this, R.drawable.ic_android),
+ getResources().getString(R.string.screenrecord_delete_label),
+ PendingIntent.getService(
+ this,
+ REQUEST_CODE,
+ getDeleteIntent(this, path.toString()),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .build();
+
+ Notification.Builder builder = new Notification.Builder(this, CHANNEL_ID)
+ .setSmallIcon(R.drawable.ic_android)
+ .setContentTitle(getResources().getString(R.string.screenrecord_name))
+ .setContentText(getResources().getString(R.string.screenrecord_save_message))
+ .setContentIntent(PendingIntent.getActivity(
+ this,
+ REQUEST_CODE,
+ viewIntent,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION))
+ .addAction(shareAction)
+ .addAction(deleteAction)
+ .setAutoCancel(true);
+
+ // Add thumbnail if available
+ Bitmap thumbnailBitmap = ThumbnailUtils.createVideoThumbnail(path.toString(),
+ MediaStore.Video.Thumbnails.MINI_KIND);
+ if (thumbnailBitmap != null) {
+ Notification.BigPictureStyle pictureStyle = new Notification.BigPictureStyle()
+ .bigPicture(thumbnailBitmap)
+ .bigLargeIcon((Bitmap) null);
+ builder.setLargeIcon(thumbnailBitmap).setStyle(pictureStyle);
+ }
+ return builder.build();
+ }
+
+ private void stopRecording() {
+ setTapsVisible(false);
+ mMediaRecorder.stop();
+ mMediaRecorder.release();
+ mMediaRecorder = null;
+ mMediaProjection.stop();
+ mMediaProjection = null;
+ mInputSurface.release();
+ mVirtualDisplay.release();
+ stopSelf();
+ }
+
+ private void setTapsVisible(boolean turnOn) {
+ int value = turnOn ? 1 : 0;
+ Settings.System.putInt(getApplicationContext().getContentResolver(),
+ Settings.System.SHOW_TOUCHES, value);
+ }
+
+ private static Intent getStopIntent(Context context) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_STOP);
+ }
+
+ private static Intent getPauseIntent(Context context) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_PAUSE);
+ }
+
+ private static Intent getResumeIntent(Context context) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_RESUME);
+ }
+
+ private static Intent getCancelIntent(Context context) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_CANCEL);
+ }
+
+ private static Intent getShareIntent(Context context, String path) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_SHARE)
+ .putExtra(EXTRA_PATH, path);
+ }
+
+ private static Intent getDeleteIntent(Context context, String path) {
+ return new Intent(context, RecordingService.class).setAction(ACTION_DELETE)
+ .putExtra(EXTRA_PATH, path);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
new file mode 100644
index 000000000000..27e9fbab3161
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.screenrecord;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.media.projection.MediaProjectionManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.Toast;
+
+import com.android.systemui.R;
+
+/**
+ * Activity to select screen recording options
+ */
+public class ScreenRecordDialog extends Activity {
+ private static final String TAG = "ScreenRecord";
+ private static final int REQUEST_CODE_VIDEO_ONLY = 200;
+ private static final int REQUEST_CODE_VIDEO_TAPS = 201;
+ private static final int REQUEST_CODE_PERMISSIONS = 299;
+ private static final int REQUEST_CODE_VIDEO_AUDIO = 300;
+ private static final int REQUEST_CODE_VIDEO_AUDIO_TAPS = 301;
+ private static final int REQUEST_CODE_PERMISSIONS_AUDIO = 399;
+ private boolean mUseAudio;
+ private boolean mShowTaps;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.screen_record_dialog);
+
+ final CheckBox micCheckBox = findViewById(R.id.checkbox_mic);
+ final CheckBox tapsCheckBox = findViewById(R.id.checkbox_taps);
+
+ final Button recordButton = findViewById(R.id.record_button);
+ recordButton.setOnClickListener(v -> {
+ mUseAudio = micCheckBox.isChecked();
+ mShowTaps = tapsCheckBox.isChecked();
+ Log.d(TAG, "Record button clicked: audio " + mUseAudio + ", taps " + mShowTaps);
+
+ if (mUseAudio && checkSelfPermission(Manifest.permission.RECORD_AUDIO)
+ != PackageManager.PERMISSION_GRANTED) {
+ Log.d(TAG, "Requesting permission for audio");
+ requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO},
+ REQUEST_CODE_PERMISSIONS_AUDIO);
+ } else {
+ requestScreenCapture();
+ }
+ });
+ }
+
+ private void requestScreenCapture() {
+ MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(
+ Context.MEDIA_PROJECTION_SERVICE);
+ Intent permissionIntent = mediaProjectionManager.createScreenCaptureIntent();
+
+ if (mUseAudio) {
+ startActivityForResult(permissionIntent,
+ mShowTaps ? REQUEST_CODE_VIDEO_AUDIO_TAPS : REQUEST_CODE_VIDEO_AUDIO);
+ } else {
+ startActivityForResult(permissionIntent,
+ mShowTaps ? REQUEST_CODE_VIDEO_TAPS : REQUEST_CODE_VIDEO_ONLY);
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ mShowTaps = (requestCode == REQUEST_CODE_VIDEO_TAPS
+ || requestCode == REQUEST_CODE_VIDEO_AUDIO_TAPS);
+ switch (requestCode) {
+ case REQUEST_CODE_VIDEO_TAPS:
+ case REQUEST_CODE_VIDEO_AUDIO_TAPS:
+ case REQUEST_CODE_VIDEO_ONLY:
+ case REQUEST_CODE_VIDEO_AUDIO:
+ if (resultCode == RESULT_OK) {
+ mUseAudio = (requestCode == REQUEST_CODE_VIDEO_AUDIO
+ || requestCode == REQUEST_CODE_VIDEO_AUDIO_TAPS);
+ startForegroundService(
+ RecordingService.getStartIntent(this, resultCode, data, mUseAudio,
+ mShowTaps));
+ } else {
+ Toast.makeText(this,
+ getResources().getString(R.string.screenrecord_permission_error),
+ Toast.LENGTH_SHORT).show();
+ }
+ finish();
+ break;
+ case REQUEST_CODE_PERMISSIONS:
+ int permission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ if (permission != PackageManager.PERMISSION_GRANTED) {
+ Toast.makeText(this,
+ getResources().getString(R.string.screenrecord_permission_error),
+ Toast.LENGTH_SHORT).show();
+ finish();
+ } else {
+ requestScreenCapture();
+ }
+ break;
+ case REQUEST_CODE_PERMISSIONS_AUDIO:
+ int videoPermission = checkSelfPermission(
+ Manifest.permission.WRITE_EXTERNAL_STORAGE);
+ int audioPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
+ if (videoPermission != PackageManager.PERMISSION_GRANTED
+ || audioPermission != PackageManager.PERMISSION_GRANTED) {
+ Toast.makeText(this,
+ getResources().getString(R.string.screenrecord_permission_error),
+ Toast.LENGTH_SHORT).show();
+ finish();
+ } else {
+ requestScreenCapture();
+ }
+ break;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
index bc662e3d8855..8994568d12a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
@@ -15,6 +15,7 @@
package com.android.systemui.statusbar;
import android.content.pm.UserInfo;
+import android.os.SystemProperties;
import android.service.notification.StatusBarNotification;
import android.util.SparseArray;
@@ -25,6 +26,8 @@ public interface NotificationLockscreenUserManager {
String NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION
= "com.android.systemui.statusbar.work_challenge_unlocked_notification_action";
+ boolean AUTO_DEMOTE_NOTIFICATIONS = SystemProperties.getBoolean("debug.demote_notifs", false);
+
boolean shouldAllowLockscreenRemoteInput();
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 38011d9c1e87..010846912622 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -15,6 +15,7 @@
*/
package com.android.systemui.statusbar;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
import android.app.ActivityManager;
@@ -291,8 +292,16 @@ public class NotificationLockscreenUserManagerImpl implements
Log.wtf(TAG, "mEntryManager was null!", new Throwable());
return false;
}
- return mShowLockscreenNotifications
- && !getEntryManager().getNotificationData().isAmbient(sbn.getKey());
+ boolean exceedsPriorityThreshold;
+ if (AUTO_DEMOTE_NOTIFICATIONS) {
+ exceedsPriorityThreshold =
+ getEntryManager().getNotificationData().getImportance(sbn.getKey())
+ >= IMPORTANCE_DEFAULT;
+ } else {
+ exceedsPriorityThreshold =
+ !getEntryManager().getNotificationData().isAmbient(sbn.getKey());
+ }
+ return mShowLockscreenNotifications && exceedsPriorityThreshold;
}
private void setShowLockscreenNotifications(boolean show) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index f30377ead957..8c53cc2a06a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -35,6 +35,7 @@ import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -47,7 +48,6 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
-import com.android.systemui.InitController;
import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -122,7 +122,7 @@ public class NotificationRemoteInputManager implements Dumpable {
@Override
public boolean onClickHandler(
- final View view, final PendingIntent pendingIntent, final Intent fillInIntent) {
+ View view, PendingIntent pendingIntent, RemoteViews.RemoteResponse response) {
getShadeController().wakeUpIfDozing(SystemClock.uptimeMillis(), view);
if (handleRemoteInput(view, pendingIntent)) {
@@ -141,8 +141,12 @@ public class NotificationRemoteInputManager implements Dumpable {
ActivityManager.getService().resumeAppSwitches();
} catch (RemoteException e) {
}
- return mCallback.handleRemoteViewClick(view, pendingIntent, fillInIntent,
- () -> super.onClickHandler(view, pendingIntent, fillInIntent));
+ return mCallback.handleRemoteViewClick(pendingIntent, () -> {
+ Pair<Intent, ActivityOptions> options = response.getLaunchOptions(view);
+ options.second.setLaunchWindowingMode(
+ WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY);
+ return RemoteViews.startPendingIntent(view, pendingIntent, options);
+ });
}
private void logActionClick(View view) {
@@ -180,13 +184,6 @@ public class NotificationRemoteInputManager implements Dumpable {
return null;
}
- @Override
- protected ActivityOptions getActivityOptions(Context context) {
- ActivityOptions options = super.getActivityOptions(context);
- options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY);
- return options;
- }
-
private boolean handleRemoteInput(View view, PendingIntent pendingIntent) {
if (mCallback.shouldHandleRemoteInput(view, pendingIntent)) {
return true;
@@ -661,14 +658,11 @@ public class NotificationRemoteInputManager implements Dumpable {
* Performs any special handling for a remote view click. The default behaviour can be
* called through the defaultHandler parameter.
*
- * @param view
* @param pendingIntent
- * @param fillInIntent
* @param defaultHandler
* @return true iff the click was handled
*/
- boolean handleRemoteViewClick(View view, PendingIntent pendingIntent, Intent fillInIntent,
- ClickHandler defaultHandler);
+ boolean handleRemoteViewClick(PendingIntent pendingIntent, ClickHandler defaultHandler);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index cd3da123ed32..bf336141d622 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -43,13 +43,13 @@ import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
-import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.StackScrollState;
import com.android.systemui.statusbar.notification.stack.ViewState;
+import com.android.systemui.statusbar.phone.NotificationIconContainer;
/**
* A notification shelf view that is placed inside the notification scroller. It manages the
@@ -58,7 +58,6 @@ import com.android.systemui.statusbar.notification.stack.ViewState;
public class NotificationShelf extends ActivatableNotificationView implements
View.OnLayoutChangeListener {
- public static final boolean SHOW_AMBIENT_ICONS = true;
private static final boolean USE_ANIMATIONS_WHEN_OPENING =
SystemProperties.getBoolean("debug.icon_opening_animations", true);
private static final boolean ICON_ANMATIONS_WHILE_SCROLLING
@@ -176,21 +175,6 @@ public class NotificationShelf extends ActivatableNotificationView implements
updateInteractiveness();
}
- public void fadeInTranslating() {
- mShelfIcons.setTranslationY(-mShelfAppearTranslation);
- mShelfIcons.setAlpha(0);
- mShelfIcons.animate()
- .setInterpolator(Interpolators.DECELERATE_QUINT)
- .translationY(0)
- .setDuration(SHELF_IN_TRANSLATION_DURATION)
- .start();
- mShelfIcons.animate()
- .alpha(1)
- .setInterpolator(Interpolators.LINEAR)
- .setDuration(SHELF_IN_TRANSLATION_DURATION)
- .start();
- }
-
@Override
protected View getContentView() {
return mShelfIcons;
@@ -417,7 +401,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
float maxTop = row.getTranslationY();
StatusBarIconView icon = row.getEntry().expandedIcon;
float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY();
- if (shelfIconPosition < maxTop && !mAmbientState.isDark()) {
+ if (shelfIconPosition < maxTop) {
int top = (int) (maxTop - shelfIconPosition);
Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight()));
icon.setClipBounds(clipRect);
@@ -428,7 +412,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
private void updateContinuousClipping(final ExpandableNotificationRow row) {
StatusBarIconView icon = row.getEntry().expandedIcon;
- boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark();
+ boolean needsContinuousClipping = ViewState.isAnimatingY(icon);
boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null;
if (needsContinuousClipping && !isContinuousClipping) {
final ViewTreeObserver observer = icon.getViewTreeObserver();
@@ -619,9 +603,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
iconState.translateContent = false;
}
float transitionAmount;
- if (mAmbientState.getDarkAmount() > 0 && !row.isInShelf()) {
- transitionAmount = mAmbientState.isFullyDark() ? 1 : 0;
- } else if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount
+ if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount
|| iconState.useLinearTransitionAmount) {
transitionAmount = iconTransitionAmount;
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 1e04377e25b2..8b61a5bccc3c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -206,10 +206,6 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
mIconScale = SYSTEM_ICON_SCALE;
}
- public float getIconScaleFullyDark() {
- return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize;
- }
-
public float getIconScale() {
return mIconScale;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/SwitchToGuestTimer.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/SwitchToGuestTimer.java
index 27a5d4bf2bf2..f9fa44b17489 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/SwitchToGuestTimer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/SwitchToGuestTimer.java
@@ -79,7 +79,7 @@ public class SwitchToGuestTimer {
@Override
public void onFinish() {
- mCarUserManagerHelper.startNewGuestSession(mGuestName);
+ mCarUserManagerHelper.startGuestSession(mGuestName);
cancel();
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index 618a4c134049..53a7afe76d0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -223,7 +223,7 @@ public class UserGridRecyclerView extends PagedListView implements
if (userRecord.mIsStartGuestSession) {
notifyUserSelected(userRecord);
- mCarUserManagerHelper.startNewGuestSession(mGuestName);
+ mCarUserManagerHelper.startGuestSession(mGuestName);
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 22c37fdb11cc..965fb137badf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -82,7 +82,6 @@ import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
import com.android.systemui.shared.plugins.PluginManager;
-import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
@@ -1500,9 +1499,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private void updateIconVisibilities() {
- boolean visible = isChildInGroup()
- || (isBelowSpeedBump() && !NotificationShelf.SHOW_AMBIENT_ICONS)
- || mIconsVisible;
+ boolean visible = isChildInGroup() || mIconsVisible;
for (NotificationContentView l : mLayouts) {
l.setIconsVisible(visible);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
index 912a2f7e598d..903c27277b70 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java
@@ -72,7 +72,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private String mPackageName;
private String mAppName;
private int mAppUid;
- private String mDelegatePkg;
private int mNumUniqueChannelsInRow;
private NotificationChannel mSingleNotificationChannel;
private int mStartingUserImportance;
@@ -194,7 +193,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
(mSbn.getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE) != 0;
mIsForBlockingHelper = isForBlockingHelper;
mAppUid = mSbn.getUid();
- mDelegatePkg = mSbn.getOpPkg();
mIsDeviceProvisioned = isDeviceProvisioned;
int numTotalChannels = mINotificationManager.getNumNotificationChannelsForPackage(
@@ -236,8 +234,26 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
((ImageView) findViewById(R.id.pkgicon)).setImageDrawable(pkgicon);
((TextView) findViewById(R.id.pkgname)).setText(mAppName);
- // Delegate
- bindDelegate();
+ // Set group information if this channel has an associated group.
+ CharSequence groupName = null;
+ if (mSingleNotificationChannel != null && mSingleNotificationChannel.getGroup() != null) {
+ final NotificationChannelGroup notificationChannelGroup =
+ mINotificationManager.getNotificationChannelGroupForPackage(
+ mSingleNotificationChannel.getGroup(), mPackageName, mAppUid);
+ if (notificationChannelGroup != null) {
+ groupName = notificationChannelGroup.getName();
+ }
+ }
+ TextView groupNameView = findViewById(R.id.group_name);
+ TextView groupDividerView = findViewById(R.id.pkg_group_divider);
+ if (groupName != null) {
+ groupNameView.setText(groupName);
+ groupNameView.setVisibility(View.VISIBLE);
+ groupDividerView.setVisibility(View.VISIBLE);
+ } else {
+ groupNameView.setVisibility(View.GONE);
+ groupDividerView.setVisibility(View.GONE);
+ }
// Settings button.
final View settingsButton = findViewById(R.id.info);
@@ -257,10 +273,9 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
}
- private void bindPrompt() throws RemoteException {
+ private void bindPrompt() {
final TextView blockPrompt = findViewById(R.id.block_prompt);
bindName();
- bindGroup();
if (mIsNonblockable) {
blockPrompt.setText(R.string.notification_unblockable_desc);
} else {
@@ -283,60 +298,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
}
- private void bindDelegate() {
- TextView delegateView = findViewById(R.id.delegate_name);
- TextView dividerView = findViewById(R.id.pkg_divider);
-
- CharSequence delegatePkg = null;
- if (!TextUtils.equals(mPackageName, mDelegatePkg)) {
- // this notification was posted by a delegate!
- ApplicationInfo info;
- try {
- info = mPm.getApplicationInfo(
- mDelegatePkg,
- PackageManager.MATCH_UNINSTALLED_PACKAGES
- | PackageManager.MATCH_DISABLED_COMPONENTS
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_DIRECT_BOOT_AWARE);
- if (info != null) {
- delegatePkg = String.valueOf(mPm.getApplicationLabel(info));
- }
- } catch (PackageManager.NameNotFoundException e) {}
- }
- if (delegatePkg != null) {
- delegateView.setText(mContext.getResources().getString(
- R.string.notification_delegate_header, delegatePkg));
- delegateView.setVisibility(View.VISIBLE);
- dividerView.setVisibility(View.VISIBLE);
- } else {
- delegateView.setVisibility(View.GONE);
- dividerView.setVisibility(View.GONE);
- }
- }
-
- private void bindGroup() throws RemoteException {
- // Set group information if this channel has an associated group.
- CharSequence groupName = null;
- if (mSingleNotificationChannel != null && mSingleNotificationChannel.getGroup() != null) {
- final NotificationChannelGroup notificationChannelGroup =
- mINotificationManager.getNotificationChannelGroupForPackage(
- mSingleNotificationChannel.getGroup(), mPackageName, mAppUid);
- if (notificationChannelGroup != null) {
- groupName = notificationChannelGroup.getName();
- }
- }
- TextView groupNameView = findViewById(R.id.group_name);
- TextView groupDividerView = findViewById(R.id.pkg_group_divider);
- if (groupName != null) {
- groupNameView.setText(groupName);
- groupNameView.setVisibility(View.VISIBLE);
- groupDividerView.setVisibility(View.VISIBLE);
- } else {
- groupNameView.setVisibility(View.GONE);
- groupDividerView.setVisibility(View.GONE);
- }
- }
-
@VisibleForTesting
void logBlockingHelperCounter(String counterTag) {
if (mIsForBlockingHelper) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 936c2b879fa7..003f158d7822 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -113,7 +113,6 @@ import com.android.systemui.statusbar.notification.row.NotificationGuts;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationSnooze;
import com.android.systemui.statusbar.notification.row.StackScrollerDecorView;
-import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
@@ -673,37 +672,29 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.DECORATOR)
private void drawBackground(Canvas canvas) {
- final int lockScreenLeft = mSidePaddings;
- final int lockScreenRight = getWidth() - mSidePaddings;
- final int lockScreenTop = mCurrentBounds.top;
- final int lockScreenBottom = mCurrentBounds.bottom;
- final int darkLeft = getWidth() / 2;
- final int darkTop = mRegularTopPadding;
-
- if (mAmbientState.hasPulsingNotifications()) {
- // No divider, we have a notification icon instead
- } else if (mAmbientState.isFullyDark()) {
- // Only draw divider on AOD if we actually have notifications
- if (mFirstVisibleBackgroundChild != null) {
- canvas.drawRect(darkLeft, darkTop, darkLeft, darkTop, mBackgroundPaint);
- }
- } else {
- float yProgress = 1 - mInterpolatedDarkAmount;
- float xProgress = mDarkXInterpolator.getInterpolation(
- (1 - mLinearDarkAmount) * mBackgroundXFactor);
+ int lockScreenLeft = mSidePaddings;
+ int lockScreenRight = getWidth() - mSidePaddings;
+ int lockScreenTop = mCurrentBounds.top;
+ int lockScreenBottom = mCurrentBounds.bottom;
+ int darkLeft = getWidth() / 2;
+ int darkTop = mRegularTopPadding;
- mBackgroundAnimationRect.set(
- (int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress),
- (int) MathUtils.lerp(darkTop, lockScreenTop, yProgress),
- (int) MathUtils.lerp(darkLeft, lockScreenRight, xProgress),
- (int) MathUtils.lerp(darkTop, lockScreenBottom, yProgress));
+ float yProgress = 1 - mInterpolatedDarkAmount;
+ float xProgress = mDarkXInterpolator.getInterpolation(
+ (1 - mLinearDarkAmount) * mBackgroundXFactor);
- if (!mAmbientState.isDark() || mFirstVisibleBackgroundChild != null) {
- canvas.drawRoundRect(mBackgroundAnimationRect.left, mBackgroundAnimationRect.top,
- mBackgroundAnimationRect.right, mBackgroundAnimationRect.bottom,
- mCornerRadius, mCornerRadius, mBackgroundPaint);
- }
+ mBackgroundAnimationRect.set(
+ (int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress),
+ (int) MathUtils.lerp(darkTop, lockScreenTop, yProgress),
+ (int) MathUtils.lerp(darkLeft, lockScreenRight, xProgress),
+ (int) MathUtils.lerp(darkTop, lockScreenBottom, yProgress));
+
+ if (!mAmbientState.isDark() || mFirstVisibleBackgroundChild != null) {
+ canvas.drawRoundRect(mBackgroundAnimationRect.left, mBackgroundAnimationRect.top,
+ mBackgroundAnimationRect.right, mBackgroundAnimationRect.bottom,
+ mCornerRadius, mCornerRadius, mBackgroundPaint);
}
+
updateClipping();
}
@@ -1110,14 +1101,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
public void updateClipping() {
- boolean animatingClipping = mInterpolatedDarkAmount > 0 && mInterpolatedDarkAmount < 1;
boolean clipped = mRequestedClipBounds != null && !mInHeadsUpPinnedMode
&& !mHeadsUpAnimatingAway;
if (mIsClipped != clipped) {
mIsClipped = clipped;
}
- if (animatingClipping) {
+ if (mAmbientState.isDarkAtAll()) {
setClipBounds(mBackgroundAnimationRect);
} else if (clipped) {
setClipBounds(mRequestedClipBounds);
@@ -4257,13 +4247,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
boolean nowDarkAtAll = mAmbientState.isDarkAtAll();
if (nowFullyDark != wasFullyDark) {
updateContentHeight();
- DozeParameters dozeParameters = DozeParameters.getInstance(mContext);
- if (nowFullyDark && dozeParameters.shouldControlScreenOff()) {
- mShelf.fadeInTranslating();
- }
- if (mIconAreaController != null) {
- mIconAreaController.setFullyDark(nowFullyDark);
- }
+ }
+ if (mIconAreaController != null) {
+ mIconAreaController.setDarkAmount(interpolatedDarkAmount);
}
if (!wasDarkAtAll && nowDarkAtAll) {
resetExposedMenuView(true /* animate */, true /* animate */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index fa63831b5e1b..d4de8fce3750 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -20,7 +20,6 @@ import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO;
import android.annotation.Nullable;
import android.app.Fragment;
-import android.app.StatusBarManager;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -35,8 +34,8 @@ import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
-import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.EncryptionHelper;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.NetworkController;
@@ -55,6 +54,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
public static final int FADE_IN_DURATION = 320;
public static final int FADE_IN_DELAY = 50;
private PhoneStatusBarView mStatusBar;
+ private StatusBarStateController mStatusBarStateController;
private KeyguardMonitor mKeyguardMonitor;
private NetworkController mNetworkController;
private LinearLayout mSystemIconArea;
@@ -78,6 +78,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
super.onCreate(savedInstanceState);
mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
mNetworkController = Dependency.get(NetworkController.class);
+ mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mStatusBarComponent = SysUiServiceProvider.getComponent(getContext(), StatusBar.class);
mCommandQueue = SysUiServiceProvider.getComponent(getContext(), CommandQueue.class);
}
@@ -207,6 +208,12 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
state |= DISABLE_SYSTEM_INFO;
}
}
+
+ if (mStatusBarStateController.isDozing()) {
+ state |= DISABLE_CLOCK | DISABLE_SYSTEM_INFO;
+ state &= ~DISABLE_NOTIFICATION_ICONS;
+ }
+
return state;
}
@@ -241,7 +248,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
* don't set the clock GONE otherwise it'll mess up the animation.
*/
private int clockHiddenMode() {
- if (!mStatusBar.isClosed() && !mKeyguardMonitor.isShowing()) {
+ if (!mStatusBar.isClosed() && !mKeyguardMonitor.isShowing()
+ && !mStatusBarStateController.isDozing()) {
return View.INVISIBLE;
}
return View.GONE;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 25db4f20a450..a0597dc66d14 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.phone;
import android.annotation.NonNull;
-import android.content.Context;
import android.os.Handler;
import android.util.Log;
@@ -33,7 +32,6 @@ public class DozeScrimController {
private final DozeParameters mDozeParameters;
private final Handler mHandler = new Handler();
- private final ScrimController mScrimController;
private boolean mDozing;
private DozeHost.PulseCallback mPulseCallback;
@@ -83,9 +81,7 @@ public class DozeScrimController {
}
};
- public DozeScrimController(ScrimController scrimController, Context context,
- DozeParameters dozeParameters) {
- mScrimController = scrimController;
+ public DozeScrimController(DozeParameters dozeParameters) {
mDozeParameters = dozeParameters;
}
@@ -117,8 +113,6 @@ public class DozeScrimController {
// be invoked when we're done so that the caller can drop the pulse wakelock.
mPulseCallback = callback;
mPulseReason = reason;
-
- mScrimController.transitionTo(ScrimState.PULSING, mScrimCallback);
}
public void pulseOutNow() {
@@ -180,13 +174,11 @@ public class DozeScrimController {
mHandler.removeCallbacks(mPulseOutExtended);
if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
if (!mDozing) return;
- mScrimController.transitionTo(ScrimState.AOD,
- new ScrimController.Callback() {
- @Override
- public void onDisplayBlanked() {
- pulseFinished();
- }
- });
+ pulseFinished();
}
};
+
+ public ScrimController.Callback getScrimCallback() {
+ return mScrimCallback;
+ }
} \ No newline at end of file
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 e85ff8ef22c0..96b753679796 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -347,6 +347,7 @@ public class KeyguardStatusBarView extends RelativeLayout
mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
onThemeChanged();
+ updateDozeState();
}
@Override
@@ -514,8 +515,7 @@ public class KeyguardStatusBarView extends RelativeLayout
private void updateDozeState() {
float alpha = 1f - mDarkAmount;
int visibility = alpha != 0f ? VISIBLE : INVISIBLE;
- mCarrierLabel.setAlpha(alpha);
- mCarrierLabel.setVisibility(visibility);
+ mCarrierLabel.setAlpha(alpha * alpha);
mStatusIconContainer.setAlpha(alpha);
mStatusIconContainer.setVisibility(visibility);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 5960b13e8e31..f50e9a2c3d08 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -1,5 +1,7 @@
package com.android.systemui.statusbar.phone;
+import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+
import android.app.NotificationManager;
import android.content.Context;
import android.content.res.Resources;
@@ -15,8 +17,10 @@ import androidx.collection.ArrayMap;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
+import com.android.internal.widget.ViewClippingUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.NotificationData;
@@ -45,7 +49,8 @@ public class NotificationIconAreaController implements DarkReceiver {
@Override
public void onTuningChanged(String key, String newValue) {
if (key.equals(LOW_PRIORITY)) {
- mShowLowPriority = "1".equals(newValue);
+ mShowLowPriority = "1".equals(newValue)
+ || !NotificationLockscreenUserManager.AUTO_DEMOTE_NOTIFICATIONS;
if (mNotificationScrollLayout != null) {
updateStatusBarIcons();
}
@@ -67,6 +72,22 @@ public class NotificationIconAreaController implements DarkReceiver {
private boolean mFullyDark;
private boolean mShowLowPriority;
+ /**
+ * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake.
+ */
+ private float mDarkAmount;
+ /**
+ * Maximum translation to avoid burn in.
+ */
+ private int mBurnInOffset;
+ /**
+ * Height of the keyguard status bar (not the one after unlocking.)
+ */
+ private int mKeyguardStatusBarHeight;
+
+ private final ViewClippingUtil.ClippingParameters mClippingParameters =
+ view -> view instanceof StatusBarWindowView;
+
public NotificationIconAreaController(Context context, StatusBar statusBar) {
mStatusBar = statusBar;
mContrastColorUtil = ContrastColorUtil.getInstance(context);
@@ -123,6 +144,9 @@ public class NotificationIconAreaController implements DarkReceiver {
Resources res = context.getResources();
mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding);
+ mBurnInOffset = res.getDimensionPixelSize(R.dimen.default_burn_in_prevention_offset);
+ mKeyguardStatusBarHeight = res
+ .getDimensionPixelSize(R.dimen.status_bar_header_height_keyguard);
}
/**
@@ -206,13 +230,14 @@ public class NotificationIconAreaController implements DarkReceiver {
private void updateShelfIcons() {
updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons,
- NotificationShelf.SHOW_AMBIENT_ICONS, !mFullyDark /* showLowPriority */,
+ true /* showAmbient */, !mFullyDark /* showLowPriority */,
false /* hideDismissed */, mFullyDark /* hideRepliedMessages */);
}
public void updateStatusBarIcons() {
updateIconsForLayout(entry -> entry.icon, mNotificationIcons,
- false /* showAmbient */, false /* showLowPriority */, true /* hideDismissed */,
+ false /* showAmbient */, mShowLowPriority /* showLowPriority */,
+ true /* hideDismissed */,
true /* hideRepliedMessages */);
}
@@ -351,9 +376,22 @@ public class NotificationIconAreaController implements DarkReceiver {
v.setDecorColor(mIconTint);
}
- public void setFullyDark(boolean fullyDark) {
- mFullyDark = fullyDark;
- updateShelfIcons();
+ /**
+ * Dark amount, from 0 to 1, representing being awake or in AOD.
+ */
+ public void setDarkAmount(float darkAmount) {
+ mDarkAmount = darkAmount;
+ if (darkAmount == 0 || darkAmount == 1) {
+ ViewClippingUtil.setClippingDeactivated(mNotificationIcons, darkAmount != 0,
+ mClippingParameters);
+ }
+ dozeTimeTick();
+
+ boolean fullyDark = darkAmount == 1f;
+ if (mFullyDark != fullyDark) {
+ mFullyDark = fullyDark;
+ updateShelfIcons();
+ }
}
public void setDark(boolean dark) {
@@ -368,4 +406,15 @@ public class NotificationIconAreaController implements DarkReceiver {
public void setIsolatedIconLocation(Rect iconDrawingRect, boolean requireStateUpdate) {
mNotificationIcons.setIsolatedIconLocation(iconDrawingRect, requireStateUpdate);
}
+
+ /**
+ * Moves icons whenever the device wakes up in AOD, to avoid burn in.
+ */
+ public void dozeTimeTick() {
+ int yOffset = (mKeyguardStatusBarHeight - getHeight()) / 2;
+ int translationX = getBurnInOffset(mBurnInOffset, true /* xAxis */);
+ int translationY = getBurnInOffset(mBurnInOffset, false /* xAxis */) + yOffset;
+ mNotificationIcons.setTranslationX(translationX * mDarkAmount);
+ mNotificationIcons.setTranslationY(translationY * mDarkAmount);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 0a724bd50049..964b2210dd18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -16,8 +16,8 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DURATION;
import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DELAY;
+import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DURATION;
import android.content.Context;
import android.content.res.Configuration;
@@ -26,10 +26,11 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Icon;
-import androidx.collection.ArrayMap;
import android.util.AttributeSet;
import android.view.View;
+import androidx.collection.ArrayMap;
+
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -127,7 +128,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
}
}.setDuration(CONTENT_FADE_DURATION);
- public static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5;
public static final int MAX_STATIC_ICONS = 4;
private static final int MAX_DOTS = 1;
@@ -371,8 +371,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
float translationX = getActualPaddingStart();
int firstOverflowIndex = -1;
int childCount = getChildCount();
- int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK :
- mIsStaticLayout ? MAX_STATIC_ICONS : childCount;
+ int maxVisibleIcons = mIsStaticLayout ? MAX_STATIC_ICONS : childCount;
float layoutEnd = getLayoutEnd();
float overflowStart = getMaxOverflowStart();
mVisualOverflowStart = 0;
@@ -388,9 +387,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
&& iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
boolean noOverflowAfter = i == childCount - 1;
- float drawingScale = mDark && view instanceof StatusBarIconView
- ? ((StatusBarIconView) view).getIconScaleFullyDark()
- : 1f;
if (mOpenedAmount != 0.0f) {
noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow;
}
@@ -406,7 +402,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mVisualOverflowStart = Math.min(translationX, mVisualOverflowStart);
}
}
- translationX += iconState.iconAppearAmount * view.getWidth() * drawingScale;
+ translationX += iconState.iconAppearAmount * view.getWidth();
}
mNumDots = 0;
if (firstOverflowIndex != -1) {
@@ -435,26 +431,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
mLastVisibleIconState = mIconStates.get(lastChild);
mFirstVisibleIconState = mIconStates.get(getChildAt(0));
}
- boolean center = mDark;
- if (center && translationX < getLayoutEnd()) {
- float initialTranslation =
- mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation;
- float contentWidth = getFinalTranslationX() - initialTranslation;
- float availableSpace = getLayoutEnd() - getActualPaddingStart();
- float delta = (availableSpace - contentWidth) / 2;
-
- if (firstOverflowIndex != -1) {
- // If we have an overflow, only count those half for centering because the dots
- // don't have a lot of visual weight.
- float deltaIgnoringOverflow = (getLayoutEnd() - mVisualOverflowStart) / 2;
- delta = (deltaIgnoringOverflow + delta) / 2;
- }
- for (int i = 0; i < childCount; i++) {
- View view = getChildAt(i);
- IconState iconState = mIconStates.get(view);
- iconState.xTranslation += delta;
- }
- }
if (isLayoutRtl()) {
for (int i = 0; i < childCount; i++) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 553165b40153..0e6efc8472b6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -57,6 +57,7 @@ import android.text.format.DateFormat;
import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
+
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
@@ -391,7 +392,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
zenDescription = mContext.getString(R.string.interruption_level_priority);
}
- if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConfig())) {
+ if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConsolidatedPolicy())) {
if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
volumeVisible = true;
volumeIconId = R.drawable.stat_sys_ringer_vibrate;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 2b661abce04a..2337857eda1e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -882,8 +882,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mContext.getSystemService(AlarmManager.class));
mNotificationPanel.initDependencies(this, mGroupManager, mNotificationShelf,
mHeadsUpManager, mNotificationIconAreaController, mScrimController);
- mDozeScrimController = new DozeScrimController(mScrimController, context,
- DozeParameters.getInstance(context));
+ mDozeScrimController = new DozeScrimController(DozeParameters.getInstance(context));
mBackdrop = mStatusBarWindow.findViewById(R.id.backdrop);
mBackdropFront = mBackdrop.findViewById(R.id.backdrop_front);
@@ -1519,7 +1518,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
public boolean isPulsing() {
- return mDozeScrimController != null && mDozeScrimController.isPulsing();
+ return mAmbientPulseManager.hasNotifications();
}
public boolean isLaunchTransitionFadingAway() {
@@ -3648,7 +3647,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationPanel.setTouchAndAnimationDisabled(false);
updateVisibleToUser();
updateIsKeyguard();
- updateScrimController();
}
};
@@ -3834,8 +3832,9 @@ public class StatusBar extends SystemUI implements DemoMode,
} else if (mBrightnessMirrorVisible) {
mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
} else if (isPulsing()) {
- // Handled in DozeScrimController#setPulsing
- } else if (mDozing) {
+ mScrimController.transitionTo(ScrimState.PULSING,
+ mDozeScrimController.getScrimCallback());
+ } else if (mDozing && !wakeAndUnlocking) {
mScrimController.transitionTo(ScrimState.AOD);
} else if (mIsKeyguard && !wakeAndUnlocking) {
mScrimController.transitionTo(mNotificationPanel.isSemiAwake()
@@ -3928,8 +3927,12 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationPanel.setPulsing(pulsing);
mVisualStabilityManager.setPulsing(pulsing);
mIgnoreTouchWhilePulsing = false;
+ updateScrimController();
}
}, reason);
+ // DozeScrimController is in pulse state, now let's ask ScrimController to start
+ // pulsing and draw the black frame, if necessary.
+ updateScrimController();
}
@Override
@@ -3961,6 +3964,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void dozeTimeTick() {
mNotificationPanel.dozeTimeTick();
+ mNotificationIconAreaController.dozeTimeTick();
if (mAmbientIndicationContainer instanceof DozeReceiver) {
((DozeReceiver) mAmbientIndicationContainer).dozeTimeTick();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index c5603016fc56..df99a9c13855 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -48,6 +48,7 @@ import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
+import com.android.systemui.statusbar.policy.KeyguardMonitorImpl;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -124,7 +125,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
// Dismiss action to be launched when we stop dozing or the keyguard is gone.
private DismissWithActionRequest mPendingWakeupAction;
- private final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
+ private final KeyguardMonitorImpl mKeyguardMonitor =
+ (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class);
private final NotificationMediaManager mMediaManager =
Dependency.get(NotificationMediaManager.class);
@@ -202,6 +204,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
public void show(Bundle options) {
mShowing = true;
mStatusBarWindowController.setKeyguardShowing(true);
+ mKeyguardMonitor.notifyKeyguardState(
+ mShowing, mKeyguardMonitor.isSecure(), mKeyguardMonitor.isOccluded());
reset(true /* hideBouncerWhenShowing */);
StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
StatsLog.KEYGUARD_STATE_CHANGED__STATE__SHOWN);
@@ -424,6 +428,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
*/
public void hide(long startTime, long fadeoutDuration) {
mShowing = false;
+ mKeyguardMonitor.notifyKeyguardState(
+ mShowing, mKeyguardMonitor.isSecure(), mKeyguardMonitor.isOccluded());
launchPendingWakeupAction();
if (KeyguardUpdateMonitor.getInstance(mContext).needsSlowUnlockTransition()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
index 06f9658a0902..a743d41e8d3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
@@ -33,7 +33,6 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.view.View;
import android.view.ViewParent;
-import android.view.ViewTreeObserver;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.ActivityStarter;
@@ -44,7 +43,6 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationRemoteInputManager.Callback;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateController;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -208,8 +206,8 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks {
}
@Override
- public boolean handleRemoteViewClick(View view, PendingIntent pendingIntent,
- Intent fillInIntent, NotificationRemoteInputManager.ClickHandler defaultHandler) {
+ public boolean handleRemoteViewClick(PendingIntent pendingIntent,
+ NotificationRemoteInputManager.ClickHandler defaultHandler) {
final boolean isActivity = pendingIntent.isActivity();
if (isActivity) {
final boolean afterKeyguardGone = PreviewInflater.wouldLaunchResolverActivity(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
index 4ee805934522..ad19729aa10e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.policy;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.net.Uri;
import android.service.notification.Condition;
@@ -29,6 +30,8 @@ public interface ZenModeController extends CallbackController<Callback> {
int getZen();
ZenRule getManualRule();
ZenModeConfig getConfig();
+ /** Gets consolidated zen policy that will apply when DND is on in priority only mode */
+ NotificationManager.Policy getConsolidatedPolicy();
long getNextAlarm();
boolean isZenAvailable();
ComponentName getEffectsSuppressor();
@@ -45,6 +48,8 @@ public interface ZenModeController extends CallbackController<Callback> {
default void onEffectsSupressorChanged() {}
default void onManualRuleChanged(ZenRule rule) {}
default void onConfigChanged(ZenModeConfig config) {}
+ /** Called when the consolidated zen policy changes */
+ default void onConsolidatedPolicyChanged(NotificationManager.Policy policy) {}
}
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index 8d2552f9b166..89ccff03133d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -69,6 +69,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker
private ZenModeConfig mConfig;
private int mZenMode;
private long mZenUpdateTime;
+ private NotificationManager.Policy mConsolidatedNotificationPolicy;
public ZenModeControllerImpl(Context context, Handler handler) {
super(context);
@@ -91,6 +92,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker
updateZenMode(mModeSetting.getValue());
mConfigSetting.setListening(true);
updateZenModeConfig();
+ updateConsolidatedNotificationPolicy();
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mSetupObserver = new SetupObserver(handler);
mSetupObserver.register();
@@ -153,6 +155,11 @@ public class ZenModeControllerImpl extends CurrentUserTracker
}
@Override
+ public NotificationManager.Policy getConsolidatedPolicy() {
+ return mConsolidatedNotificationPolicy;
+ }
+
+ @Override
public long getNextAlarm() {
final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId);
return info != null ? info.getTriggerTime() : 0;
@@ -217,6 +224,12 @@ public class ZenModeControllerImpl extends CurrentUserTracker
}
}
+ private void fireConsolidatedPolicyChanged(NotificationManager.Policy policy) {
+ synchronized (mCallbacksLock) {
+ Utils.safeForeach(mCallbacks, c -> c.onConsolidatedPolicyChanged(policy));
+ }
+ }
+
@VisibleForTesting
protected void fireConfigChanged(ZenModeConfig config) {
synchronized (mCallbacksLock) {
@@ -231,6 +244,16 @@ public class ZenModeControllerImpl extends CurrentUserTracker
}
@VisibleForTesting
+ protected void updateConsolidatedNotificationPolicy() {
+ final NotificationManager.Policy policy = mNoMan.getConsolidatedNotificationPolicy();
+ if (!Objects.equals(policy, mConsolidatedNotificationPolicy)) {
+ mConsolidatedNotificationPolicy = policy;
+ fireConsolidatedPolicyChanged(policy);
+ }
+ }
+
+
+ @VisibleForTesting
protected void updateZenModeConfig() {
final ZenModeConfig config = mNoMan.getZenModeConfig();
if (Objects.equals(config, mConfig)) return;
@@ -238,9 +261,19 @@ public class ZenModeControllerImpl extends CurrentUserTracker
mConfig = config;
mZenUpdateTime = System.currentTimeMillis();
fireConfigChanged(config);
+
final ZenRule newRule = config != null ? config.manualRule : null;
- if (Objects.equals(oldRule, newRule)) return;
- fireManualRuleChanged(newRule);
+ if (!Objects.equals(oldRule, newRule)) {
+ fireManualRuleChanged(newRule);
+ }
+
+ final NotificationManager.Policy consolidatedPolicy =
+ mNoMan.getConsolidatedNotificationPolicy();
+ if (!Objects.equals(consolidatedPolicy, mConsolidatedNotificationPolicy)) {
+ mConsolidatedNotificationPolicy = consolidatedPolicy;
+ fireConsolidatedPolicyChanged(consolidatedPolicy);
+ }
+
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -260,6 +293,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker
pw.println("ZenModeControllerImpl:");
pw.println(" mZenMode=" + mZenMode);
pw.println(" mConfig=" + mConfig);
+ pw.println(" mConsolidatedNotificationPolicy=" + mConsolidatedNotificationPolicy);
pw.println(" mZenUpdateTime=" + DateFormat.format("MM-dd HH:mm:ss", mZenUpdateTime));
}
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
index 4102e63f7330..ed2ad79bdb50 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
@@ -23,7 +23,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
-import android.hardware.usb.IUsbManager;
+import android.debug.IAdbManager;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.IBinder;
@@ -153,12 +153,12 @@ public class UsbDebuggingActivity extends AlertActivity
boolean allow = (which == AlertDialog.BUTTON_POSITIVE);
boolean alwaysAllow = allow && mAlwaysAllow.isChecked();
try {
- IBinder b = ServiceManager.getService(USB_SERVICE);
- IUsbManager service = IUsbManager.Stub.asInterface(b);
+ IBinder b = ServiceManager.getService(ADB_SERVICE);
+ IAdbManager service = IAdbManager.Stub.asInterface(b);
if (allow) {
- service.allowUsbDebugging(alwaysAllow, mKey);
+ service.allowDebugging(alwaysAllow, mKey);
} else {
- service.denyUsbDebugging();
+ service.denyDebugging();
}
} catch (Exception e) {
Log.e(TAG, "Unable to notify Usb service", e);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
index 62ca3f34bd48..9cbe4152b5c4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
@@ -21,10 +21,11 @@ import static android.view.View.VISIBLE;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import android.graphics.Color;
@@ -34,7 +35,6 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.text.TextPaint;
import android.view.LayoutInflater;
-import android.view.ViewGroup;
import android.widget.TextClock;
import com.android.systemui.SysuiTestCase;
@@ -68,6 +68,7 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
mKeyguardClockSwitch =
(KeyguardClockSwitch) layoutInflater.inflate(R.layout.keyguard_clock_switch, null);
MockitoAnnotations.initMocks(this);
+ when(mClockView.getPaint()).thenReturn(mock(TextPaint.class));
}
@Test
@@ -91,8 +92,6 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- TextPaint paint = mock(TextPaint.class);
- doReturn(paint).when(mClockView).getPaint();
PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
listener.onPluginConnected(plugin, null);
@@ -102,16 +101,38 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
}
@Test
+ public void onPluginConnected_nullView() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin, null);
+ verify(mClockView, never()).setVisibility(GONE);
+ }
+
+ @Test
+ public void onPluginConnected_showSecondPluginClock() {
+ // GIVEN a plugin has already connected
+ ClockPlugin plugin1 = mock(ClockPlugin.class);
+ when(plugin1.getView()).thenReturn(new TextClock(getContext()));
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin1, null);
+ // WHEN a second plugin is connected
+ ClockPlugin plugin2 = mock(ClockPlugin.class);
+ when(plugin2.getView()).thenReturn(new TextClock(getContext()));
+ listener.onPluginConnected(plugin2, null);
+ // THEN only the view from the second plugin should be a child of KeyguardClockSwitch.
+ assertThat(plugin2.getView().getParent()).isEqualTo(mKeyguardClockSwitch);
+ assertThat(plugin1.getView().getParent()).isNull();
+ }
+
+ @Test
public void onPluginDisconnected_showDefaultClock() {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
mClockView.setVisibility(GONE);
- mKeyguardClockSwitch.addView(plugin.getView(), -1,
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin, null);
listener.onPluginDisconnected(plugin);
verify(mClockView).setVisibility(VISIBLE);
@@ -119,6 +140,50 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
}
@Test
+ public void onPluginDisconnected_nullView() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin, null);
+ listener.onPluginDisconnected(plugin);
+ verify(mClockView, never()).setVisibility(GONE);
+ }
+
+ @Test
+ public void onPluginDisconnected_firstOfTwoDisconnected() {
+ // GIVEN two plugins are connected
+ ClockPlugin plugin1 = mock(ClockPlugin.class);
+ when(plugin1.getView()).thenReturn(new TextClock(getContext()));
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin1, null);
+ ClockPlugin plugin2 = mock(ClockPlugin.class);
+ when(plugin2.getView()).thenReturn(new TextClock(getContext()));
+ listener.onPluginConnected(plugin2, null);
+ // WHEN the first plugin is disconnected
+ listener.onPluginDisconnected(plugin1);
+ // THEN the view from the second plugin is still a child of KeyguardClockSwitch.
+ assertThat(plugin2.getView().getParent()).isEqualTo(mKeyguardClockSwitch);
+ assertThat(plugin1.getView().getParent()).isNull();
+ }
+
+ @Test
+ public void onPluginDisconnected_secondOfTwoDisconnected() {
+ // GIVEN two plugins are connected
+ ClockPlugin plugin1 = mock(ClockPlugin.class);
+ when(plugin1.getView()).thenReturn(new TextClock(getContext()));
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin1, null);
+ ClockPlugin plugin2 = mock(ClockPlugin.class);
+ when(plugin2.getView()).thenReturn(new TextClock(getContext()));
+ listener.onPluginConnected(plugin2, null);
+ // WHEN the second plugin is disconnected
+ listener.onPluginDisconnected(plugin2);
+ // THEN the default clock should be shown.
+ verify(mClockView).setVisibility(VISIBLE);
+ assertThat(plugin1.getView().getParent()).isNull();
+ assertThat(plugin2.getView().getParent()).isNull();
+ }
+
+ @Test
public void setTextColor_defaultClockSetTextColor() {
mKeyguardClockSwitch.setTextColor(Color.YELLOW);
@@ -130,8 +195,6 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- TextPaint paint = mock(TextPaint.class);
- doReturn(paint).when(mClockView).getPaint();
PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
listener.onPluginConnected(plugin, null);
@@ -156,8 +219,6 @@ public class KeyguardClockSwitchTest extends SysuiTestCase {
ClockPlugin plugin = mock(ClockPlugin.class);
TextClock pluginView = new TextClock(getContext());
when(plugin.getView()).thenReturn(pluginView);
- TextPaint paint = mock(TextPaint.class);
- doReturn(paint).when(mClockView).getPaint();
Style style = mock(Style.class);
PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
listener.onPluginConnected(plugin, null);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java
new file mode 100644
index 000000000000..4d33d437ff79
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui;
+
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class InitControllerTest extends SysuiTestCase {
+
+ private InitController mInitController = new InitController();
+
+ @Test
+ public void testInitControllerExecutesTasks() {
+ boolean[] runs = {false, false, false};
+ mInitController.addPostInitTask(() -> {
+ runs[0] = true;
+ });
+ mInitController.addPostInitTask(() -> {
+ runs[1] = true;
+ });
+ mInitController.addPostInitTask(() -> {
+ runs[2] = true;
+ });
+ assertFalse(runs[0] || runs[1] || runs[2]);
+
+ mInitController.executePostInitTasks();
+ assertTrue(runs[0] && runs[1] && runs[2]);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void testInitControllerThrowsWhenTasksAreAddedAfterExecution() {
+ boolean[] runs = {false, false, false};
+ mInitController.addPostInitTask(() -> {
+ runs[0] = true;
+ });
+ mInitController.addPostInitTask(() -> {
+ runs[1] = true;
+ });
+
+ mInitController.executePostInitTasks();
+
+ // Throws
+ mInitController.addPostInitTask(() -> {
+ runs[2] = true;
+ });
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt
new file mode 100644
index 000000000000..7204d310a76d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.privacy
+
+import android.support.test.filters.SmallTest
+import android.support.test.runner.AndroidJUnit4
+import com.android.systemui.SysuiTestCase
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class PrivacyDialogBuilderTest : SysuiTestCase() {
+
+ companion object {
+ val MILLIS_IN_MINUTE: Long = 1000 * 60
+ val NOW = 4 * MILLIS_IN_MINUTE
+ }
+
+ @Test
+ fun testGenerateText_multipleApps() {
+ val bar2 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication(
+ "Bar", context), 2 * MILLIS_IN_MINUTE)
+ val bar3 = PrivacyItem(Privacy.TYPE_LOCATION, PrivacyApplication(
+ "Bar", context), 3 * MILLIS_IN_MINUTE)
+ val foo0 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication(
+ "Foo", context), 0)
+ val baz1 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication(
+ "Baz", context), 1 * MILLIS_IN_MINUTE)
+
+ val items = listOf(bar2, foo0, baz1, bar3)
+
+ val textBuilder = PrivacyDialogBuilder(context, items)
+
+ val textList = textBuilder.generateText(NOW)
+ assertEquals(2, textList.size)
+ assertEquals("Bar, Foo, Baz are using your camera", textList[0])
+ assertEquals("Bar is using your location for the last 1 min", textList[1])
+ }
+
+ @Test
+ fun testGenerateText_singleApp() {
+ val bar2 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication(
+ "Bar", context), 0)
+ val bar1 = PrivacyItem(Privacy.TYPE_LOCATION, PrivacyApplication(
+ "Bar", context), 0)
+
+ val items = listOf(bar2, bar1)
+
+ val textBuilder = PrivacyDialogBuilder(context, items)
+ val textList = textBuilder.generateText(NOW)
+ assertEquals(1, textList.size)
+ assertEquals("Bar is using your camera, location", textList[0])
+ }
+
+ @Test
+ fun testGenerateText_singleApp_singleType() {
+ val bar2 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication(
+ "Bar", context), 2 * MILLIS_IN_MINUTE)
+ val items = listOf(bar2)
+ val textBuilder = PrivacyDialogBuilder(context, items)
+ val textList = textBuilder.generateText(NOW)
+ assertEquals(1, textList.size)
+ assertEquals("Bar is using your camera for the last 2 min", textList[0])
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
index fdb66cca92b2..0d2d3451b90c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInflaterTest.java
@@ -167,7 +167,7 @@ public class NotificationInflaterTest extends SysuiTestCase {
CountDownLatch countDownLatch = new CountDownLatch(1);
NotificationInflater.applyRemoteView(result, FLAG_CONTENT_VIEW_EXPANDED, 0,
new ArrayMap() /* cachedContentViews */, mRow, false /* redactAmbient */,
- true /* isNewView */, new RemoteViews.OnClickHandler(),
+ true /* isNewView */, (v, p, r) -> true,
new NotificationInflater.InflationCallback() {
@Override
public void handleInflationException(StatusBarNotification notification,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
index 02a618b7f82a..ca968a8af85b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java
@@ -129,7 +129,7 @@ public class NotificationInfoTest extends SysuiTestCase {
.thenReturn(packageInfo);
final ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = TEST_UID; // non-zero
- when(mMockPackageManager.getApplicationInfo(eq(TEST_PACKAGE_NAME), anyInt())).thenReturn(
+ when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
applicationInfo);
final PackageInfo systemPackageInfo = new PackageInfo();
systemPackageInfo.packageName = TEST_SYSTEM_PACKAGE_NAME;
@@ -190,35 +190,6 @@ public class NotificationInfoTest extends SysuiTestCase {
}
@Test
- public void testBindNotification_noDelegate() throws Exception {
- mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false);
- final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
- assertEquals(GONE, nameView.getVisibility());
- final TextView dividerView = mNotificationInfo.findViewById(R.id.pkg_divider);
- assertEquals(GONE, dividerView.getVisibility());
- }
-
- @Test
- public void testBindNotification_delegate() throws Exception {
- mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, "other", 0, null, TEST_UID, 0,
- new Notification(), UserHandle.CURRENT, null, 0);
- final ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.uid = 7; // non-zero
- when(mMockPackageManager.getApplicationInfo(eq("other"), anyInt())).thenReturn(
- applicationInfo);
- when(mMockPackageManager.getApplicationLabel(any())).thenReturn("Other");
-
- mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
- TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false);
- final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
- assertEquals(VISIBLE, nameView.getVisibility());
- assertTrue(nameView.getText().toString().contains("Other"));
- final TextView dividerView = mNotificationInfo.findViewById(R.id.pkg_divider);
- assertEquals(VISIBLE, dividerView.getVisibility());
- }
-
- @Test
public void testBindNotification_GroupNameHiddenIfNoGroup() throws Exception {
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index d2fe82fd93c4..fdd89def6641 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -147,7 +147,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
doNothing().when(mGroupManager).collapseAllGroups();
doNothing().when(mExpandHelper).cancelImmediately();
doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean());
- doNothing().when(notificationShelf).fadeInTranslating();
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
index 203ebe6d5132..fe36b6d14748 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
@@ -16,14 +16,10 @@
package com.android.systemui.statusbar.phone;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import android.os.Debug;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -43,41 +39,26 @@ import org.mockito.MockitoAnnotations;
public class DozeScrimControllerTest extends SysuiTestCase {
@Mock
- private ScrimController mScrimController;
- @Mock
private DozeParameters mDozeParameters;
private DozeScrimController mDozeScrimController;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- // Make sure callbacks will be invoked to complete the lifecycle.
- doAnswer(invocationOnMock -> {
- ScrimController.Callback callback = invocationOnMock.getArgument(1);
- callback.onStart();
- callback.onDisplayBlanked();
- callback.onFinished();
- return null;
- }).when(mScrimController).transitionTo(any(ScrimState.class),
- any(ScrimController.Callback.class));
-
- mDozeScrimController = new DozeScrimController(mScrimController, getContext(),
- mDozeParameters);
+ mDozeScrimController = new DozeScrimController(mDozeParameters);
mDozeScrimController.setDozing(true);
}
@Test
- public void changesScrimControllerState() {
- mDozeScrimController.pulse(mock(DozeHost.PulseCallback.class), 0);
- verify(mScrimController).transitionTo(eq(ScrimState.PULSING),
- any(ScrimController.Callback.class));
- }
-
- @Test
public void callsPulseCallback() {
DozeHost.PulseCallback callback = mock(DozeHost.PulseCallback.class);
mDozeScrimController.pulse(callback, 0);
+ // Manually simulate a scrim lifecycle
+ mDozeScrimController.getScrimCallback().onStart();
+ mDozeScrimController.getScrimCallback().onDisplayBlanked();
+ mDozeScrimController.getScrimCallback().onFinished();
+
verify(callback).onPulseStarted();
mDozeScrimController.pulseOutNow();
verify(callback).onPulseFinished();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeZenModeController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeZenModeController.java
index 86c43c998877..75df4e67db23 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeZenModeController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeZenModeController.java
@@ -14,6 +14,7 @@
package com.android.systemui.utils.leaks;
+import android.app.NotificationManager;
import android.content.ComponentName;
import android.net.Uri;
import android.service.notification.ZenModeConfig;
@@ -49,6 +50,11 @@ public class FakeZenModeController extends BaseLeakChecker<Callback> implements
}
@Override
+ public NotificationManager.Policy getConsolidatedPolicy() {
+ return null;
+ }
+
+ @Override
public long getNextAlarm() {
return 0;
}
diff --git a/packages/VpnDialogs/res/values-de/strings.xml b/packages/VpnDialogs/res/values-de/strings.xml
index d901104759c4..0f1e00980439 100644
--- a/packages/VpnDialogs/res/values-de/strings.xml
+++ b/packages/VpnDialogs/res/values-de/strings.xml
@@ -17,7 +17,7 @@
<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">"Verbindungsanfrage"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; wird oben am Display angezeigt, wenn VPN aktiv ist."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. Wenn VPN aktiv ist, wird oben im Display &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; angezeigt."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN ist verbunden"</string>
<string name="session" msgid="6470628549473641030">"Sitzung:"</string>
<string name="duration" msgid="3584782459928719435">"Dauer:"</string>
diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml
index b866e5cdba5c..5560a855627f 100644
--- a/packages/VpnDialogs/res/values-hi/strings.xml
+++ b/packages/VpnDialogs/res/values-hi/strings.xml
@@ -17,7 +17,7 @@
<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">"कनेक्शन अनुरोध"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> वीपीएन कनेक्‍शन सेट अप करना चाहता है, जिससे वह नेटवर्क ट्रैफ़िक पर नज़र रख पाएगा. इसकी मंज़ूरी तभी दें जब आपको इस पर भरोसा हो. वीपीएन चालू होने पर आपकी स्क्रीन के सबसे ऊपर &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; दिखाई देता है."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> वीपीएन कनेक्‍शन सेट अप करना चाहता है, जिससे वह नेटवर्क ट्रैफ़िक पर नज़र रख पाएगा. इसकी मंज़ूरी तभी दें जब आपको इस पर भरोसा हो. वीपीएन चालू होने पर &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; आपकी स्क्रीन के सबसे ऊपर दिखाई देता है."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN कनेक्‍ट है"</string>
<string name="session" msgid="6470628549473641030">"सत्र:"</string>
<string name="duration" msgid="3584782459928719435">"अवधि:"</string>
diff --git a/packages/VpnDialogs/res/values-mr/strings.xml b/packages/VpnDialogs/res/values-mr/strings.xml
index 129b7b15c2c8..318f854340e2 100644
--- a/packages/VpnDialogs/res/values-mr/strings.xml
+++ b/packages/VpnDialogs/res/values-mr/strings.xml
@@ -17,7 +17,7 @@
<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">"कनेक्‍शन विनंती"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> नेटवर्क रहदारीचे परीक्षण करण्‍यासाठी त्यास अनुमती देणारे VPN कनेक्‍शन सेट करू इच्‍छितो. आपल्याला स्त्रोत विश्वसनीय वाटत असेल तरच स्वीकार करा. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; VPN सक्रिय असताना आपल्‍या स्क्रीनच्या शीर्षावर दिसते."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> नेटवर्क रहदारीचे परीक्षण करण्‍यासाठी त्यास अनुमती देणारे VPN कनेक्‍शन सेट करू इच्‍छितो. तुम्हाला स्त्रोत विश्वसनीय वाटत असेल तरच स्वीकार करा. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; VPN सक्रिय असताना आपल्‍या स्क्रीनच्या शीर्षावर दिसते."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN कनेक्‍ट केले"</string>
<string name="session" msgid="6470628549473641030">"सत्र:"</string>
<string name="duration" msgid="3584782459928719435">"कालावधी:"</string>
diff --git a/packages/VpnDialogs/res/values-vi/strings.xml b/packages/VpnDialogs/res/values-vi/strings.xml
index fa5e11478493..097c9aeee013 100644
--- a/packages/VpnDialogs/res/values-vi/strings.xml
+++ b/packages/VpnDialogs/res/values-vi/strings.xml
@@ -17,7 +17,7 @@
<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">"Yêu cầu kết nối"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> muốn thiết lập kết nối VPN cho phép ứng dụng giám sát lưu lượng truy cập mạng. Chỉ chấp nhận nếu bạn tin tưởng nguồn. Biểu tượng &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; xuất hiện ở đầu màn hình của bạn khi VPN đang hoạt động."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> muốn thiết lập kết nối VPN cho phép ứng dụng giám sát lưu lượng truy cập mạng. Chỉ chấp nhận nếu bạn tin tưởng nguồn. &lt;br /&gt; &lt;br /&gt; Biểu tượng &lt;img src=vpn_icon /&gt; xuất hiện ở đầu màn hình của bạn khi VPN đang hoạt động."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN được kết nối"</string>
<string name="session" msgid="6470628549473641030">"Phiên"</string>
<string name="duration" msgid="3584782459928719435">"Thời lượng:"</string>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-af/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-af/strings.xml
new file mode 100644
index 000000000000..09a3ca8fde8b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-af/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperiment met swewende navigasiebalk"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-am/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-am/strings.xml
new file mode 100644
index 000000000000..10a5d9db1012
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"ተንሳፋፊ የአሰሳ አሞሌ ሙከራ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ar/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ar/strings.xml
new file mode 100644
index 000000000000..123e1bef6e70
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"تجربة شريط التنقُّل العائم"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-az/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-az/strings.xml
new file mode 100644
index 000000000000..bc48759b6bcf
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Dəyişkən Naviqasiya Paneli Təcrübəsi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..f83754c91e2a
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperiment sa plutajućom trakom za navigaciju"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-be/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-be/strings.xml
new file mode 100644
index 000000000000..957be5382d49
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Эксперымент з плаваючай панэллю навігацыі"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bg/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bg/strings.xml
new file mode 100644
index 000000000000..1fe6d361cee8
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Експеримент с плаваща лента за навигация"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bs/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bs/strings.xml
new file mode 100644
index 000000000000..621cf596781a
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-bs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperiment s plutajućom trakom za navigaciju"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ca/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ca/strings.xml
new file mode 100644
index 000000000000..e747d0602f04
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experiment amb barra de navegació flotant"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-cs/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-cs/strings.xml
new file mode 100644
index 000000000000..3b5a4d8388da
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Plovoucí navigační panel (experiment)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-da/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-da/strings.xml
new file mode 100644
index 000000000000..0e114df55c58
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Test med svævende navigationslinje"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-de/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-de/strings.xml
new file mode 100644
index 000000000000..320e27528c9d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experiment mit unverankerter Navigationsleiste"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-el/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-el/strings.xml
new file mode 100644
index 000000000000..2d464031c32f
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Πείραμα κινούμενης γραμμής πλοήγησης"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rAU/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000000..17227fc0721d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Floating Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rCA/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 000000000000..17227fc0721d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Floating Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rGB/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000000..17227fc0721d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Floating Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rIN/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000000..17227fc0721d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Floating Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rXC/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 000000000000..d379ec1a905b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎Floating Navigation Bar Experiment‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es-rUS/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000000..34e70dcfdbb5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimento de barra de navegación flotante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es/strings.xml
new file mode 100644
index 000000000000..34e70dcfdbb5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimento de barra de navegación flotante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-et/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-et/strings.xml
new file mode 100644
index 000000000000..c20f38e67834
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Hõljuva navigeerimisriba katse"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-eu/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-eu/strings.xml
new file mode 100644
index 000000000000..4623a88ce32c
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Nabigazio-barra gainerakorraren esperimentua"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fa/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fa/strings.xml
new file mode 100644
index 000000000000..f7dbb534b2a0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"آزمایش نوار پیمایش شناور"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fi/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fi/strings.xml
new file mode 100644
index 000000000000..397052d7f204
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Kelluvan navigointipalkin kokeilu"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000000..a831068c0c7f
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Expérience de barre de navigation flottante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr/strings.xml
new file mode 100644
index 000000000000..032ca9de0735
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Test relatif à la barre de navigation flottante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-gl/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-gl/strings.xml
new file mode 100644
index 000000000000..34e70dcfdbb5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimento de barra de navegación flotante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hi/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hi/strings.xml
new file mode 100644
index 000000000000..5f8b1bc4a982
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"फ़्लोट करता हुआ नेविगेशन बार प्रयोग"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hr/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hr/strings.xml
new file mode 100644
index 000000000000..8570caa95b18
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperiment s plutajućom navigacijskom trakom"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hu/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hu/strings.xml
new file mode 100644
index 000000000000..56e02a8f8afd
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Kísérleti lebegő navigációs sáv"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hy/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hy/strings.xml
new file mode 100644
index 000000000000..6623812c1833
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Նավարկման լողացող գոտու փորձարկում"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-in/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-in/strings.xml
new file mode 100644
index 000000000000..457db1c30b43
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperimen Menu Navigasi Mengambang"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-is/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-is/strings.xml
new file mode 100644
index 000000000000..c5b2c23c2d3a
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Tilraun með fljótandi yfirlitsstiku"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-it/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-it/strings.xml
new file mode 100644
index 000000000000..ef858fbedad0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Esperimento Barra di navigazione floating"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-iw/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-iw/strings.xml
new file mode 100644
index 000000000000..866ab7803042
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-iw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"ניסוי של סרגל ניווט צף"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ja/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ja/strings.xml
new file mode 100644
index 000000000000..49264ca6cc18
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"フローティング ナビゲーション バー テスト"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ka/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ka/strings.xml
new file mode 100644
index 000000000000..440535e86d89
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ka/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"ნავიგაციის მოლივლივე ზოლის ექსპერიმენტი"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-kk/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-kk/strings.xml
new file mode 100644
index 000000000000..63165555d87b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Қалқымалы навигация жолағы (эксперимент)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-km/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-km/strings.xml
new file mode 100644
index 000000000000..4888b2b31e2d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-km/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"ការពិសោធ​នៃ​របាររុករក​ដែល​អណ្ដែត"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ko/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ko/strings.xml
new file mode 100644
index 000000000000..89d221c6c1c0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"플로팅 탐색 메뉴 실험"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ky/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ky/strings.xml
new file mode 100644
index 000000000000..bfd96da7207e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Калкыма чабыттоо тилкесин колдонуу"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lo/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lo/strings.xml
new file mode 100644
index 000000000000..4b14abdc510f
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lo/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"ການທົດລອງແຖບການນຳທາງແບບລອຍ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lt/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lt/strings.xml
new file mode 100644
index 000000000000..bb45ec2fde59
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Slankiosios naršymo juostos eksperimentas"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lv/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lv/strings.xml
new file mode 100644
index 000000000000..e537508edd36
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Peldošas navigācijas joslas eksperiments"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mk/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mk/strings.xml
new file mode 100644
index 000000000000..f1a442d3e7e7
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Експеримент со лебдечка лента за навигација"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mn/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mn/strings.xml
new file mode 100644
index 000000000000..1fd974d0b5ff
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Хөвөгч навигацийн самбарын туршилт"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mr/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mr/strings.xml
new file mode 100644
index 000000000000..54387fe3504a
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"फ्लोटिंग नेव्हिगेशन बार प्रयोग"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ms/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ms/strings.xml
new file mode 100644
index 000000000000..20471d3a140e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ms/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Percubaan Bar Navigasi Terapung"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-my/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-my/strings.xml
new file mode 100644
index 000000000000..7d94bdb43a0c
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"မျောနေသော လမ်းညွှန်ဘား စမ်းသပ်မှု"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nb/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nb/strings.xml
new file mode 100644
index 000000000000..505e28a64596
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperiment med flytende navigasjonsrad"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nl/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nl/strings.xml
new file mode 100644
index 000000000000..69242a7ef2e3
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experiment voor zwevende navigatiebalk"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pl/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pl/strings.xml
new file mode 100644
index 000000000000..a18afc34c839
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperyment z pływającym paskiem nawigacyjnym"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000000..7f58e758e2f7
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimento de barra de navegação flutuante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000000..faee8c4438c1
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experiência de barra de navegação flutuante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt/strings.xml
new file mode 100644
index 000000000000..7f58e758e2f7
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimento de barra de navegação flutuante"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ro/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ro/strings.xml
new file mode 100644
index 000000000000..b7debfc04433
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experiment cu bară de navigare flotantă"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ru/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ru/strings.xml
new file mode 100644
index 000000000000..8314c9d664d9
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Плавающая панель навигации (эксперимент)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sk/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sk/strings.xml
new file mode 100644
index 000000000000..6cf17948abc0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Plávajúci navigačný panel (experiment)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sl/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sl/strings.xml
new file mode 100644
index 000000000000..4b1417f22cf0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Preizkus s plavajočo vrstico za krmarjenje"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sq/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sq/strings.xml
new file mode 100644
index 000000000000..254101f1d71b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperimenti i shiritit pluskues të navigimit"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sr/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sr/strings.xml
new file mode 100644
index 000000000000..4ee3f2eab968
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Експеримент са плутајућом траком за навигацију"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sv/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sv/strings.xml
new file mode 100644
index 000000000000..0c1cbf2f2bac
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Experimentellt flytande navigeringsfält"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sw/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sw/strings.xml
new file mode 100644
index 000000000000..5ecbf906dbfb
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Jaribio la Sehemu ya Viungo Muhimu Inayoweza Kusogezwa"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-th/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-th/strings.xml
new file mode 100644
index 000000000000..763d1a4fd337
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"การทดสอบแถบนำทางแบบลอย"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tl/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tl/strings.xml
new file mode 100644
index 000000000000..f3d59812f9ea
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Eksperimentong Floating na Navigation Bar"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tr/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tr/strings.xml
new file mode 100644
index 000000000000..08ecdee4e194
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-tr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Kayan Gezinme Çubuğu Denemesi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uk/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uk/strings.xml
new file mode 100644
index 000000000000..497bfe6692a4
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Експеримент із плаваючою панеллю навігації"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ur/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ur/strings.xml
new file mode 100644
index 000000000000..aa7810ea61d1
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"فلوٹنگ نیویگیشن بار کا تجربہ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uz/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uz/strings.xml
new file mode 100644
index 000000000000..0f957166f145
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-uz/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Erkin harakatlanuvchi navigatsiya paneli tajribasi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-vi/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-vi/strings.xml
new file mode 100644
index 000000000000..b0c2b061817c
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Thử nghiệm thanh điều hướng nổi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000000..3edd38286372
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"浮动导航栏实验"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000000..3f038eaeb05d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"懸浮導覽列實驗"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000000..51dc364046fe
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"浮動導覽列實驗"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zu/strings.xml b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zu/strings.xml
new file mode 100644
index 000000000000..ea193ea6ff0e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarFloatingOverlay/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="7290469683147348228">"Ukuhlolwa kwebha entantayo yokuzula"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-af/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-af/strings.xml
new file mode 100644
index 000000000000..21a0003bdaa7
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-af/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperiment met dun navigasiebalk"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-am/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-am/strings.xml
new file mode 100644
index 000000000000..6a7d644ff432
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ቀጭን የአሰሳ አሞሌ ሙከራ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ar/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ar/strings.xml
new file mode 100644
index 000000000000..2cebf40c0cba
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"تجربة شريط التنقُّل النحيف"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-az/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-az/strings.xml
new file mode 100644
index 000000000000..266c051abc7d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-az/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Sabit Naviqasiya Paneli Təcrübəsi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..dc57a3f6a076
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperiment sa tankom trakom za navigaciju"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-be/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-be/strings.xml
new file mode 100644
index 000000000000..8b53bcdfe9d7
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-be/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Эксперымент з тонкай панэллю навігацыі"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bg/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bg/strings.xml
new file mode 100644
index 000000000000..4bf000e193c0
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Експеримент с тънка лента за навигация"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bs/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bs/strings.xml
new file mode 100644
index 000000000000..981420945aea
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-bs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperiment s tankom trakom za navigaciju"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ca/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ca/strings.xml
new file mode 100644
index 000000000000..4a9b598158e6
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experiment amb barra de navegació fina"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-cs/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-cs/strings.xml
new file mode 100644
index 000000000000..d923a3cc4376
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Úzký navigační panel (experiment)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-da/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-da/strings.xml
new file mode 100644
index 000000000000..12bb2f23fe1e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Test med smal navigationslinje"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-de/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-de/strings.xml
new file mode 100644
index 000000000000..960a7d94e7ae
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experiment mit schmaler Navigationsleiste"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-el/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-el/strings.xml
new file mode 100644
index 000000000000..119b7e611cf9
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Πείραμα λεπτής γραμμής πλοήγησης"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rAU/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000000..5ebf40348199
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rAU/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Slim Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rCA/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rCA/strings.xml
new file mode 100644
index 000000000000..5ebf40348199
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Slim Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rGB/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000000..5ebf40348199
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Slim Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rIN/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000000..5ebf40348199
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Slim Navigation Bar Experiment"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rXC/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rXC/strings.xml
new file mode 100644
index 000000000000..79884ce615cf
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-en-rXC/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎Slim Navigation Bar Experiment‎‏‎‎‏‎"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es-rUS/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000000..00b044459777
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimento de barra de navegación delgada"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es/strings.xml
new file mode 100644
index 000000000000..58bdaa26115b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimento de barra navegación delgada"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-et/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-et/strings.xml
new file mode 100644
index 000000000000..4c5023cf1d14
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-et/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Kitsa navigeerimisriba katse"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-eu/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-eu/strings.xml
new file mode 100644
index 000000000000..fc16eeb8dc3e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-eu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Nabigazio-barra finaren esperimentua"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fa/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fa/strings.xml
new file mode 100644
index 000000000000..e4246d79decb
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"آزمایش نوار پیمایش باریک"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fi/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fi/strings.xml
new file mode 100644
index 000000000000..9385a470368f
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Ohuen navigointipalkin kokeilu"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000000..d22848beda3d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Expérience de barre de navigation mince"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr/strings.xml
new file mode 100644
index 000000000000..cfa1db2a06d3
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Test relatif à la barre de navigation fine"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-gl/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-gl/strings.xml
new file mode 100644
index 000000000000..d2194ce1a820
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-gl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimento de barra de navegación estreita"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hi/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hi/strings.xml
new file mode 100644
index 000000000000..d51cee34f895
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"स्लिम नेविगेशन बार प्रयोग"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hr/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hr/strings.xml
new file mode 100644
index 000000000000..410c58ef2cbc
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperiment s tankom navigacijskom trakom"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hu/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hu/strings.xml
new file mode 100644
index 000000000000..d7eafed699ab
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Kísérleti keskeny navigációs sáv"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hy/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hy/strings.xml
new file mode 100644
index 000000000000..b0200cab636b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-hy/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Նավարկման նեղ գոտու փորձարկում"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-in/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-in/strings.xml
new file mode 100644
index 000000000000..3e0bded06e68
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperimen Menu Navigasi Ramping"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-is/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-is/strings.xml
new file mode 100644
index 000000000000..03ccaf3de068
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-is/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Tilraun með þunna yfirlitsstiku"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-it/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-it/strings.xml
new file mode 100644
index 000000000000..f7c5d253e5ab
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Esperimento Barra di navigazione sottile"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-iw/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-iw/strings.xml
new file mode 100644
index 000000000000..0d0ec2c7c2a5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-iw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ניסוי של סרגל ניווט דק"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ja/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ja/strings.xml
new file mode 100644
index 000000000000..a3d6874e84f6
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"スリム ナビゲーション バー テスト"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ka/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ka/strings.xml
new file mode 100644
index 000000000000..ffddf3bee802
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ka/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ნავიგაციის მჭიდრო ზოლის ექსპერიმენტი"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-kk/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-kk/strings.xml
new file mode 100644
index 000000000000..f34ac0810127
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-kk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Жіңішке навигация жолағы (эксперимент)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-km/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-km/strings.xml
new file mode 100644
index 000000000000..114a78270d79
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-km/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ការពិសោធ​នៃ​របាររុករក​ស្ដើង"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ko/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ko/strings.xml
new file mode 100644
index 000000000000..fca02c3e49bd
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"슬림한 탐색 메뉴 실험"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ky/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ky/strings.xml
new file mode 100644
index 000000000000..6b15d5113675
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ky/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Жука чабыттоо тилкесин колдонуу"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lo/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lo/strings.xml
new file mode 100644
index 000000000000..6ec48ca13d19
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lo/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ການທົດລອງແຖບການນຳທາງແບບບາງ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lt/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lt/strings.xml
new file mode 100644
index 000000000000..1df54aa3fc02
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Plonos naršymo juostos eksperimentas"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lv/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lv/strings.xml
new file mode 100644
index 000000000000..5c6c5658406b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Plānas navigācijas joslas eksperiments"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mk/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mk/strings.xml
new file mode 100644
index 000000000000..3517813f74ad
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Експеримент со тенка лента за навигација"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mn/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mn/strings.xml
new file mode 100644
index 000000000000..a2282c4c71c9
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Нимгэн навигацийн самбарын туршилт"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mr/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mr/strings.xml
new file mode 100644
index 000000000000..c714370cdc7e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-mr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"स्लिम नॅव्हिगेशन बार प्रयोग"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ms/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ms/strings.xml
new file mode 100644
index 000000000000..68f831e39b46
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ms/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Percubaan Bar Navigasi Langsing"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-my/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-my/strings.xml
new file mode 100644
index 000000000000..84db27962308
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-my/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"ပါးလွှာသော လမ်းညွှန်ဘား စမ်းသပ်မှု"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nb/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nb/strings.xml
new file mode 100644
index 000000000000..e1ff863ac5c8
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperiment med tynn navigasjonsrad"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nl/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nl/strings.xml
new file mode 100644
index 000000000000..01190bc624c8
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experiment voor smalle navigatiebalk"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pl/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pl/strings.xml
new file mode 100644
index 000000000000..1742aadbcdd3
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperyment z wąskim paskiem nawigacyjnym"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000000..22194b7e1ca5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rBR/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimento de barra de navegação fina"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000000..f6c030983578
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experiência de barra de navegação fina"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt/strings.xml
new file mode 100644
index 000000000000..22194b7e1ca5
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimento de barra de navegação fina"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ro/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ro/strings.xml
new file mode 100644
index 000000000000..e1655f27b977
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experiment cu bară de navigare subțire"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ru/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ru/strings.xml
new file mode 100644
index 000000000000..cac66dc921b1
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Узкая панель навигации (эксперимент)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sk/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sk/strings.xml
new file mode 100644
index 000000000000..6a1ce4128cd9
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Úzky navigačný panel (experiment)"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sl/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sl/strings.xml
new file mode 100644
index 000000000000..beab7b67f60e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Preizkus z vitko vrstico za krmarjenje"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sq/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sq/strings.xml
new file mode 100644
index 000000000000..b7a28d57391d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sq/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperimenti i shiritit të hollë të navigimit"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sr/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sr/strings.xml
new file mode 100644
index 000000000000..048f649ddb7b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Експеримент са танком траком за навигацију"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sv/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sv/strings.xml
new file mode 100644
index 000000000000..b94438f6971a
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Experimentellt tunt navigeringsfält"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sw/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sw/strings.xml
new file mode 100644
index 000000000000..3a5a73cd0afa
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Jaribio la Sehemu ya Viungo Muhimu Inayoweza Kupunguzwa"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-th/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-th/strings.xml
new file mode 100644
index 000000000000..945297bec53d
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"การทดสอบแถบนำทางแบบบาง"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tl/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tl/strings.xml
new file mode 100644
index 000000000000..0c8087c68b8b
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Eksperimentong Slim na Navigation Bar"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tr/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tr/strings.xml
new file mode 100644
index 000000000000..a3ca75455391
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-tr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"İnce Gezinme Çubuğu Denemesi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uk/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uk/strings.xml
new file mode 100644
index 000000000000..656c4a97bd6c
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Експеримент із тонкою панеллю навігації"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ur/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ur/strings.xml
new file mode 100644
index 000000000000..bcd6bc3f257e
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-ur/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"سلم نیویگیشن بار کا تجربہ"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uz/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uz/strings.xml
new file mode 100644
index 000000000000..0d40981784c8
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-uz/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Ingichka navigatsiya paneli tajribasi"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-vi/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-vi/strings.xml
new file mode 100644
index 000000000000..dad56b41ae39
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Thử nghiệm thanh điều hướng mỏng"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000000..b2602e0e0093
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"精简导航栏实验"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000000..d5259d38ffa1
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"精簡導覽列實驗"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000000..6586a573b494
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zh-rTW/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"細長導覽列實驗"</string>
+</resources>
diff --git a/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zu/strings.xml b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zu/strings.xml
new file mode 100644
index 000000000000..12d04d3b21f6
--- /dev/null
+++ b/packages/overlays/ExperimentNavigationBarSlimOverlay/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="experiment_navigationbar_overlay" msgid="6953777362606036161">"Ukuhlolwa kwebha yokuzula encane"</string>
+</resources>
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index d15b277b22c3..ddd0c2cd2531 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -6574,6 +6574,11 @@ message MetricsEvent {
// OS: Q
BIOMETRIC_FRAGMENT = 1585;
+ // OPEN: Biometric Enrollment (android.settings.BIOMETRIC_ENROLL action intent)
+ // CATEGORY: SETTINGS
+ // OS: Q
+ BIOMETRIC_ENROLL_ACTIVITY = 1586;
+
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index ebd9e77a6a98..6eba914f15bc 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -457,13 +457,12 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final int interrogatingPid = Binder.getCallingPid();
callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
interrogatingPid, interrogatingTid);
- final int callingUid = Binder.getCallingUid();
final long identityToken = Binder.clearCallingIdentity();
try {
connection.getRemote().findAccessibilityNodeInfosByViewId(accessibilityNodeId,
viewIdResName, partialInteractiveRegion, interactionId, callback, mFetchFlags,
interrogatingPid, interrogatingTid, spec);
- return mSecurityPolicy.computeValidReportedPackages(callingUid,
+ return mSecurityPolicy.computeValidReportedPackages(
connection.getPackageName(), connection.getUid());
} catch (RemoteException re) {
if (DEBUG) {
@@ -514,13 +513,12 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final int interrogatingPid = Binder.getCallingPid();
callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
interrogatingPid, interrogatingTid);
- final int callingUid = Binder.getCallingUid();
final long identityToken = Binder.clearCallingIdentity();
try {
connection.getRemote().findAccessibilityNodeInfosByText(accessibilityNodeId,
text, partialInteractiveRegion, interactionId, callback, mFetchFlags,
interrogatingPid, interrogatingTid, spec);
- return mSecurityPolicy.computeValidReportedPackages(callingUid,
+ return mSecurityPolicy.computeValidReportedPackages(
connection.getPackageName(), connection.getUid());
} catch (RemoteException re) {
if (DEBUG) {
@@ -571,13 +569,12 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final int interrogatingPid = Binder.getCallingPid();
callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
interrogatingPid, interrogatingTid);
- final int callingUid = Binder.getCallingUid();
final long identityToken = Binder.clearCallingIdentity();
try {
connection.getRemote().findAccessibilityNodeInfoByAccessibilityId(
accessibilityNodeId, partialInteractiveRegion, interactionId, callback,
mFetchFlags | flags, interrogatingPid, interrogatingTid, spec, arguments);
- return mSecurityPolicy.computeValidReportedPackages(callingUid,
+ return mSecurityPolicy.computeValidReportedPackages(
connection.getPackageName(), connection.getUid());
} catch (RemoteException re) {
if (DEBUG) {
@@ -628,13 +625,12 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final int interrogatingPid = Binder.getCallingPid();
callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
interrogatingPid, interrogatingTid);
- final int callingUid = Binder.getCallingUid();
final long identityToken = Binder.clearCallingIdentity();
try {
connection.getRemote().findFocus(accessibilityNodeId, focusType,
partialInteractiveRegion, interactionId, callback, mFetchFlags,
interrogatingPid, interrogatingTid, spec);
- return mSecurityPolicy.computeValidReportedPackages(callingUid,
+ return mSecurityPolicy.computeValidReportedPackages(
connection.getPackageName(), connection.getUid());
} catch (RemoteException re) {
if (DEBUG) {
@@ -684,13 +680,12 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
final int interrogatingPid = Binder.getCallingPid();
callback = mSystemSupport.replaceCallbackIfNeeded(callback, resolvedWindowId, interactionId,
interrogatingPid, interrogatingTid);
- final int callingUid = Binder.getCallingUid();
final long identityToken = Binder.clearCallingIdentity();
try {
connection.getRemote().focusSearch(accessibilityNodeId, direction,
partialInteractiveRegion, interactionId, callback, mFetchFlags,
interrogatingPid, interrogatingTid, spec);
- return mSecurityPolicy.computeValidReportedPackages(callingUid,
+ return mSecurityPolicy.computeValidReportedPackages(
connection.getPackageName(), connection.getUid());
} catch (RemoteException re) {
if (DEBUG) {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index fbceade2341f..e89b9517da84 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -348,11 +348,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
boolean getBindInstantServiceAllowed(int userId) {
- return mSecurityPolicy.getBindInstantServiceAllowed(userId);
+ final UserState userState = getUserState(userId);
+ if (userState == null) return false;
+ return userState.getBindInstantServiceAllowed();
}
void setBindInstantServiceAllowed(int userId, boolean allowed) {
- mSecurityPolicy.setBindInstantServiceAllowed(userId, allowed);
+ UserState userState;
+ synchronized (mLock) {
+ userState = getUserState(userId);
+ if (userState == null) {
+ if (!allowed) {
+ return;
+ }
+ userState = new UserState(userId);
+ mUserStates.put(userId, userState);
+ }
+ }
+ userState.setBindInstantServiceAllowed(allowed);
}
private void registerBroadcastReceivers() {
@@ -1316,7 +1329,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
| PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
- if (userState.mBindInstantServiceAllowed) {
+ if (userState.getBindInstantServiceAllowed()) {
flags |= PackageManager.MATCH_INSTANT;
}
@@ -2068,7 +2081,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
&& componentNameToEnable.equals(userState.mServiceToEnableWithShortcut)) {
return false;
}
+
userState.mServiceToEnableWithShortcut = componentNameToEnable;
+ scheduleNotifyClientsOfServicesStateChange(userState);
return true;
}
@@ -2343,10 +2358,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override
public void performAccessibilityShortcut() {
if ((UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID)
- && (mContext.checkCallingPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
+ && (mContext.checkCallingPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
!= PackageManager.PERMISSION_GRANTED)) {
throw new SecurityException(
- "performAccessibilityShortcut requires the WRITE_SECURE_SETTINGS permission");
+ "performAccessibilityShortcut requires the MANAGE_ACCESSIBILITY permission");
}
final Map<ComponentName, ToggleableFrameworkFeatureInfo> frameworkFeatureMap =
AccessibilityShortcutController.getFrameworkShortcutFeaturesMap();
@@ -2381,6 +2396,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
};
+ @Override
+ public String getAccessibilityShortcutService() {
+ if (mContext.checkCallingPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException(
+ "getAccessibilityShortcutService requires the MANAGE_ACCESSIBILITY permission");
+ }
+ synchronized(mLock) {
+ final UserState userState = getUserStateLocked(mCurrentUserId);
+ return userState.mServiceToEnableWithShortcut.flattenToString();
+ }
+ }
+
/**
* Enables accessibility service specified by {@param componentName} for the {@param userId}.
*/
@@ -3143,9 +3171,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
return packageNames[0];
}
- String[] computeValidReportedPackages(int callingUid,
- String targetPackage, int targetUid) {
- if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
+ /**
+ * Get a list of package names an app may report, including any widget packages it owns.
+ *
+ * @param targetPackage The known valid target package
+ * @param targetUid The uid of the target app
+ * @return
+ */
+ String[] computeValidReportedPackages(String targetPackage, int targetUid) {
+ if (UserHandle.getAppId(targetUid) == Process.SYSTEM_UID) {
// Empty array means any package is Okay
return EmptyArray.STRING;
}
@@ -3169,32 +3203,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
return uidPackages;
}
- private boolean getBindInstantServiceAllowed(int userId) {
- mContext.enforceCallingOrSelfPermission(
- Manifest.permission.MANAGE_BIND_INSTANT_SERVICE,
- "getBindInstantServiceAllowed");
- UserState state = mUserStates.get(userId);
- return (state != null) && state.mBindInstantServiceAllowed;
- }
-
- private void setBindInstantServiceAllowed(int userId, boolean allowed) {
- mContext.enforceCallingOrSelfPermission(
- Manifest.permission.MANAGE_BIND_INSTANT_SERVICE,
- "setBindInstantServiceAllowed");
- UserState state = mUserStates.get(userId);
- if (state == null) {
- if (!allowed) {
- return;
- }
- state = new UserState(userId);
- mUserStates.put(userId, state);
- }
- if (state.mBindInstantServiceAllowed != allowed) {
- state.mBindInstantServiceAllowed = allowed;
- onUserStateChangedLocked(state);
- }
- }
-
public void clearWindowsLocked() {
List<WindowInfo> windows = Collections.emptyList();
final int activeWindowId = mActiveWindowId;
@@ -3804,7 +3812,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
public boolean mUserMinimumUiTimeoutEnabled;
public int mUserMinimumUiTimeout;
- public boolean mBindInstantServiceAllowed;
+ private boolean mBindInstantServiceAllowed;
public UserState(int userId) {
mUserId = userId;
@@ -4036,6 +4044,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, 0)
& SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE) != 0;
}
+
+ public boolean getBindInstantServiceAllowed() {
+ synchronized (mLock) {
+ return mBindInstantServiceAllowed;
+ }
+ }
+
+ public void setBindInstantServiceAllowed(boolean allowed) {
+ synchronized (mLock) {
+ mContext.enforceCallingOrSelfPermission(
+ Manifest.permission.MANAGE_BIND_INSTANT_SERVICE,
+ "setBindInstantServiceAllowed");
+ if (allowed) {
+ mBindInstantServiceAllowed = allowed;
+ onUserStateChangedLocked(this);
+ }
+ }
+ }
}
private final class AccessibilityContentObserver extends ContentObserver {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index 2396ded6dba5..86132a8e6473 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -92,7 +92,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
final long identity = Binder.clearCallingIdentity();
try {
int flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE;
- if (userState.mBindInstantServiceAllowed) {
+ if (userState.getBindInstantServiceAllowed()) {
flags |= Context.BIND_ALLOW_INSTANT;
}
if (mService == null && mContext.bindServiceAsUser(
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 742d49443549..f79f6ff73d29 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -203,15 +203,11 @@ final class FillUi {
.getInteger(com.android.internal.R.integer.autofill_max_visible_datasets);
}
- final RemoteViews.OnClickHandler interceptionHandler = new RemoteViews.OnClickHandler() {
- @Override
- public boolean onClickHandler(View view, PendingIntent pendingIntent,
- Intent fillInIntent) {
- if (pendingIntent != null) {
- mCallback.startIntentSender(pendingIntent.getIntentSender());
- }
- return true;
+ final RemoteViews.OnClickHandler interceptionHandler = (view, pendingIntent, r) -> {
+ if (pendingIntent != null) {
+ mCallback.startIntentSender(pendingIntent.getIntentSender());
}
+ return true;
};
if (response.getAuthentication() != null) {
@@ -369,13 +365,9 @@ final class FillUi {
* Creates a remoteview interceptor used to block clicks.
*/
private RemoteViews.OnClickHandler newClickBlocker() {
- return new RemoteViews.OnClickHandler() {
- @Override
- public boolean onClickHandler(View view, PendingIntent pendingIntent,
- Intent fillInIntent) {
- if (sVerbose) Slog.v(TAG, "Ignoring click on " + view);
- return true;
- }
+ return (view, pendingIntent, response) -> {
+ if (sVerbose) Slog.v(TAG, "Ignoring click on " + view);
+ return true;
};
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index 89b442ecbbda..1e30c8afffa3 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -304,39 +304,36 @@ final class SaveUi {
}
}
- final RemoteViews.OnClickHandler handler = new RemoteViews.OnClickHandler() {
- @Override
- public boolean onClickHandler(View view, PendingIntent pendingIntent,
- Intent intent) {
- final LogMaker log =
- newLogMaker(MetricsEvent.AUTOFILL_SAVE_LINK_TAPPED, type);
- // We need to hide the Save UI before launching the pending intent, and
- // restore back it once the activity is finished, and that's achieved by
- // adding a custom extra in the activity intent.
- final boolean isValid = isValidLink(pendingIntent, intent);
- if (!isValid) {
- log.setType(MetricsEvent.TYPE_UNKNOWN);
- mMetricsLogger.write(log);
- return false;
- }
- if (sVerbose) Slog.v(TAG, "Intercepting custom description intent");
- final IBinder token = mPendingUi.getToken();
- intent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);
- try {
- mPendingUi.client.startIntentSender(pendingIntent.getIntentSender(),
- intent);
- mPendingUi.setState(PendingUi.STATE_PENDING);
- if (sDebug) Slog.d(TAG, "hiding UI until restored with token " + token);
- hide();
- log.setType(MetricsEvent.TYPE_OPEN);
- mMetricsLogger.write(log);
- return true;
- } catch (RemoteException e) {
- Slog.w(TAG, "error triggering pending intent: " + intent);
- log.setType(MetricsEvent.TYPE_FAILURE);
- mMetricsLogger.write(log);
- return false;
- }
+ final RemoteViews.OnClickHandler handler = (view, pendingIntent, response) -> {
+ Intent intent = response.getLaunchOptions(view).first;
+ final LogMaker log =
+ newLogMaker(MetricsEvent.AUTOFILL_SAVE_LINK_TAPPED, type);
+ // We need to hide the Save UI before launching the pending intent, and
+ // restore back it once the activity is finished, and that's achieved by
+ // adding a custom extra in the activity intent.
+ final boolean isValid = isValidLink(pendingIntent, intent);
+ if (!isValid) {
+ log.setType(MetricsEvent.TYPE_UNKNOWN);
+ mMetricsLogger.write(log);
+ return false;
+ }
+ if (sVerbose) Slog.v(TAG, "Intercepting custom description intent");
+ final IBinder token = mPendingUi.getToken();
+ intent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);
+ try {
+ mPendingUi.client.startIntentSender(pendingIntent.getIntentSender(),
+ intent);
+ mPendingUi.setState(PendingUi.STATE_PENDING);
+ if (sDebug) Slog.d(TAG, "hiding UI until restored with token " + token);
+ hide();
+ log.setType(MetricsEvent.TYPE_OPEN);
+ mMetricsLogger.write(log);
+ return true;
+ } catch (RemoteException e) {
+ Slog.w(TAG, "error triggering pending intent: " + intent);
+ log.setType(MetricsEvent.TYPE_FAILURE);
+ mMetricsLogger.write(log);
+ return false;
}
};
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index eb31e782eb33..1ad83ecb1237 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -591,15 +591,15 @@ public class BackupManagerService {
if (DEBUG) {
Slog.i(TAG, "Backup enable apparently not migrated");
}
- final ContentResolver r = sInstance.mContext.getContentResolver();
- final int enableState = Settings.Secure.getIntForUser(r,
+ ContentResolver resolver = sInstance.getContext().getContentResolver();
+ int enableState = Settings.Secure.getIntForUser(resolver,
Settings.Secure.BACKUP_ENABLED, -1, UserHandle.USER_SYSTEM);
if (enableState >= 0) {
if (DEBUG) {
Slog.i(TAG, "Migrating enable state " + (enableState != 0));
}
writeBackupEnableState(enableState != 0, UserHandle.USER_SYSTEM);
- Settings.Secure.putStringForUser(r,
+ Settings.Secure.putStringForUser(resolver,
Settings.Secure.BACKUP_ENABLED, null, UserHandle.USER_SYSTEM);
} else {
if (DEBUG) {
@@ -2790,8 +2790,8 @@ public class BackupManagerService {
Slog.e(TAG, "Unable to record backup enable state; reverting to disabled: "
+ e.getMessage());
- final ContentResolver r = sInstance.mContext.getContentResolver();
- Settings.Secure.putStringForUser(r,
+ ContentResolver resolver = sInstance.getContext().getContentResolver();
+ Settings.Secure.putStringForUser(resolver,
Settings.Secure.BACKUP_ENABLED, null, userId);
enableFile.delete();
stage.delete();
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 8e4c243e4487..32fd7e0f1607 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -16,7 +16,10 @@
package com.android.server.backup;
+import static com.android.server.backup.BackupManagerService.TAG;
+
import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
import android.app.backup.BackupManager;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
@@ -39,44 +42,52 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.util.Slog;
-
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.DumpUtils;
-
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
-
/**
* A proxy to BackupManagerService implementation.
*
- * This is an external interface to the BackupManagerService which is being accessed via published
- * binder (see BackupManagerService$Lifecycle). This lets us turn down the heavy implementation
- * object on the fly without disturbing binders that have been cached somewhere in the system.
+ * <p>This is an external interface to the BackupManagerService which is being accessed via
+ * published binder (see BackupManagerService$Lifecycle). This lets us turn down the heavy
+ * implementation object on the fly without disturbing binders that have been cached somewhere in
+ * the system.
*
- * This is where it is decided whether backup subsystem is available. It can be disabled with the
- * following two methods:
+ * <p>Trampoline determines whether the backup service is available. It can be disabled in the
+ * following two ways:
*
* <ul>
- * <li> Temporarily - create a file named Trampoline.BACKUP_SUPPRESS_FILENAME, or
- * <li> Product level - set Trampoline.BACKUP_DISABLE_PROPERTY system property to true.
+ * <li>Temporary - create the file {@link #BACKUP_SUPPRESS_FILENAME}, or
+ * <li>Permanent - set the system property {@link #BACKUP_DISABLE_PROPERTY} to true.
* </ul>
+ *
+ * Temporary disabling is controlled by {@link #setBackupServiceActive(int, boolean)} through
+ * privileged callers (currently {@link DevicePolicyManager}). This is called on {@link
+ * UserHandle#USER_SYSTEM} and disables backup for all users.
+ *
+ * <p>Creation of the backup service is done when {@link UserHandle#USER_SYSTEM} is unlocked. The
+ * system user is unlocked before any other users.
*/
public class Trampoline extends IBackupManager.Stub {
- static final String TAG = "BackupManagerService";
-
- // When this file is present, the backup service is inactive
+ // When this file is present, the backup service is inactive.
private static final String BACKUP_SUPPRESS_FILENAME = "backup-suppress";
- // Product-level suppression of backup/restore
+ // Product-level suppression of backup/restore.
private static final String BACKUP_DISABLE_PROPERTY = "ro.backup.disable";
- final Context mContext;
- private final File mSuppressFile; // existence testing & creating synchronized on 'this'
+ private final Context mContext;
+
+ @GuardedBy("mStateLock")
+ private final File mSuppressFile;
+
private final boolean mGlobalDisable;
- private volatile BackupManagerService mService;
+ private final Object mStateLock = new Object();
+ private volatile BackupManagerService mService;
private HandlerThread mHandlerThread;
public Trampoline(Context context) {
@@ -99,78 +110,100 @@ public class Trampoline extends IBackupManager.Stub {
BACKUP_SUPPRESS_FILENAME);
}
+ protected Context getContext() {
+ return mContext;
+ }
+
protected BackupManagerService createBackupManagerService() {
return BackupManagerService.create(mContext, this, mHandlerThread);
}
- // internal control API
- public void initialize(final int whichUser) {
- // Note that only the owner user is currently involved in backup/restore
- // TODO: http://b/22388012
- if (whichUser == UserHandle.USER_SYSTEM) {
- // Does this product support backup/restore at all?
- if (mGlobalDisable) {
- Slog.i(TAG, "Backup/restore not supported");
- return;
- }
+ /**
+ * Initialize {@link BackupManagerService} if the backup service is not disabled. Only the
+ * system user can initialize the service.
+ */
+ /* package */ void initializeService(int userId) {
+ if (mGlobalDisable) {
+ Slog.i(TAG, "Backup service not supported");
+ return;
+ }
- synchronized (this) {
- if (!mSuppressFile.exists()) {
- mService = createBackupManagerService();
- } else {
- Slog.i(TAG, "Backup inactive in user " + whichUser);
- }
+ if (userId != UserHandle.USER_SYSTEM) {
+ Slog.i(TAG, "Cannot initialize backup service for non-system user: " + userId);
+ return;
+ }
+
+ synchronized (mStateLock) {
+ if (!mSuppressFile.exists()) {
+ mService = createBackupManagerService();
+ } else {
+ Slog.i(TAG, "Backup service inactive");
}
}
}
+ /**
+ * Called from {@link BackupManagerService$Lifecycle} when the system user is unlocked. Attempts
+ * to initialize {@link BackupManagerService} and set backup state for the system user.
+ *
+ * @see BackupManagerService#unlockSystemUser()
+ */
void unlockSystemUser() {
mHandlerThread = new HandlerThread("backup", Process.THREAD_PRIORITY_BACKGROUND);
mHandlerThread.start();
Handler h = new Handler(mHandlerThread.getLooper());
- h.post(() -> {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup init");
- initialize(UserHandle.USER_SYSTEM);
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
-
- BackupManagerService svc = mService;
- Slog.i(TAG, "Unlocking system user; mService=" + mService);
- if (svc != null) {
- svc.unlockSystemUser();
- }
- });
+ h.post(
+ () -> {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup init");
+ initializeService(UserHandle.USER_SYSTEM);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+
+ BackupManagerService service = mService;
+ if (service != null) {
+ Slog.i(TAG, "Unlocking system user");
+ service.unlockSystemUser();
+ }
+ });
}
- public void setBackupServiceActive(final int userHandle, boolean makeActive) {
- // Only the DPM should be changing the active state of backup
- final int caller = binderGetCallingUid();
- if (caller != Process.SYSTEM_UID
- && caller != Process.ROOT_UID) {
+ /**
+ * Only privileged callers should be changing the backup state. This method only acts on {@link
+ * UserHandle#USER_SYSTEM} and is a no-op if passed non-system users. Deactivating backup in the
+ * system user also deactivates backup in all users.
+ */
+ public void setBackupServiceActive(int userId, boolean makeActive) {
+ int caller = binderGetCallingUid();
+ if (caller != Process.SYSTEM_UID && caller != Process.ROOT_UID) {
throw new SecurityException("No permission to configure backup activity");
}
if (mGlobalDisable) {
- Slog.i(TAG, "Backup/restore not supported");
+ Slog.i(TAG, "Backup service not supported");
return;
}
- // TODO: http://b/22388012
- if (userHandle == UserHandle.USER_SYSTEM) {
- synchronized (this) {
- if (makeActive != isBackupServiceActive(userHandle)) {
- Slog.i(TAG, "Making backup "
- + (makeActive ? "" : "in") + "active in user " + userHandle);
- if (makeActive) {
- mService = createBackupManagerService();
- mSuppressFile.delete();
- } else {
- mService = null;
- try {
- mSuppressFile.createNewFile();
- } catch (IOException e) {
- Slog.e(TAG, "Unable to persist backup service inactivity");
- }
- }
+
+ if (userId != UserHandle.USER_SYSTEM) {
+ Slog.i(TAG, "Cannot set backup service activity for non-system user: " + userId);
+ return;
+ }
+
+ if (makeActive == isBackupServiceActive(userId)) {
+ Slog.i(TAG, "No change in backup service activity");
+ return;
+ }
+
+ synchronized (mStateLock) {
+ Slog.i(TAG, "Making backup " + (makeActive ? "" : "in") + "active");
+ if (makeActive) {
+ mService = createBackupManagerService();
+ mSuppressFile.delete();
+ } else {
+ mService = null;
+ try {
+ mSuppressFile.createNewFile();
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to persist backup service inactivity");
}
}
}
@@ -181,14 +214,15 @@ public class Trampoline extends IBackupManager.Stub {
/**
* Querying activity state of backup service. Calling this method before initialize yields
* undefined result.
- * @param userHandle The user in which the activity state of backup service is queried.
+ *
+ * @param userId The user in which the activity state of backup service is queried.
* @return true if the service is active.
*/
@Override
- public boolean isBackupServiceActive(final int userHandle) {
+ public boolean isBackupServiceActive(int userId) {
// TODO: http://b/22388012
- if (userHandle == UserHandle.USER_SYSTEM) {
- synchronized (this) {
+ if (userId == UserHandle.USER_SYSTEM) {
+ synchronized (mStateLock) {
return mService != null;
}
}
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 38b9647c15b4..854c03f128dd 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -1462,6 +1462,10 @@ class AlarmManagerService extends SystemService {
TimeZone.setDefault(null);
if (timeZoneWasChanged) {
+ // Don't wait for broadcasts to update our midnight alarm
+ mClockReceiver.scheduleDateChangedEvent();
+
+ // And now let everyone else know
Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index c2aec29e688a..cd98263e417e 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -26,10 +26,14 @@ import static android.app.AppOpsManager.UID_STATE_TOP;
import static android.app.AppOpsManager._NUM_UID_STATE;
import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.AppOpsManager;
+import android.app.AppOpsManager.HistoricalOpEntry;
+import android.app.AppOpsManager.HistoricalPackageOps;
import android.app.AppOpsManagerInternal;
import android.app.AppOpsManagerInternal.CheckOpsDelegate;
import android.content.ContentResolver;
@@ -38,6 +42,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.media.AudioAttributes;
@@ -929,6 +934,116 @@ public class AppOpsService extends IAppOpsService.Stub {
}
@Override
+ public @Nullable ParceledListSlice getAllHistoricalPackagesOps(@Nullable String[] opNames,
+ long beginTimeMillis, long endTimeMillis) {
+ Preconditions.checkArgument(beginTimeMillis >= 0 && beginTimeMillis < endTimeMillis,
+ "beginTimeMillis must be non negative and lesser than endTimeMillis");
+
+ mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
+ Binder.getCallingPid(), Binder.getCallingUid(), "getAllHistoricalPackagesOps");
+
+ ArrayList<HistoricalPackageOps> historicalPackageOpsList = null;
+
+ final int uidStateCount = mUidStates.size();
+ for (int i = 0; i < uidStateCount; i++) {
+ final UidState uidState = mUidStates.valueAt(i);
+ if (uidState.pkgOps == null || uidState.pkgOps.isEmpty()) {
+ continue;
+ }
+ final ArrayMap<String, Ops> packages = uidState.pkgOps;
+ final int packageCount = packages.size();
+ for (int j = 0; j < packageCount; j++) {
+ final Ops pkgOps = packages.valueAt(j);
+ final AppOpsManager.HistoricalPackageOps historicalPackageOps =
+ createHistoricalPackageOps(uidState.uid, pkgOps, opNames,
+ beginTimeMillis, endTimeMillis);
+ if (historicalPackageOps != null) {
+ if (historicalPackageOpsList == null) {
+ historicalPackageOpsList = new ArrayList<>();
+ }
+ historicalPackageOpsList.add(historicalPackageOps);
+ }
+ }
+ }
+
+ if (historicalPackageOpsList == null) {
+ return null;
+ }
+
+ return new ParceledListSlice<>(historicalPackageOpsList);
+ }
+
+ private static @Nullable HistoricalPackageOps createHistoricalPackageOps(int uid,
+ @Nullable Ops pkgOps, @Nullable String[] opNames, long beginTimeMillis,
+ long endTimeMillis) {
+ // TODO: Implement historical data collection
+ if (pkgOps == null) {
+ return null;
+ }
+
+ final HistoricalPackageOps historicalPackageOps = new HistoricalPackageOps(uid,
+ pkgOps.packageName);
+
+ if (opNames == null) {
+ opNames = AppOpsManager.getOpStrs();
+ }
+ for (String opName : opNames) {
+ addHistoricOpEntry(AppOpsManager.strOpToOp(opName), pkgOps, historicalPackageOps);
+ }
+
+ return historicalPackageOps;
+ }
+
+ @Override
+ public @Nullable HistoricalPackageOps getHistoricalPackagesOps(int uid,
+ @NonNull String packageName, @Nullable String[] opNames,
+ long beginTimeMillis, long endTimeMillis) {
+ Preconditions.checkNotNull(packageName,
+ "packageName cannot be null");
+ Preconditions.checkArgument(beginTimeMillis >= 0 && beginTimeMillis < endTimeMillis,
+ "beginTimeMillis must be non negative and lesser than endTimeMillis");
+
+ mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
+ Binder.getCallingPid(), Binder.getCallingUid(), "getHistoricalPackagesOps");
+
+ final String resolvedPackageName = resolvePackageName(uid, packageName);
+ if (resolvedPackageName == null) {
+ return null;
+ }
+
+ // TODO: Implement historical data collection
+ final Ops pkgOps = getOpsRawLocked(uid, resolvedPackageName, false /* edit */,
+ false /* uidMismatchExpected */);
+ return createHistoricalPackageOps(uid, pkgOps, opNames, beginTimeMillis, endTimeMillis);
+ }
+
+ private static void addHistoricOpEntry(int opCode, @NonNull Ops ops,
+ @NonNull HistoricalPackageOps outHistoricalPackageOps) {
+ final Op op = ops.get(opCode);
+ if (op == null) {
+ return;
+ }
+
+ final HistoricalOpEntry historicalOpEntry = new HistoricalOpEntry(opCode);
+
+ // TODO: Keep per UID state duration
+ for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
+ final int acceptCount;
+ final int rejectCount;
+ if (op.rejectTime[uidState] == 0) {
+ acceptCount = 1;
+ rejectCount = 0;
+ } else {
+ acceptCount = 0;
+ rejectCount = 1;
+ }
+ historicalOpEntry.addEntry(uidState, acceptCount, rejectCount, 0);
+ }
+
+ outHistoricalPackageOps.addEntry(historicalOpEntry);
+ }
+
+ @Override
public List<AppOpsManager.PackageOps> getUidOps(int uid, int[] ops) {
mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
Binder.getCallingPid(), Binder.getCallingUid(), null);
@@ -2020,7 +2135,8 @@ public class AppOpsService extends IAppOpsService.Stub {
try {
ApplicationInfo appInfo = ActivityThread.getPackageManager()
.getApplicationInfo(packageName,
- PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
UserHandle.getUserId(uid));
if (appInfo != null) {
pkgUid = appInfo.uid;
diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java
index f15cd2adbf07..b6fa1570cdb0 100644
--- a/services/core/java/com/android/server/MmsServiceBroker.java
+++ b/services/core/java/com/android/server/MmsServiceBroker.java
@@ -17,7 +17,6 @@
package com.android.server;
import android.Manifest;
-import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.content.ComponentName;
@@ -337,6 +336,7 @@ public class MmsServiceBroker extends SystemService {
mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Send MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
+ Slog.e(TAG, callingPkg + " is not allowed to call sendMessage()");
return;
}
contentUri = adjustUriForUserAndGrantPermission(contentUri,
@@ -355,6 +355,7 @@ public class MmsServiceBroker extends SystemService {
"Download MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_RECEIVE_MMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
+ Slog.e(TAG, callingPkg + " is not allowed to call downloadMessage()");
return;
}
contentUri = adjustUriForUserAndGrantPermission(contentUri,
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 865a651fb722..92d8d73d32d1 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -61,6 +61,7 @@ import android.net.TetherStatsParcel;
import android.net.INetworkManagementEventObserver;
import android.net.ITetheringStatsProvider;
import android.net.InterfaceConfiguration;
+import android.net.InterfaceConfigurationParcel;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.Network;
@@ -970,55 +971,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public String[] listInterfaces() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- return NativeDaemonEvent.filterMessageList(
- mConnector.executeForList("interface", "list"), InterfaceListResult);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ final List<String> result = mNetdService.interfaceGetList();
+ return result.toArray(EMPTY_STRING_ARRAY);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@Override
public InterfaceConfiguration getInterfaceConfig(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- final NativeDaemonEvent event;
+ final InterfaceConfigurationParcel result;
try {
- event = mConnector.execute("interface", "getcfg", iface);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ result = mNetdService.interfaceGetCfg(iface);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
- event.checkCode(InterfaceGetCfgResult);
-
- // Rsp: 213 xx:xx:xx:xx:xx:xx yyy.yyy.yyy.yyy zzz flag1 flag2 flag3
- final StringTokenizer st = new StringTokenizer(event.getMessage());
-
- InterfaceConfiguration cfg;
try {
- cfg = new InterfaceConfiguration();
- cfg.setHardwareAddress(st.nextToken(" "));
- InetAddress addr = null;
- int prefixLength = 0;
- try {
- addr = NetworkUtils.numericToInetAddress(st.nextToken());
- } catch (IllegalArgumentException iae) {
- Slog.e(TAG, "Failed to parse ipaddr", iae);
- }
-
- try {
- prefixLength = Integer.parseInt(st.nextToken());
- } catch (NumberFormatException nfe) {
- Slog.e(TAG, "Failed to parse prefixLength", nfe);
- }
-
- cfg.setLinkAddress(new LinkAddress(addr, prefixLength));
- while (st.hasMoreTokens()) {
- cfg.setFlag(st.nextToken());
- }
- } catch (NoSuchElementException nsee) {
- throw new IllegalStateException("Invalid response from daemon: " + event);
+ final InterfaceConfiguration cfg = InterfaceConfiguration.fromParcel(result);
+ return cfg;
+ } catch (IllegalArgumentException iae) {
+ throw new IllegalStateException("Invalid InterfaceConfigurationParcel", iae);
}
- return cfg;
}
@Override
@@ -1029,17 +1004,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub
throw new IllegalStateException("Null LinkAddress given");
}
- final Command cmd = new Command("interface", "setcfg", iface,
- linkAddr.getAddress().getHostAddress(),
- linkAddr.getPrefixLength());
- for (String flag : cfg.getFlags()) {
- cmd.appendArg(flag);
- }
+ final InterfaceConfigurationParcel cfgParcel = cfg.toParcel(iface);
try {
- mConnector.execute(cmd);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetCfg(cfgParcel);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1063,10 +1033,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute(
- "interface", "ipv6privacyextensions", iface, enable ? "enable" : "disable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetIPv6PrivacyExtensions(iface, enable);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1076,9 +1045,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void clearInterfaceAddresses(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "clearaddrs", iface);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceClearAddrs(iface);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1086,9 +1055,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void enableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "ipv6", iface, "enable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetEnableIPv6(iface, true);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1105,9 +1074,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void disableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "ipv6", iface, "disable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetEnableIPv6(iface, false);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1189,11 +1158,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void setMtu(String iface, int mtu) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final NativeDaemonEvent event;
try {
- event = mConnector.execute("interface", "setmtu", iface, mtu);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetMtu(iface, mtu);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 5643a6a66251..54c7d17d70a7 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -878,6 +878,7 @@ class StorageManagerService extends IStorageManager.Stub
mStoraged.onUserStarted(userId);
}
mVold.onSecureKeyguardStateChanged(mSecureKeyguardShowing);
+ mStorageManagerInternal.onReset(mVold);
} catch (Exception e) {
Slog.wtf(TAG, e);
}
@@ -3635,6 +3636,10 @@ class StorageManagerService extends IStorageManager.Stub
private final CopyOnWriteArrayList<ExternalStorageMountPolicy> mPolicies =
new CopyOnWriteArrayList<>();
+ @GuardedBy("mResetListeners")
+ private final List<StorageManagerInternal.ResetListener> mResetListeners =
+ new ArrayList<>();
+
@Override
public void addExternalStoragePolicy(ExternalStorageMountPolicy policy) {
// No locking - CopyOnWriteArrayList
@@ -3666,6 +3671,21 @@ class StorageManagerService extends IStorageManager.Stub
return mountMode;
}
+ @Override
+ public void addResetListener(StorageManagerInternal.ResetListener listener) {
+ synchronized (mResetListeners) {
+ mResetListeners.add(listener);
+ }
+ }
+
+ public void onReset(IVold vold) {
+ synchronized (mResetListeners) {
+ for (StorageManagerInternal.ResetListener listener : mResetListeners) {
+ listener.onReset(vold);
+ }
+ }
+ }
+
public boolean hasExternalStorage(int uid, String packageName) {
// No need to check for system uid. This avoids a deadlock between
// PackageManagerService and AppOpsService.
diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index 3b0850533ad3..ccead6c55b8c 100644
--- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -10,11 +10,11 @@
* 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 an
+ * See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.server.usb;
+package com.android.server.adb;
import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull;
@@ -37,7 +37,7 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
-import android.service.usb.UsbDebuggingManagerProto;
+import android.service.adb.AdbDebuggingManagerProto;
import android.util.Base64;
import android.util.Slog;
@@ -53,8 +53,12 @@ import java.io.OutputStream;
import java.security.MessageDigest;
import java.util.Arrays;
-public class UsbDebuggingManager {
- private static final String TAG = "UsbDebuggingManager";
+/**
+ * Provides communication to the Android Debug Bridge daemon to allow, deny, or clear public keysi
+ * that are authorized to connect to the ADB service itself.
+ */
+public class AdbDebuggingManager {
+ private static final String TAG = "AdbDebuggingManager";
private static final boolean DEBUG = false;
private static final String ADBD_SOCKET = "adbd";
@@ -64,22 +68,22 @@ public class UsbDebuggingManager {
private final Context mContext;
private final Handler mHandler;
- private UsbDebuggingThread mThread;
+ private AdbDebuggingThread mThread;
private boolean mAdbEnabled = false;
private String mFingerprints;
- public UsbDebuggingManager(Context context) {
- mHandler = new UsbDebuggingHandler(FgThread.get().getLooper());
+ public AdbDebuggingManager(Context context) {
+ mHandler = new AdbDebuggingHandler(FgThread.get().getLooper());
mContext = context;
}
- class UsbDebuggingThread extends Thread {
+ class AdbDebuggingThread extends Thread {
private boolean mStopped;
private LocalSocket mSocket;
private OutputStream mOutputStream;
private InputStream mInputStream;
- UsbDebuggingThread() {
+ AdbDebuggingThread() {
super(TAG);
}
@@ -138,7 +142,8 @@ public class UsbDebuggingManager {
if (buffer[0] == 'P' && buffer[1] == 'K') {
String key = new String(Arrays.copyOfRange(buffer, 2, count));
Slog.d(TAG, "Received public key: " + key);
- Message msg = mHandler.obtainMessage(UsbDebuggingHandler.MESSAGE_ADB_CONFIRM);
+ Message msg = mHandler.obtainMessage(
+ AdbDebuggingHandler.MESSAGE_ADB_CONFIRM);
msg.obj = key;
mHandler.sendMessage(msg);
} else {
@@ -188,8 +193,7 @@ public class UsbDebuggingManager {
if (!mStopped && mOutputStream != null) {
try {
mOutputStream.write(msg.getBytes());
- }
- catch (IOException ex) {
+ } catch (IOException ex) {
Slog.e(TAG, "Failed to write response:", ex);
}
}
@@ -197,7 +201,7 @@ public class UsbDebuggingManager {
}
}
- class UsbDebuggingHandler extends Handler {
+ class AdbDebuggingHandler extends Handler {
private static final int MESSAGE_ADB_ENABLED = 1;
private static final int MESSAGE_ADB_DISABLED = 2;
private static final int MESSAGE_ADB_ALLOW = 3;
@@ -205,26 +209,28 @@ public class UsbDebuggingManager {
private static final int MESSAGE_ADB_CONFIRM = 5;
private static final int MESSAGE_ADB_CLEAR = 6;
- public UsbDebuggingHandler(Looper looper) {
+ AdbDebuggingHandler(Looper looper) {
super(looper);
}
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_ADB_ENABLED:
- if (mAdbEnabled)
+ if (mAdbEnabled) {
break;
+ }
mAdbEnabled = true;
- mThread = new UsbDebuggingThread();
+ mThread = new AdbDebuggingThread();
mThread.start();
break;
case MESSAGE_ADB_DISABLED:
- if (!mAdbEnabled)
+ if (!mAdbEnabled) {
break;
+ }
mAdbEnabled = false;
@@ -236,7 +242,7 @@ public class UsbDebuggingManager {
break;
case MESSAGE_ADB_ALLOW: {
- String key = (String)msg.obj;
+ String key = (String) msg.obj;
String fingerprints = getFingerprints(key);
if (!fingerprints.equals(mFingerprints)) {
@@ -270,7 +276,7 @@ public class UsbDebuggingManager {
}
break;
}
- String key = (String)msg.obj;
+ String key = (String) msg.obj;
String fingerprints = getFingerprints(key);
if ("".equals(fingerprints)) {
if (mThread != null) {
@@ -317,8 +323,9 @@ public class UsbDebuggingManager {
for (int i = 0; i < digest.length; i++) {
sb.append(hex.charAt((digest[i] >> 4) & 0xf));
sb.append(hex.charAt(digest[i] & 0xf));
- if (i < digest.length - 1)
+ if (i < digest.length - 1) {
sb.append(":");
+ }
}
return sb.toString();
}
@@ -413,16 +420,14 @@ public class UsbDebuggingManager {
if (!keyFile.exists()) {
keyFile.createNewFile();
FileUtils.setPermissions(keyFile.toString(),
- FileUtils.S_IRUSR | FileUtils.S_IWUSR |
- FileUtils.S_IRGRP, -1, -1);
+ FileUtils.S_IRUSR | FileUtils.S_IWUSR | FileUtils.S_IRGRP, -1, -1);
}
FileOutputStream fo = new FileOutputStream(keyFile, true);
fo.write(key.getBytes());
fo.write('\n');
fo.close();
- }
- catch (IOException ex) {
+ } catch (IOException ex) {
Slog.e(TAG, "Error writing key:" + ex);
}
}
@@ -434,24 +439,40 @@ public class UsbDebuggingManager {
}
}
+ /**
+ * When {@code enabled} is {@code true}, this allows ADB debugging and starts the ADB hanler
+ * thread. When {@code enabled} is {@code false}, this disallows ADB debugging and shuts
+ * down the handler thread.
+ */
public void setAdbEnabled(boolean enabled) {
- mHandler.sendEmptyMessage(enabled ? UsbDebuggingHandler.MESSAGE_ADB_ENABLED
- : UsbDebuggingHandler.MESSAGE_ADB_DISABLED);
+ mHandler.sendEmptyMessage(enabled ? AdbDebuggingHandler.MESSAGE_ADB_ENABLED
+ : AdbDebuggingHandler.MESSAGE_ADB_DISABLED);
}
- public void allowUsbDebugging(boolean alwaysAllow, String publicKey) {
- Message msg = mHandler.obtainMessage(UsbDebuggingHandler.MESSAGE_ADB_ALLOW);
+ /**
+ * Allows the debugging from the endpoint identified by {@code publicKey} either once or
+ * always if {@code alwaysAllow} is {@code true}.
+ */
+ public void allowDebugging(boolean alwaysAllow, String publicKey) {
+ Message msg = mHandler.obtainMessage(AdbDebuggingHandler.MESSAGE_ADB_ALLOW);
msg.arg1 = alwaysAllow ? 1 : 0;
msg.obj = publicKey;
mHandler.sendMessage(msg);
}
- public void denyUsbDebugging() {
- mHandler.sendEmptyMessage(UsbDebuggingHandler.MESSAGE_ADB_DENY);
+ /**
+ * Denies debugging connection from the device that last requested to connect.
+ */
+ public void denyDebugging() {
+ mHandler.sendEmptyMessage(AdbDebuggingHandler.MESSAGE_ADB_DENY);
}
- public void clearUsbDebuggingKeys() {
- mHandler.sendEmptyMessage(UsbDebuggingHandler.MESSAGE_ADB_CLEAR);
+ /**
+ * Clears all previously accepted ADB debugging public keys. Any subsequent request will need
+ * to pass through {@link #allowUsbDebugging(boolean, String)} again.
+ */
+ public void clearDebuggingKeys() {
+ mHandler.sendEmptyMessage(AdbDebuggingHandler.MESSAGE_ADB_CLEAR);
}
/**
@@ -460,19 +481,19 @@ public class UsbDebuggingManager {
public void dump(DualDumpOutputStream dump, String idName, long id) {
long token = dump.start(idName, id);
- dump.write("connected_to_adb", UsbDebuggingManagerProto.CONNECTED_TO_ADB, mThread != null);
- writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEIVED,
+ dump.write("connected_to_adb", AdbDebuggingManagerProto.CONNECTED_TO_ADB, mThread != null);
+ writeStringIfNotNull(dump, "last_key_received", AdbDebuggingManagerProto.LAST_KEY_RECEVIED,
mFingerprints);
try {
- dump.write("user_keys", UsbDebuggingManagerProto.USER_KEYS,
+ dump.write("user_keys", AdbDebuggingManagerProto.USER_KEYS,
FileUtils.readTextFile(new File("/data/misc/adb/adb_keys"), 0, null));
} catch (IOException e) {
Slog.e(TAG, "Cannot read user keys", e);
}
try {
- dump.write("system_keys", UsbDebuggingManagerProto.SYSTEM_KEYS,
+ dump.write("system_keys", AdbDebuggingManagerProto.SYSTEM_KEYS,
FileUtils.readTextFile(new File("/adb_keys"), 0, null));
} catch (IOException e) {
Slog.e(TAG, "Cannot read system keys", e);
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
new file mode 100644
index 000000000000..e5ab8fc84d97
--- /dev/null
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.adb;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.debug.AdbManagerInternal;
+import android.debug.IAdbManager;
+import android.debug.IAdbTransport;
+import android.hardware.usb.UsbManager;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.service.adb.AdbServiceDumpProto;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.dump.DualDumpOutputStream;
+import com.android.server.FgThread;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Collections;
+
+/**
+ * The Android Debug Bridge (ADB) service. This controls the availability of ADB and authorization
+ * of devices allowed to connect to ADB.
+ */
+public class AdbService extends IAdbManager.Stub {
+ /**
+ * Manages the service lifecycle for {@code AdbService} in {@code SystemServer}.
+ */
+ public static class Lifecycle extends SystemService {
+ private AdbService mAdbService;
+
+ public Lifecycle(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ mAdbService = new AdbService(getContext());
+ publishBinderService(Context.ADB_SERVICE, mAdbService);
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
+ mAdbService.systemReady();
+ } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
+ mAdbService.bootCompleted();
+ }
+ }
+ }
+
+ private class AdbManagerInternalImpl extends AdbManagerInternal {
+ @Override
+ public void registerTransport(IAdbTransport transport) {
+ mTransports.put(transport.asBinder(), transport);
+ }
+
+ @Override
+ public void unregisterTransport(IAdbTransport transport) {
+ mTransports.remove(transport.asBinder());
+ }
+
+ @Override
+ public boolean isAdbEnabled() {
+ return mAdbEnabled;
+ }
+ }
+
+ private final class AdbHandler extends Handler {
+ AdbHandler(Looper looper) {
+ super(looper);
+ try {
+ /*
+ * Use the normal bootmode persistent prop to maintain state of adb across
+ * all boot modes.
+ */
+ mAdbEnabled = containsFunction(
+ SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),
+ UsbManager.USB_FUNCTION_ADB);
+
+ // register observer to listen for settings changes
+ mContentResolver.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.ADB_ENABLED),
+ false, new AdbSettingsObserver());
+ } catch (Exception e) {
+ Slog.e(TAG, "Error initializing AdbHandler", e);
+ }
+ }
+
+ private boolean containsFunction(String functions, String function) {
+ int index = functions.indexOf(function);
+ if (index < 0) return false;
+ if (index > 0 && functions.charAt(index - 1) != ',') return false;
+ int charAfter = index + function.length();
+ if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false;
+ return true;
+ }
+
+ public void sendMessage(int what, boolean arg) {
+ removeMessages(what);
+ Message m = Message.obtain(this, what);
+ m.arg1 = (arg ? 1 : 0);
+ sendMessage(m);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ENABLE_ADB:
+ setAdbEnabled(msg.arg1 == 1);
+ break;
+ case MSG_BOOT_COMPLETED:
+ if (mDebuggingManager != null) {
+ mDebuggingManager.setAdbEnabled(mAdbEnabled);
+ }
+ break;
+ }
+ }
+ }
+
+ private class AdbSettingsObserver extends ContentObserver {
+ AdbSettingsObserver() {
+ super(null);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ boolean enable = (Settings.Global.getInt(mContentResolver,
+ Settings.Global.ADB_ENABLED, 0) > 0);
+ mHandler.sendMessage(MSG_ENABLE_ADB, enable);
+ }
+ }
+
+ private static final String TAG = "AdbService";
+ private static final boolean DEBUG = false;
+
+ private static final int MSG_ENABLE_ADB = 1;
+ private static final int MSG_BOOT_COMPLETED = 2;
+
+ /**
+ * The persistent property which stores whether adb is enabled or not.
+ * May also contain vendor-specific default functions for testing purposes.
+ */
+ private static final String USB_PERSISTENT_CONFIG_PROPERTY = "persist.sys.usb.config";
+
+ private final Context mContext;
+ private final ContentResolver mContentResolver;
+ private final AdbService.AdbHandler mHandler;
+ private final ArrayMap<IBinder, IAdbTransport> mTransports = new ArrayMap<>();
+
+ private boolean mAdbEnabled;
+ private AdbDebuggingManager mDebuggingManager;
+
+ private AdbService(Context context) {
+ mContext = context;
+ mContentResolver = context.getContentResolver();
+
+ boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
+ boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
+ if (secureAdbEnabled && !dataEncrypted) {
+ mDebuggingManager = new AdbDebuggingManager(context);
+ }
+
+ mHandler = new AdbHandler(FgThread.get().getLooper());
+
+ LocalServices.addService(AdbManagerInternal.class, new AdbManagerInternalImpl());
+ }
+
+ /**
+ * Called in response to {@code SystemService.PHASE_ACTIVITY_MANAGER_READY} from {@code
+ * SystemServer}.
+ */
+ public void systemReady() {
+ if (DEBUG) Slog.d(TAG, "systemReady");
+
+ // make sure the ADB_ENABLED setting value matches the current state
+ try {
+ Settings.Global.putInt(mContentResolver,
+ Settings.Global.ADB_ENABLED, mAdbEnabled ? 1 : 0);
+ } catch (SecurityException e) {
+ // If UserManager.DISALLOW_DEBUGGING_FEATURES is on, that this setting can't be changed.
+ Slog.d(TAG, "ADB_ENABLED is restricted.");
+ }
+ }
+
+ /**
+ * Callend in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}.
+ */
+ public void bootCompleted() {
+ if (DEBUG) Slog.d(TAG, "boot completed");
+ mHandler.sendEmptyMessage(MSG_BOOT_COMPLETED);
+ }
+
+ @Override
+ public void allowDebugging(boolean alwaysAllow, String publicKey) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING, null);
+ if (mDebuggingManager != null) {
+ mDebuggingManager.allowDebugging(alwaysAllow, publicKey);
+ }
+ }
+
+ @Override
+ public void denyDebugging() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING, null);
+ if (mDebuggingManager != null) {
+ mDebuggingManager.denyDebugging();
+ }
+ }
+
+ @Override
+ public void clearDebuggingKeys() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING, null);
+ if (mDebuggingManager != null) {
+ mDebuggingManager.clearDebuggingKeys();
+ } else {
+ throw new RuntimeException("Cannot clear ADB debugging keys, "
+ + "AdbDebuggingManager not enabled");
+ }
+ }
+
+ private void setAdbEnabled(boolean enable) {
+ if (DEBUG) Slog.d(TAG, "setAdbEnabled(" + enable + "), mAdbEnabled=" + mAdbEnabled);
+
+ if (enable == mAdbEnabled) {
+ return;
+ }
+ mAdbEnabled = enable;
+
+ for (IAdbTransport transport : mTransports.values()) {
+ try {
+ transport.onAdbEnabled(enable);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to send onAdbEnabled to transport " + transport.toString());
+ }
+ }
+
+ if (mDebuggingManager != null) {
+ mDebuggingManager.setAdbEnabled(enable);
+ }
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) return;
+
+ final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ ArraySet<String> argsSet = new ArraySet<>();
+ Collections.addAll(argsSet, args);
+
+ boolean dumpAsProto = false;
+ if (argsSet.contains("--proto")) {
+ dumpAsProto = true;
+ }
+
+ if (argsSet.size() == 0 || argsSet.contains("-a") || dumpAsProto) {
+ DualDumpOutputStream dump;
+ if (dumpAsProto) {
+ dump = new DualDumpOutputStream(new ProtoOutputStream(fd));
+ } else {
+ pw.println("ADB MANAGER STATE (dumpsys adb):");
+
+ dump = new DualDumpOutputStream(new IndentingPrintWriter(pw, " "));
+ }
+
+ if (mDebuggingManager != null) {
+ mDebuggingManager.dump(dump, "debugging_manager",
+ AdbServiceDumpProto.DEBUGGING_MANAGER);
+ }
+
+ dump.flush();
+ } else {
+ pw.println("Dump current ADB state");
+ pw.println(" No commands available");
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index a72470d90dab..05293b5138a0 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -373,7 +373,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
return getOrCreateStack(windowingMode, activityType, onTop);
}
- private int getNextStackId() {
+ @VisibleForTesting
+ int getNextStackId() {
return sNextFreeStackId++;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e8c6365b38cb..4d6fa2927127 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -129,7 +129,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
-import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK;
@@ -5139,6 +5138,14 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public boolean isAppForeground(int uid) {
+ int callerUid = Binder.getCallingUid();
+ if (UserHandle.isCore(callerUid) || callerUid == uid) {
+ return isAppForegroundInternal(uid);
+ }
+ return false;
+ }
+
+ private boolean isAppForegroundInternal(int uid) {
synchronized (this) {
UidRecord uidRec = mActiveUids.get(uid);
if (uidRec == null || uidRec.idle) {
@@ -6502,6 +6509,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Wait for the provider to be published...
final long timeout = SystemClock.uptimeMillis() + CONTENT_PROVIDER_WAIT_TIMEOUT;
+ boolean timedOut = false;
synchronized (cpr) {
while (cpr.provider == null) {
if (cpr.launchingApp == null) {
@@ -6525,12 +6533,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
cpr.wait(wait);
if (cpr.provider == null) {
- Slog.wtf(TAG, "Timeout waiting for provider "
- + cpi.applicationInfo.packageName + "/"
- + cpi.applicationInfo.uid + " for provider "
- + name
- + " providerRunning=" + providerRunning);
- return null;
+ timedOut = true;
+ break;
}
} catch (InterruptedException ex) {
} finally {
@@ -6540,7 +6544,26 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
}
- return cpr != null ? cpr.newHolder(conn) : null;
+ if (timedOut) {
+ // Note we do it afer releasing the lock.
+ String callerName = "unknown";
+ synchronized (this) {
+ final ProcessRecord record = mProcessList.getLRURecordForAppLocked(caller);
+ if (record != null) {
+ callerName = record.processName;
+ }
+ }
+
+ Slog.wtf(TAG, "Timeout waiting for provider "
+ + cpi.applicationInfo.packageName + "/"
+ + cpi.applicationInfo.uid + " for provider "
+ + name
+ + " providerRunning=" + providerRunning
+ + " caller=" + callerName + "/" + Binder.getCallingUid());
+ return null;
+ }
+
+ return cpr.newHolder(conn);
}
private static final class StartActivityRunnable implements Runnable {
@@ -8380,7 +8403,7 @@ public class ActivityManagerService extends IActivityManager.Stub
throw e.rethrowAsRuntimeException();
}
}
- mAtmInternal.startHomeActivity(currentUserId, "systemReady");
+ mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 865c774a2267..47b4f4700049 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -18,16 +18,7 @@ package com.android.server.am;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
import static android.app.ActivityManager.TaskDescription.ATTR_TASKDESCRIPTION_PREFIX;
-import static android.app.ActivityOptions.ANIM_CLIP_REVEAL;
-import static android.app.ActivityOptions.ANIM_CUSTOM;
-import static android.app.ActivityOptions.ANIM_OPEN_CROSS_PROFILE_APPS;
-import static android.app.ActivityOptions.ANIM_REMOTE_ANIMATION;
-import static android.app.ActivityOptions.ANIM_SCALE_UP;
import static android.app.ActivityOptions.ANIM_SCENE_TRANSITION;
-import static android.app.ActivityOptions.ANIM_THUMBNAIL_ASPECT_SCALE_DOWN;
-import static android.app.ActivityOptions.ANIM_THUMBNAIL_ASPECT_SCALE_UP;
-import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN;
-import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_UP;
import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE;
@@ -156,7 +147,6 @@ import android.content.pm.ApplicationInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
-import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Binder;
import android.os.Build;
@@ -177,8 +167,6 @@ import android.util.MergedConfiguration;
import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
-import android.view.AppTransitionAnimationSpec;
-import android.view.IAppTransitionAnimationSpecsFuture;
import android.view.IApplicationToken;
import android.view.RemoteAnimationDefinition;
import android.view.WindowManager.LayoutParams;
@@ -1502,93 +1490,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
void applyOptionsLocked() {
if (pendingOptions != null
&& pendingOptions.getAnimationType() != ANIM_SCENE_TRANSITION) {
- final int animationType = pendingOptions.getAnimationType();
- switch (animationType) {
- case ANIM_CUSTOM:
- service.mWindowManager.overridePendingAppTransition(
- pendingOptions.getPackageName(),
- pendingOptions.getCustomEnterResId(),
- pendingOptions.getCustomExitResId(),
- pendingOptions.getOnAnimationStartListener());
- break;
- case ANIM_CLIP_REVEAL:
- service.mWindowManager.overridePendingAppTransitionClipReveal(
- pendingOptions.getStartX(), pendingOptions.getStartY(),
- pendingOptions.getWidth(), pendingOptions.getHeight());
- if (intent.getSourceBounds() == null) {
- intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
- pendingOptions.getStartY(),
- pendingOptions.getStartX()+pendingOptions.getWidth(),
- pendingOptions.getStartY()+pendingOptions.getHeight()));
- }
- break;
- case ANIM_SCALE_UP:
- service.mWindowManager.overridePendingAppTransitionScaleUp(
- pendingOptions.getStartX(), pendingOptions.getStartY(),
- pendingOptions.getWidth(), pendingOptions.getHeight());
- if (intent.getSourceBounds() == null) {
- intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
- pendingOptions.getStartY(),
- pendingOptions.getStartX()+pendingOptions.getWidth(),
- pendingOptions.getStartY()+pendingOptions.getHeight()));
- }
- break;
- case ANIM_THUMBNAIL_SCALE_UP:
- case ANIM_THUMBNAIL_SCALE_DOWN:
- final boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
- final GraphicBuffer buffer = pendingOptions.getThumbnail();
- service.mWindowManager.overridePendingAppTransitionThumb(buffer,
- pendingOptions.getStartX(), pendingOptions.getStartY(),
- pendingOptions.getOnAnimationStartListener(),
- scaleUp);
- if (intent.getSourceBounds() == null && buffer != null) {
- intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
- pendingOptions.getStartY(),
- pendingOptions.getStartX() + buffer.getWidth(),
- pendingOptions.getStartY() + buffer.getHeight()));
- }
- break;
- case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
- case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
- final AppTransitionAnimationSpec[] specs = pendingOptions.getAnimSpecs();
- final IAppTransitionAnimationSpecsFuture specsFuture =
- pendingOptions.getSpecsFuture();
- if (specsFuture != null) {
- service.mWindowManager.overridePendingAppTransitionMultiThumbFuture(
- specsFuture, pendingOptions.getOnAnimationStartListener(),
- animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP);
- } else if (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_DOWN
- && specs != null) {
- service.mWindowManager.overridePendingAppTransitionMultiThumb(
- specs, pendingOptions.getOnAnimationStartListener(),
- pendingOptions.getAnimationFinishedListener(), false);
- } else {
- service.mWindowManager.overridePendingAppTransitionAspectScaledThumb(
- pendingOptions.getThumbnail(),
- pendingOptions.getStartX(), pendingOptions.getStartY(),
- pendingOptions.getWidth(), pendingOptions.getHeight(),
- pendingOptions.getOnAnimationStartListener(),
- (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP));
- if (intent.getSourceBounds() == null) {
- intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
- pendingOptions.getStartY(),
- pendingOptions.getStartX() + pendingOptions.getWidth(),
- pendingOptions.getStartY() + pendingOptions.getHeight()));
- }
- }
- break;
- case ANIM_OPEN_CROSS_PROFILE_APPS:
- service.mWindowManager.overridePendingAppTransitionStartCrossProfileApps();
- break;
- case ANIM_REMOTE_ANIMATION:
- service.mWindowManager.overridePendingAppTransitionRemote(
- pendingOptions.getRemoteAnimationAdapter());
- break;
- default:
- Slog.e(TAG, "applyOptionsLocked: Unknown animationType=" + animationType);
- break;
- }
-
+ mWindowContainerController.applyOptionsLocked(pendingOptions, intent);
if (task == null) {
clearOptionsLocked(false /* withAbort */);
} else {
@@ -2768,7 +2670,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
preserveWindow);
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
- lifecycleItem = ResumeActivityItem.obtain(service.isNextTransitionForward());
+ lifecycleItem = ResumeActivityItem.obtain(
+ getDisplay().getWindowContainerController().isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 026c5cc3017d..d646e9ae9458 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -48,6 +48,26 @@ import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
import static com.android.server.am.ActivityDisplay.POSITION_BOTTOM;
import static com.android.server.am.ActivityDisplay.POSITION_TOP;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
+import static com.android.server.am.ActivityStack.ActivityState.FINISHING;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
+import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
+import static com.android.server.am.ActivityStackProto.BOUNDS;
+import static com.android.server.am.ActivityStackProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityStackProto.DISPLAY_ID;
+import static com.android.server.am.ActivityStackProto.FULLSCREEN;
+import static com.android.server.am.ActivityStackProto.ID;
+import static com.android.server.am.ActivityStackProto.RESUMED_ACTIVITY;
+import static com.android.server.am.ActivityStackProto.TASKS;
+import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
+import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
+import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
+import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_APP;
@@ -66,7 +86,6 @@ import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_USER_LE
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_ADD_REMOVE;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_APP;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONTAINERS;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_PAUSE;
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE;
@@ -81,29 +100,10 @@ import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_USER_
import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY;
import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ActivityTaskManagerService.H.FIRST_ACTIVITY_STACK_MSG;
import static com.android.server.am.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE;
import static com.android.server.am.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
-import static com.android.server.am.ActivityStack.ActivityState.FINISHING;
-import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
-import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
-import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
-import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
-import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
-import static com.android.server.am.ActivityStackProto.BOUNDS;
-import static com.android.server.am.ActivityStackProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.ActivityStackProto.DISPLAY_ID;
-import static com.android.server.am.ActivityStackProto.FULLSCREEN;
-import static com.android.server.am.ActivityStackProto.ID;
-import static com.android.server.am.ActivityStackProto.RESUMED_ACTIVITY;
-import static com.android.server.am.ActivityStackProto.TASKS;
-import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
-import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
-import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
-import static com.android.server.am.ActivityTaskManagerService.H.FIRST_ACTIVITY_STACK_MSG;
import static java.lang.Integer.MAX_VALUE;
import android.app.Activity;
@@ -156,6 +156,7 @@ import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ItemMatcher;
import com.android.server.wm.ConfigurationContainer;
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.StackWindowController;
import com.android.server.wm.StackWindowListener;
import com.android.server.wm.WindowManagerService;
@@ -820,8 +821,13 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
void positionChildWindowContainerAtBottom(TaskRecord child) {
+ // If there are other focusable stacks on the display, the z-order of the display should not
+ // be changed just because a task was placed at the bottom. E.g. if it is moving the topmost
+ // task to bottom, the next focusable stack on the same display should be focused.
+ final ActivityStack nextFocusableStack = getDisplay().getNextFocusableStack(
+ child.getStack(), true /* ignoreCurrent */);
mWindowContainerController.positionChildAtBottom(child.getWindowContainerController(),
- true /* includingParents */);
+ nextFocusableStack == null /* includingParents */);
}
/**
@@ -1132,8 +1138,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
getDisplay().positionChildAtBottom(this, reason);
if (task != null) {
- // TODO(b/111541062): We probably don't want to change display z-order to bottom just
- // because one of its stacks moved to bottom.
insertTaskAtBottom(task);
}
}
@@ -1807,13 +1811,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
return false;
}
- final ActivityRecord top = topRunningActivityLocked();
- if (top == null && isInStackLocked(starting) == null && !isTopStackOnDisplay()) {
- // Shouldn't be visible if you don't have any running activities, not starting one, and
- // not the top stack on display.
- return false;
- }
-
final ActivityDisplay display = getDisplay();
boolean gotSplitScreenStack = false;
boolean gotOpaqueSplitScreenPrimary = false;
@@ -1822,9 +1819,16 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
final boolean isAssistantType = isActivityTypeAssistant();
for (int i = display.getChildCount() - 1; i >= 0; --i) {
final ActivityStack other = display.getChildAt(i);
+ final boolean hasRunningActivities = other.topRunningActivityLocked() != null;
if (other == this) {
- // Should be visible if there is no other stack occluding it.
- return true;
+ // Should be visible if there is no other stack occluding it, unless it doesn't
+ // have any running activities, not starting one and not home stack.
+ return hasRunningActivities || isInStackLocked(starting) != null
+ || isActivityTypeHome();
+ }
+
+ if (!hasRunningActivities) {
+ continue;
}
final int otherWindowingMode = other.getWindowingMode();
@@ -2615,17 +2619,18 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// that the previous one will be hidden soon. This way it can know
// to ignore it when computing the desired screen orientation.
boolean anim = true;
+ final DisplayWindowController dwc = getDisplay().getWindowContainerController();
if (prev != null) {
if (prev.finishing) {
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION,
"Prepare close transition: prev=" + prev);
if (mStackSupervisor.mNoAnimActivities.contains(prev)) {
anim = false;
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
+ dwc.prepareAppTransition(TRANSIT_NONE, false);
} else {
- mWindowManager.prepareAppTransition(prev.getTask() == next.getTask()
- ? TRANSIT_ACTIVITY_CLOSE
- : TRANSIT_TASK_CLOSE, false);
+ dwc.prepareAppTransition(
+ prev.getTask() == next.getTask() ? TRANSIT_ACTIVITY_CLOSE
+ : TRANSIT_TASK_CLOSE, false);
}
prev.setVisibility(false);
} else {
@@ -2633,22 +2638,21 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
"Prepare open transition: prev=" + prev);
if (mStackSupervisor.mNoAnimActivities.contains(next)) {
anim = false;
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
+ dwc.prepareAppTransition(TRANSIT_NONE, false);
} else {
- mWindowManager.prepareAppTransition(prev.getTask() == next.getTask()
- ? TRANSIT_ACTIVITY_OPEN
- : next.mLaunchTaskBehind
- ? TRANSIT_TASK_OPEN_BEHIND
- : TRANSIT_TASK_OPEN, false);
+ dwc.prepareAppTransition(
+ prev.getTask() == next.getTask() ? TRANSIT_ACTIVITY_OPEN
+ : next.mLaunchTaskBehind ? TRANSIT_TASK_OPEN_BEHIND
+ : TRANSIT_TASK_OPEN, false);
}
}
} else {
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare open transition: no previous");
if (mStackSupervisor.mNoAnimActivities.contains(next)) {
anim = false;
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
+ dwc.prepareAppTransition(TRANSIT_NONE, false);
} else {
- mWindowManager.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false);
+ dwc.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false);
}
}
@@ -2777,7 +2781,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
next.clearOptionsLocked();
transaction.setLifecycleStateRequest(
ResumeActivityItem.obtain(next.app.getReportedProcState(),
- mService.isNextTransitionForward()));
+ getDisplay().getWindowContainerController()
+ .isNextTransitionForward()));
mService.getLifecycleManager().scheduleTransaction(transaction);
if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Resumed "
@@ -2912,7 +2917,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
private void insertTaskAtBottom(TaskRecord task) {
- // Unlike insertTaskAtPosition, this will also position parents of the windowcontroller.
mTaskHistory.remove(task);
final int position = getAdjustedPositionForTask(task, 0, null);
mTaskHistory.add(position, task);
@@ -2984,10 +2988,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
task.setFrontOfTask();
if (!isHomeOrRecentsStack() || numActivities() > 0) {
+ final DisplayWindowController dwc = getDisplay().getWindowContainerController();
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION,
"Prepare open transition: starting " + r);
if ((r.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
- mWindowManager.prepareAppTransition(TRANSIT_NONE, keepCurTransition);
+ dwc.prepareAppTransition(TRANSIT_NONE, keepCurTransition);
mStackSupervisor.mNoAnimActivities.add(r);
} else {
int transit = TRANSIT_ACTIVITY_OPEN;
@@ -3006,7 +3011,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
transit = TRANSIT_TASK_OPEN;
}
}
- mWindowManager.prepareAppTransition(transit, keepCurTransition);
+ dwc.prepareAppTransition(transit, keepCurTransition);
mStackSupervisor.mNoAnimActivities.remove(r);
}
boolean doShow = true;
@@ -3635,8 +3640,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
int taskNdx = mTaskHistory.indexOf(finishedTask);
final TaskRecord task = finishedTask;
int activityNdx = task.mActivities.indexOf(r);
- mWindowManager.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE,
- false /* alwaysKeepCurrent */);
+ getDisplay().getWindowContainerController().prepareAppTransition(
+ TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false);
finishedTask = task;
// Also terminate any activities below it that aren't yet
@@ -3801,7 +3806,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mService.getTaskChangeNotificationController().notifyTaskRemovalStarted(
task.taskId);
}
- mWindowManager.prepareAppTransition(transit, false);
+ getDisplay().getWindowContainerController().prepareAppTransition(transit, false);
// Tell window manager to prepare for this one to be removed.
r.setVisibility(false);
@@ -3856,9 +3861,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
private void prepareActivityHideTransitionAnimation(ActivityRecord r, int transit) {
- mWindowManager.prepareAppTransition(transit, false);
+ final DisplayWindowController dwc = getDisplay().getWindowContainerController();
+ dwc.prepareAppTransition(transit, false);
r.setVisibility(false);
- mWindowManager.executeAppTransition();
+ dwc.executeAppTransition();
if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(r)) {
mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(r);
}
@@ -4602,7 +4608,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
ActivityOptions.abort(options);
}
}
- mWindowManager.prepareAppTransition(transit, false);
+ getDisplay().getWindowContainerController().prepareAppTransition(transit, false);
}
private void updateTaskMovement(TaskRecord task, boolean toFront) {
@@ -4671,7 +4677,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to front transition: task=" + tr);
if (noAnimation) {
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
+ getDisplay().getWindowContainerController().prepareAppTransition(
+ TRANSIT_NONE, false);
if (r != null) {
mStackSupervisor.mNoAnimActivities.add(r);
}
@@ -4753,7 +4760,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mTaskHistory.add(0, tr);
updateTaskMovement(tr, false);
- mWindowManager.prepareAppTransition(TRANSIT_TASK_TO_BACK, false);
+ getDisplay().getWindowContainerController().prepareAppTransition(
+ TRANSIT_TASK_TO_BACK, false);
moveToBack("moveTaskToBackLocked", tr);
if (inPinnedWindowingMode()) {
@@ -5077,8 +5085,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
+ r.intent.getComponent().flattenToShortString());
// Force the destroy to skip right to removal.
r.app = null;
- mWindowManager.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE,
- false /* alwaysKeepCurrent */);
+ getDisplay().getWindowContainerController().prepareAppTransition(
+ TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
finishCurrentActivityLocked(r, FINISH_IMMEDIATELY, false,
"handleAppCrashedLocked");
}
@@ -5410,7 +5418,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
void executeAppTransition(ActivityOptions options) {
- mWindowManager.executeAppTransition();
+ getDisplay().getWindowContainerController().executeAppTransition();
ActivityOptions.abort(options);
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 17454b42524c..695fac274c95 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -44,6 +44,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.activityTypeToString;
import static android.app.WindowConfiguration.windowingModeToString;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY;
@@ -115,8 +116,8 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
+import android.app.AppGlobals;
import android.app.AppOpsManager;
-import android.app.IApplicationThread;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
import android.app.WaitResult;
@@ -146,6 +147,7 @@ import android.hardware.power.V1_0.PowerHint;
import android.os.Binder;
import android.os.Bundle;
import android.os.Debug;
+import android.os.FactoryTest;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -786,10 +788,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
r.moveFocusableActivityToTop(myReason);
return resumeFocusedStacksTopActivitiesLocked(r.getStack(), prev, null);
}
- return mService.startHomeActivityLocked(mCurrentUser, myReason, displayId);
+ return startHomeOnDisplay(mCurrentUser, myReason, displayId);
}
- boolean canStartHomeOnDisplay(ActivityInfo homeActivity, int displayId) {
+ boolean canStartHomeOnDisplay(ActivityInfo homeInfo, int displayId) {
+ if (mService.mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
+ && mService.mTopAction == null) {
+ // We are running in factory test mode, but unable to find the factory test app, so
+ // just sit around displaying the error message and don't try to start anything.
+ return false;
+ }
+
+ final WindowProcessController app =
+ mService.getProcessController(homeInfo.processName, homeInfo.applicationInfo.uid);
+ if (app != null && app.isInstrumenting()) {
+ // Don't do this if the home app is currently being instrumented.
+ return false;
+ }
+
if (displayId == DEFAULT_DISPLAY || (displayId != INVALID_DISPLAY
&& displayId == mService.mVr2dDisplayId)) {
// No restrictions to default display or vr 2d display.
@@ -802,8 +818,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return false;
}
- final boolean supportMultipleInstance = homeActivity.launchMode != LAUNCH_SINGLE_TASK
- && homeActivity.launchMode != LAUNCH_SINGLE_INSTANCE;
+ final boolean supportMultipleInstance = homeInfo.launchMode != LAUNCH_SINGLE_TASK
+ && homeInfo.launchMode != LAUNCH_SINGLE_INSTANCE;
if (!supportMultipleInstance) {
// Can't launch home on other displays if it requested to be single instance.
return false;
@@ -1037,12 +1053,14 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.get(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
+ // We cannot only check the top stack on each display since there might have
+ // always-on-top stacks (e.g. pinned stack).
final ActivityStack stack = display.getChildAt(stackNdx);
- if (!isTopDisplayFocusedStack(stack) || stack.numActivities() == 0) {
+ if (stack.numActivities() == 0) {
continue;
}
final ActivityRecord resumedActivity = stack.getResumedActivity();
- if (resumedActivity == null || !resumedActivity.idle) {
+ if (resumedActivity != null && !resumedActivity.idle) {
if (DEBUG_STATES) Slog.d(TAG_STATES, "allResumedActivitiesIdle: stack="
+ stack.mStackId + " " + resumedActivity + " not idle");
return false;
@@ -1072,6 +1090,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return foundResumed;
}
+ private void executeAppTransitionForAllDisplay() {
+ for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
+ final ActivityDisplay display = mActivityDisplays.get(displayNdx);
+ display.getWindowContainerController().executeAppTransition();
+ }
+ }
+
/**
* Pause all activities in either all of the stacks or just the back stacks.
* @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
@@ -1421,6 +1446,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.appToken);
+
+ final DisplayWindowController dwc = r.getDisplay().getWindowContainerController();
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
@@ -1429,12 +1456,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
r.icicle, r.persistentState, results, newIntents,
- mService.isNextTransitionForward(), profilerInfo));
+ dwc.isNextTransitionForward(), profilerInfo));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
- lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
+ lifecycleItem = ResumeActivityItem.obtain(dwc.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
@@ -1895,7 +1922,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
/**
- * Called when the frontmost task is idle.
+ * Called when all resumed tasks/stacks are idle.
* @return the state of mService.mAm.mBooting before this was called.
*/
@GuardedBy("mService")
@@ -1950,7 +1977,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
r.idle = true;
//Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
- if (isTopDisplayFocusedStack(r.getStack()) || fromTimeout) {
+
+ // Make sure we can finish booting when all resumed activities are idle.
+ if ((!mService.isBooted() && allResumedActivitiesIdle()) || fromTimeout) {
booting = checkFinishBootingLocked();
}
@@ -3520,7 +3549,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
if (stack.getDisplay().allResumedActivitiesComplete()) {
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- mWindowManager.executeAppTransition();
+ // Make sure activity & window visibility should be identical
+ // for all displays in this stage.
+ executeAppTransitionForAllDisplay();
return true;
}
return false;
@@ -4107,7 +4138,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (DEBUG_STACK) Slog.v(TAG, "Display added displayId=" + displayId);
synchronized (mService.mGlobalLock) {
getActivityDisplayOrCreateLocked(displayId);
- mService.startHomeActivityLocked(mCurrentUser, "displayAdded", displayId);
+ startHomeOnDisplay(mCurrentUser, "displayAdded", displayId);
}
}
@@ -4185,6 +4216,76 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return activityDisplay;
}
+ boolean startHomeOnAllDisplays(int userId, String reason) {
+ boolean homeStarted = false;
+ for (int i = mActivityDisplays.size() - 1; i >= 0; i--) {
+ final int displayId = mActivityDisplays.get(i).mDisplayId;
+ homeStarted |= startHomeOnDisplay(userId, reason, displayId);
+ }
+ return homeStarted;
+ }
+
+ /**
+ * This starts home activity on displays that can have system decorations and only if the
+ * home activity can have multiple instances.
+ */
+ boolean startHomeOnDisplay(int userId, String reason, int displayId) {
+ final Intent homeIntent = mService.getHomeIntent();
+ final ActivityInfo aInfo = resolveHomeActivity(userId, homeIntent);
+ if (aInfo == null) {
+ return false;
+ }
+
+ if (!canStartHomeOnDisplay(aInfo, displayId)) {
+ return false;
+ }
+
+ // Update the reason for ANR debugging to verify if the user activity is the one that
+ // actually launched.
+ final String myReason = reason + ":" + userId + ":" + UserHandle.getUserId(
+ aInfo.applicationInfo.uid);
+ mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
+ displayId);
+ return true;
+ }
+
+ /**
+ * This resolves the home activity info and updates the home component of the given intent.
+ * @return the home activity info if any.
+ */
+ private ActivityInfo resolveHomeActivity(int userId, Intent homeIntent) {
+ final int flags = ActivityManagerService.STOCK_PM_FLAGS;
+ final ComponentName comp = homeIntent.getComponent();
+ ActivityInfo aInfo = null;
+ try {
+ if (comp != null) {
+ // Factory test.
+ aInfo = AppGlobals.getPackageManager().getActivityInfo(comp, flags, userId);
+ } else {
+ final String resolvedType =
+ homeIntent.resolveTypeIfNeeded(mService.mContext.getContentResolver());
+ final ResolveInfo info = AppGlobals.getPackageManager()
+ .resolveIntent(homeIntent, resolvedType, flags, userId);
+ if (info != null) {
+ aInfo = info.activityInfo;
+ }
+ }
+ } catch (RemoteException e) {
+ // ignore
+ }
+
+ if (aInfo == null) {
+ Slog.wtf(TAG, "No home screen found for " + homeIntent, new Throwable());
+ return null;
+ }
+
+ homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
+ aInfo = new ActivityInfo(aInfo);
+ aInfo.applicationInfo = mService.getAppInfoForUser(aInfo.applicationInfo, userId);
+ homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
+ return aInfo;
+ }
+
@VisibleForTesting
void addChild(ActivityDisplay activityDisplay, int position) {
positionChildAt(activityDisplay, position);
@@ -4618,6 +4719,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// not run into issues where we still need to draw the task in recents but the
// docked stack is already created.
deferUpdateRecentsHomeStackBounds();
+ // TODO(multi-display): currently recents animation only support default display.
mWindowManager.prepareAppTransition(TRANSIT_DOCK_TASK_FROM_RECENTS, false);
}
diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java
index 20d5ab201307..3151ec9c1b83 100644
--- a/services/core/java/com/android/server/am/ActivityStartController.java
+++ b/services/core/java/com/android/server/am/ActivityStartController.java
@@ -20,8 +20,8 @@ import static android.app.ActivityManager.START_SUCCESS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-
import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
+
import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -35,7 +35,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Binder;
-import android.os.FactoryTest;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -167,10 +166,6 @@ public class ActivityStartController {
}
void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason, int displayId) {
- if (!mSupervisor.canStartHomeOnDisplay(aInfo, displayId)) {
- return;
- }
-
final ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
options.setLaunchActivityType(ACTIVITY_TYPE_HOME);
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index fa227a27dced..37ddaf94c0a0 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1502,7 +1502,7 @@ class ActivityStarter {
mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
// Go ahead and tell window manager to execute app transition for this activity
// since the app transition will not be triggered through the resume channel.
- mService.mWindowManager.executeAppTransition();
+ mTargetStack.getDisplay().getWindowContainerController().executeAppTransition();
} else {
// If the target stack was not previously focusable (previous top running activity
// on that stack was not visible) then any prior calls to move the stack to the
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index 5b0a4a9b0596..9ddd58b6d051 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -65,11 +65,8 @@ import static android.provider.Settings.System.FONT_SCALE;
import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
-import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
-import static android.view.WindowManager.TRANSIT_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
import static com.android.server.am.ActivityManagerService.ANR_TRACE_DIR;
import static com.android.server.am.ActivityManagerService.MY_PID;
@@ -85,13 +82,10 @@ import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEA
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto
- .PREVIOUS_PROC_VISIBLE_TIME_MS;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS;
import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage
- .MODE;
-import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage
- .PACKAGE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
@@ -259,6 +253,7 @@ import com.android.server.pm.UserManagerService;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.vr.VrManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.WindowManagerService;
@@ -1622,8 +1617,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
if (self.isState(
ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
- mWindowManager.overridePendingAppTransition(packageName,
- enterAnim, exitAnim, null);
+ self.getDisplay().getWindowContainerController().overridePendingAppTransition(
+ packageName, enterAnim, exitAnim, null);
}
Binder.restoreCallingIdentity(origId);
@@ -1811,7 +1806,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final long callingId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
if (task == null) {
return;
}
@@ -1971,7 +1967,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
synchronized (mGlobalLock) {
final long ident = Binder.clearCallingIdentity();
try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
if (task == null) {
Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
return;
@@ -2302,7 +2299,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
synchronized (mGlobalLock) {
final long ident = Binder.clearCallingIdentity();
try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
if (task == null) {
Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
return false;
@@ -2437,13 +2435,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
@Override
- public void startSystemLockTaskMode(int taskId) throws RemoteException {
+ public void startSystemLockTaskMode(int taskId) {
mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
// This makes inner call to look as if it was initiated by system.
long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
+ if (task == null) {
+ return;
+ }
// When starting lock task mode the stack must be in front and focused
task.getStack().moveToFront("startSystemLockTaskMode");
@@ -2801,7 +2803,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
if (task == null) {
Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found");
return;
@@ -2941,10 +2944,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
throw new IllegalArgumentException("Expected in-place ActivityOption " +
"with valid animation");
}
- mWindowManager.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false);
- mWindowManager.overridePendingAppTransitionInPlace(activityOptions.getPackageName(),
- activityOptions.getCustomInPlaceResId());
- mWindowManager.executeAppTransition();
+ // Get top display of front most application.
+ final ActivityStack focusedStack = getTopDisplayFocusedStack();
+ if (focusedStack != null) {
+ final DisplayWindowController dwc =
+ focusedStack.getDisplay().getWindowContainerController();
+ dwc.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false);
+ dwc.overridePendingAppTransitionInPlace(activityOptions.getPackageName(),
+ activityOptions.getCustomInPlaceResId());
+ dwc.executeAppTransition();
+ }
}
@Override
@@ -4384,13 +4393,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
return mKeyguardController.isKeyguardLocked();
}
- boolean isNextTransitionForward() {
- int transit = mWindowManager.getPendingAppTransition();
- return transit == TRANSIT_ACTIVITY_OPEN
- || transit == TRANSIT_TASK_OPEN
- || transit == TRANSIT_TASK_TO_FRONT;
- }
-
void dumpLastANRLocked(PrintWriter pw) {
pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
if (mLastANRState == null) {
@@ -5353,65 +5355,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
return intent;
}
- /**
- * This starts home activity on displays that can have system decorations and only if the
- * home activity can have multiple instances.
- */
- boolean startHomeActivityLocked(int userId, String reason, int displayId) {
- if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) {
- // We are running in factory test mode, but unable to find the factory test app, so just
- // sit around displaying the error message and don't try to start anything.
- return false;
- }
-
- final Intent intent = getHomeIntent();
- ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
- if (aInfo != null) {
- intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
- // Don't do this if the home app is currently being instrumented.
- aInfo = new ActivityInfo(aInfo);
- aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
- WindowProcessController app =
- getProcessController(aInfo.processName, aInfo.applicationInfo.uid);
- if (app == null || !app.isInstrumenting()) {
- intent.setFlags(intent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
- final int resolvedUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);
- // For ANR debugging to verify if the user activity is the one that actually
- // launched.
- final String myReason = reason + ":" + userId + ":" + resolvedUserId;
- getActivityStartController().startHomeActivity(intent, aInfo, myReason, displayId);
- }
- } else {
- Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
- }
-
- return true;
- }
-
- private ActivityInfo resolveActivityInfo(Intent intent, int flags, int userId) {
- ActivityInfo ai = null;
- final ComponentName comp = intent.getComponent();
- try {
- if (comp != null) {
- // Factory test.
- ai = AppGlobals.getPackageManager().getActivityInfo(comp, flags, userId);
- } else {
- ResolveInfo info = AppGlobals.getPackageManager().resolveIntent(
- intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
-
- if (info != null) {
- ai = info.activityInfo;
- }
- }
- } catch (RemoteException e) {
- // ignore
- }
-
- return ai;
- }
-
ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) {
if (info == null) return null;
ApplicationInfo newInfo = new ApplicationInfo(info);
@@ -5701,23 +5644,23 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
@Override
- public void notifyKeyguardFlagsChanged(@Nullable Runnable callback) {
+ public void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) {
synchronized (mGlobalLock) {
// We might change the visibilities here, so prepare an empty app transition which
// might be overridden later if we actually change visibilities.
- final boolean wasTransitionSet =
- mWindowManager.getPendingAppTransition() != TRANSIT_NONE;
+ final DisplayWindowController dwc = mStackSupervisor.getActivityDisplay(displayId)
+ .getWindowContainerController();
+ final boolean wasTransitionSet = dwc.getPendingAppTransition() != TRANSIT_NONE;
if (!wasTransitionSet) {
- mWindowManager.prepareAppTransition(TRANSIT_NONE,
- false /* alwaysKeepCurrent */);
+ dwc.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */);
}
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
// If there was a transition set already we don't want to interfere with it as we
// might be starting it too early.
if (!wasTransitionSet) {
- mWindowManager.executeAppTransition();
+ dwc.executeAppTransition();
}
}
if (callback != null) {
@@ -6127,7 +6070,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public boolean startHomeActivity(int userId, String reason) {
synchronized (mGlobalLock) {
- return startHomeActivityLocked(userId, reason, DEFAULT_DISPLAY);
+ return mStackSupervisor.startHomeOnDisplay(userId, reason, DEFAULT_DISPLAY);
+ }
+ }
+
+ @Override
+ public boolean startHomeOnAllDisplays(int userId, String reason) {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.startHomeOnAllDisplays(userId, reason);
}
}
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 28b2a42522eb..9c41c77342e5 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -48,6 +48,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.wm.ActivityTaskManagerInternal.SleepToken;
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.WindowManagerService;
import java.io.PrintWriter;
@@ -160,9 +161,10 @@ class KeyguardController {
mWindowManager.deferSurfaceLayout();
try {
setKeyguardGoingAway(true);
- mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
- false /* alwaysKeepCurrent */, convertTransitFlags(flags),
- false /* forceOverride */);
+ mStackSupervisor.getDefaultDisplay().getWindowContainerController()
+ .prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
+ false /* alwaysKeepCurrent */, convertTransitFlags(flags),
+ false /* forceOverride */);
updateKeyguardSleepToken();
// Some stack visibility might change (e.g. docked stack)
@@ -285,8 +287,10 @@ class KeyguardController {
if (isKeyguardLocked()) {
mWindowManager.deferSurfaceLayout();
try {
- mWindowManager.prepareAppTransition(resolveOccludeTransit(),
- false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */);
+ mStackSupervisor.getDefaultDisplay().getWindowContainerController()
+ .prepareAppTransition(resolveOccludeTransit(),
+ false /* alwaysKeepCurrent */, 0 /* flags */,
+ true /* forceOverride */);
updateKeyguardSleepToken();
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mWindowManager.executeAppTransition();
@@ -310,10 +314,12 @@ class KeyguardController {
// If we are about to unocclude the Keyguard, but we can dismiss it without security,
// we immediately dismiss the Keyguard so the activity gets shown without a flicker.
+ final DisplayWindowController dwc =
+ mStackSupervisor.getDefaultDisplay().getWindowContainerController();
if (mKeyguardShowing && canDismissKeyguard()
- && mWindowManager.getPendingAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE) {
- mWindowManager.prepareAppTransition(mBeforeUnoccludeTransit,
- false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */);
+ && dwc.getPendingAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE) {
+ dwc.prepareAppTransition(mBeforeUnoccludeTransit, false /* alwaysKeepCurrent */,
+ 0 /* flags */, true /* forceOverride */);
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mWindowManager.executeAppTransition();
}
@@ -332,8 +338,10 @@ class KeyguardController {
}
private int resolveOccludeTransit() {
+ final DisplayWindowController dwc =
+ mStackSupervisor.getDefaultDisplay().getWindowContainerController();
if (mBeforeUnoccludeTransit != TRANSIT_UNSET
- && mWindowManager.getPendingAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
+ && dwc.getPendingAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
// TODO(b/113840485): Handle app transition for individual display.
&& isDisplayOccluded(DEFAULT_DISPLAY)) {
@@ -344,7 +352,7 @@ class KeyguardController {
} else if (!isDisplayOccluded(DEFAULT_DISPLAY)) {
// Save transit in case we dismiss/occlude Keyguard shortly after.
- mBeforeUnoccludeTransit = mWindowManager.getPendingAppTransition();
+ mBeforeUnoccludeTransit = dwc.getPendingAppTransition();
return TRANSIT_KEYGUARD_UNOCCLUDE;
} else {
return TRANSIT_KEYGUARD_OCCLUDE;
diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java
index d5f2d34bde01..bcebaaab6aa9 100644
--- a/services/core/java/com/android/server/am/LockTaskController.java
+++ b/services/core/java/com/android/server/am/LockTaskController.java
@@ -580,7 +580,10 @@ public class LockTaskController {
mSupervisor.findTaskToMoveToFront(task, 0, null, reason,
lockTaskModeState != LOCK_TASK_MODE_NONE);
mSupervisor.resumeFocusedStacksTopActivitiesLocked();
- mWindowManager.executeAppTransition();
+ final ActivityStack stack = task.getStack();
+ if (stack != null) {
+ stack.getDisplay().getWindowContainerController().executeAppTransition();
+ }
} else if (lockTaskModeState != LOCK_TASK_MODE_NONE) {
mSupervisor.handleNonResizableTaskIfNeeded(task, WINDOWING_MODE_UNDEFINED,
DEFAULT_DISPLAY, task.getStack(), true /* forceNonResizable */);
diff --git a/services/core/java/com/android/server/am/PersisterQueue.java b/services/core/java/com/android/server/am/PersisterQueue.java
index 60ea0faaffee..0bcc3b5a13f9 100644
--- a/services/core/java/com/android/server/am/PersisterQueue.java
+++ b/services/core/java/com/android/server/am/PersisterQueue.java
@@ -171,6 +171,11 @@ class PersisterQueue {
mListeners.add(listener);
}
+ @VisibleForTesting
+ boolean removeListener(Listener listener) {
+ return mListeners.remove(listener);
+ }
+
private void processNextItem() throws InterruptedException {
// This part is extracted into a method so that the GC can clearly see the end of the
// scope of the variable 'item'. If this part was in the loop in LazyTaskWriterThread, the
diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java
index c5586bbc3e82..41d488babd92 100644
--- a/services/core/java/com/android/server/am/RecentsAnimation.java
+++ b/services/core/java/com/android/server/am/RecentsAnimation.java
@@ -41,6 +41,8 @@ import android.os.RemoteException;
import android.os.Trace;
import android.util.Slog;
import android.view.IRecentsAnimationRunner;
+
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.RecentsAnimationController;
import com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks;
import com.android.server.wm.WindowManagerService;
@@ -85,10 +87,13 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
+ " assistDataReceiver=" + assistDataReceiver);
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "RecentsAnimation#startRecentsActivity");
+ // TODO(multi-display) currently only support recents animation in default display.
+ final DisplayWindowController dwc =
+ mStackSupervisor.getDefaultDisplay().getWindowContainerController();
if (!mWindowManager.canStartRecentsAnimation()) {
notifyAnimationCancelBeforeStart(recentsAnimationRunner);
if (DEBUG) Slog.d(TAG, "Can't start recents animation, nextAppTransition="
- + mWindowManager.getPendingAppTransition());
+ + dwc.getPendingAppTransition());
return;
}
diff --git a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
index 111adecb933f..c15b4acd971d 100644
--- a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java
@@ -135,7 +135,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
}
// STEP 1: Determine the display to launch the activity/task.
- final int displayId = getPreferredLaunchDisplay(options, source, currentParams);
+ final int displayId = getPreferredLaunchDisplay(task, options, source, currentParams);
outParams.mPreferredDisplayId = displayId;
ActivityDisplay display = mSupervisor.getActivityDisplay(displayId);
if (DEBUG) {
@@ -268,8 +268,8 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
return RESULT_CONTINUE;
}
- private int getPreferredLaunchDisplay(@Nullable ActivityOptions options,
- ActivityRecord source, LaunchParams currentParams) {
+ private int getPreferredLaunchDisplay(@Nullable TaskRecord task,
+ @Nullable ActivityOptions options, ActivityRecord source, LaunchParams currentParams) {
int displayId = INVALID_DISPLAY;
final int optionLaunchId = options != null ? options.getLaunchDisplayId() : INVALID_DISPLAY;
if (optionLaunchId != INVALID_DISPLAY) {
@@ -283,6 +283,13 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
displayId = sourceDisplayId;
}
+ ActivityStack stack =
+ (displayId == INVALID_DISPLAY && task != null) ? task.getStack() : null;
+ if (stack != null) {
+ if (DEBUG) appendLog("display-from-task=" + stack.mDisplayId);
+ displayId = stack.mDisplayId;
+ }
+
if (displayId != INVALID_DISPLAY && mSupervisor.getActivityDisplay(displayId) == null) {
displayId = INVALID_DISPLAY;
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5103974dba86..67d27c94f41b 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -4293,7 +4293,7 @@ public class AudioService extends IAudioService.Stub
return false;
}
- NotificationManager.Policy zenPolicy = mNm.getNotificationPolicy();
+ NotificationManager.Policy zenPolicy = mNm.getConsolidatedNotificationPolicy();
final boolean muteAlarms = (zenPolicy.priorityCategories
& NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS) == 0;
final boolean muteMedia = (zenPolicy.priorityCategories
@@ -4301,7 +4301,8 @@ public class AudioService extends IAudioService.Stub
final boolean muteSystem = (zenPolicy.priorityCategories
& NotificationManager.Policy.PRIORITY_CATEGORY_SYSTEM) == 0;
final boolean muteNotificationAndRing = ZenModeConfig
- .areAllPriorityOnlyNotificationZenSoundsMuted(mNm.getNotificationPolicy());
+ .areAllPriorityOnlyNotificationZenSoundsMuted(
+ mNm.getConsolidatedNotificationPolicy());
return muteAlarms && isAlarm(streamType)
|| muteMedia && isMedia(streamType)
|| muteSystem && isSystem(streamType)
@@ -4323,7 +4324,7 @@ public class AudioService extends IAudioService.Stub
private boolean updateZenModeAffectedStreams() {
int zenModeAffectedStreams = 0;
if (mSystemReady && mNm.getZenMode() == Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
- NotificationManager.Policy zenPolicy = mNm.getNotificationPolicy();
+ NotificationManager.Policy zenPolicy = mNm.getConsolidatedNotificationPolicy();
if ((zenPolicy.priorityCategories
& NotificationManager.Policy.PRIORITY_CATEGORY_ALARMS) == 0) {
zenModeAffectedStreams |= 1 << AudioManager.STREAM_ALARM;
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
index 7b8571c131b6..deaa33485170 100644
--- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -23,6 +23,8 @@ import static android.Manifest.permission.NETWORK_STACK;
import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
+import static android.os.Process.INVALID_UID;
+import static android.os.Process.SYSTEM_UID;
import android.annotation.NonNull;
import android.content.BroadcastReceiver;
@@ -64,6 +66,7 @@ public class PermissionMonitor {
private static final boolean DBG = true;
private static final Boolean SYSTEM = Boolean.TRUE;
private static final Boolean NETWORK = Boolean.FALSE;
+ private static final int VERSION_Q = Build.VERSION_CODES.Q;
private final Context mContext;
private final PackageManager mPackageManager;
@@ -87,7 +90,7 @@ public class PermissionMonitor {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
- int appUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ int appUid = intent.getIntExtra(Intent.EXTRA_UID, INVALID_UID);
Uri appData = intent.getData();
String appName = appData != null ? appData.getSchemeSpecificPart() : null;
@@ -127,7 +130,7 @@ public class PermissionMonitor {
}
for (PackageInfo app : apps) {
- int uid = app.applicationInfo != null ? app.applicationInfo.uid : -1;
+ int uid = app.applicationInfo != null ? app.applicationInfo.uid : INVALID_UID;
if (uid < 0) {
continue;
}
@@ -162,6 +165,11 @@ public class PermissionMonitor {
}
@VisibleForTesting
+ int getDeviceFirstSdkInt() {
+ return Build.VERSION.FIRST_SDK_INT;
+ }
+
+ @VisibleForTesting
boolean hasPermission(PackageInfo app, String permission) {
if (app.requestedPermissions != null) {
for (String p : app.requestedPermissions) {
@@ -180,10 +188,17 @@ public class PermissionMonitor {
private boolean hasRestrictedNetworkPermission(PackageInfo app) {
// TODO : remove this check in the future(b/31479477). All apps should just
// request the appropriate permission for their use case since android Q.
- if (app.applicationInfo != null
- && app.applicationInfo.targetSdkVersion < Build.VERSION_CODES.Q
- && isVendorApp(app.applicationInfo)) {
- return true;
+ if (app.applicationInfo != null) {
+ // Backward compatibility for b/114245686, on devices that launched before Q daemons
+ // and apps running as the system UID are exempted from this check.
+ if (app.applicationInfo.uid == SYSTEM_UID && getDeviceFirstSdkInt() < VERSION_Q) {
+ return true;
+ }
+
+ if (app.applicationInfo.targetSdkVersion < VERSION_Q
+ && isVendorApp(app.applicationInfo)) {
+ return true;
+ }
}
return hasPermission(app, CONNECTIVITY_INTERNAL)
|| hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS);
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index e3a1a913bdad..9d5d65d87062 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -136,6 +136,7 @@ import com.android.internal.content.PackageMonitor;
import com.android.internal.inputmethod.IInputContentUriToken;
import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
import com.android.internal.inputmethod.InputMethodDebug;
+import com.android.internal.inputmethod.StartInputFlags;
import com.android.internal.inputmethod.StartInputReason;
import com.android.internal.inputmethod.UnbindReason;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
@@ -1916,8 +1917,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@GuardedBy("mMethodMap")
@NonNull
InputBindResult startInputUncheckedLocked(@NonNull ClientState cs, IInputContext inputContext,
- @MissingMethodFlags int missingMethods, @NonNull EditorInfo attribute, int controlFlags,
- @StartInputReason int startInputReason) {
+ @MissingMethodFlags int missingMethods, @NonNull EditorInfo attribute,
+ @StartInputFlags int startInputFlags, @StartInputReason int startInputReason) {
// If no method is currently selected, do nothing.
if (mCurMethodId == null) {
return InputBindResult.NO_IME;
@@ -1979,7 +1980,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// Fast case: if we are already connected to the input method,
// then just return it.
return attachNewInputLocked(startInputReason,
- (controlFlags&InputMethodManager.CONTROL_START_INITIAL) != 0);
+ (startInputFlags & StartInputFlags.INITIAL_CONNECTION) != 0);
}
if (mHaveConnection) {
if (mCurMethod != null) {
@@ -2794,15 +2795,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public InputBindResult startInputOrWindowGainedFocus(
@StartInputReason int startInputReason, IInputMethodClient client, IBinder windowToken,
- int controlFlags, @SoftInputModeFlags int softInputMode, int windowFlags,
- @Nullable EditorInfo attribute, IInputContext inputContext,
+ @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
+ int windowFlags, @Nullable EditorInfo attribute, IInputContext inputContext,
@MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion) {
if (windowToken == null) {
Slog.e(TAG, "windowToken cannot be null.");
return InputBindResult.NULL;
}
final InputBindResult result = startInputOrWindowGainedFocusInternal(startInputReason,
- client, windowToken, controlFlags, softInputMode, windowFlags, attribute,
+ client, windowToken, startInputFlags, softInputMode, windowFlags, attribute,
inputContext, missingMethods, unverifiedTargetSdkVersion);
if (result == null) {
// This must never happen, but just in case.
@@ -2818,9 +2819,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@NonNull
private InputBindResult startInputOrWindowGainedFocusInternal(
@StartInputReason int startInputReason, IInputMethodClient client,
- @NonNull IBinder windowToken, int controlFlags, @SoftInputModeFlags int softInputMode,
- int windowFlags, EditorInfo attribute, IInputContext inputContext,
- @MissingMethodFlags int missingMethods, int unverifiedTargetSdkVersion) {
+ @NonNull IBinder windowToken, @StartInputFlags int startInputFlags,
+ @SoftInputModeFlags int softInputMode, int windowFlags, EditorInfo attribute,
+ IInputContext inputContext, @MissingMethodFlags int missingMethods,
+ int unverifiedTargetSdkVersion) {
// Needs to check the validity before clearing calling identity
final boolean calledFromValidUser = calledFromValidUser();
InputBindResult res = null;
@@ -2836,7 +2838,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
+ " missingMethods="
+ InputConnectionInspector.getMissingMethodFlagsAsString(missingMethods)
+ " attribute=" + attribute
- + " controlFlags=#" + Integer.toHexString(controlFlags)
+ + " startInputFlags="
+ + InputMethodDebug.startInputFlagsToString(startInputFlags)
+ " softInputMode=" + InputMethodDebug.softInputModeToString(softInputMode)
+ " windowFlags=#" + Integer.toHexString(windowFlags)
+ " unverifiedTargetSdkVersion=" + unverifiedTargetSdkVersion);
@@ -2882,7 +2885,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
if (attribute != null) {
return startInputUncheckedLocked(cs, inputContext, missingMethods,
- attribute, controlFlags, startInputReason);
+ attribute, startInputFlags, startInputReason);
}
return new InputBindResult(
InputBindResult.ResultCode.SUCCESS_REPORT_WINDOW_FOCUS_ONLY,
@@ -2905,7 +2908,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|| mRes.getConfiguration().isLayoutSizeAtLeast(
Configuration.SCREENLAYOUT_SIZE_LARGE);
final boolean isTextEditor =
- (controlFlags&InputMethodManager.CONTROL_WINDOW_IS_TEXT_EDITOR) != 0;
+ (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;
// We want to start input before showing the IME, but after closing
// it. We want to do this after closing it to help the IME disappear
@@ -2943,8 +2946,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// is more room for the target window + IME.
if (DEBUG) Slog.v(TAG, "Unspecified window will show input");
if (attribute != null) {
- res = startInputUncheckedLocked(cs, inputContext,
- missingMethods, attribute, controlFlags, startInputReason);
+ res = startInputUncheckedLocked(cs, inputContext, missingMethods,
+ attribute, startInputFlags, startInputReason);
didStart = true;
}
showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
@@ -2969,10 +2972,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
if (DEBUG) Slog.v(TAG, "Window asks to show input going forward");
if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
- unverifiedTargetSdkVersion, controlFlags)) {
+ unverifiedTargetSdkVersion, startInputFlags)) {
if (attribute != null) {
res = startInputUncheckedLocked(cs, inputContext,
- missingMethods, attribute, controlFlags,
+ missingMethods, attribute, startInputFlags,
startInputReason);
didStart = true;
}
@@ -2987,10 +2990,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
if (DEBUG) Slog.v(TAG, "Window asks to always show input");
if (InputMethodUtils.isSoftInputModeStateVisibleAllowed(
- unverifiedTargetSdkVersion, controlFlags)) {
+ unverifiedTargetSdkVersion, startInputFlags)) {
if (attribute != null) {
res = startInputUncheckedLocked(cs, inputContext, missingMethods,
- attribute, controlFlags, startInputReason);
+ attribute, startInputFlags, startInputReason);
didStart = true;
}
showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
@@ -3005,11 +3008,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
if (!didStart) {
if (attribute != null) {
if (!DebugFlags.FLAG_OPTIMIZE_START_INPUT.value()
- || (controlFlags
- & InputMethodManager.CONTROL_WINDOW_IS_TEXT_EDITOR) != 0) {
+ || (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0) {
res = startInputUncheckedLocked(cs, inputContext, missingMethods,
attribute,
- controlFlags, startInputReason);
+ startInputFlags, startInputReason);
} else {
res = InputBindResult.NO_EDITOR;
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
index e951b27e85c6..154e8b310128 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
@@ -16,9 +16,6 @@
package com.android.server.inputmethod;
-import static android.view.inputmethod.InputMethodManager.CONTROL_WINDOW_IS_TEXT_EDITOR;
-import static android.view.inputmethod.InputMethodManager.CONTROL_WINDOW_VIEW_HAS_FOCUS;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -44,6 +41,7 @@ import android.view.textservice.TextServicesManager;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.inputmethod.StartInputFlags;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1299,15 +1297,15 @@ final class InputMethodUtils {
}
public static boolean isSoftInputModeStateVisibleAllowed(
- int targetSdkVersion, int controlFlags) {
+ int targetSdkVersion, @StartInputFlags int startInputFlags) {
if (targetSdkVersion < Build.VERSION_CODES.P) {
// for compatibility.
return true;
}
- if ((controlFlags & CONTROL_WINDOW_VIEW_HAS_FOCUS) == 0) {
+ if ((startInputFlags & StartInputFlags.VIEW_HAS_FOCUS) == 0) {
return false;
}
- if ((controlFlags & CONTROL_WINDOW_IS_TEXT_EDITOR) == 0) {
+ if ((startInputFlags & StartInputFlags.IS_TEXT_EDITOR) == 0) {
return false;
}
return true;
diff --git a/services/core/java/com/android/server/location/ContextHubClientBroker.java b/services/core/java/com/android/server/location/ContextHubClientBroker.java
index 1d0ab8fc7641..60f70c70b8e0 100644
--- a/services/core/java/com/android/server/location/ContextHubClientBroker.java
+++ b/services/core/java/com/android/server/location/ContextHubClientBroker.java
@@ -16,12 +16,15 @@
package com.android.server.location;
+import android.Manifest;
import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
import android.hardware.contexthub.V1_0.ContextHubMsg;
import android.hardware.contexthub.V1_0.IContexthub;
import android.hardware.contexthub.V1_0.Result;
import android.hardware.location.ContextHubInfo;
+import android.hardware.location.ContextHubManager;
import android.hardware.location.ContextHubTransaction;
import android.hardware.location.IContextHubClient;
import android.hardware.location.IContextHubClientCallback;
@@ -30,7 +33,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
/**
* A class that acts as a broker for the ContextHubClient, which handles messaging and life-cycle
@@ -69,14 +72,15 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
private final short mHostEndPointId;
/*
- * The remote callback interface for this client.
+ * The remote callback interface for this client. This will be set to null whenever the
+ * client connection is closed (either explicitly or via binder death).
*/
- private final IContextHubClientCallback mCallbackInterface;
+ private IContextHubClientCallback mCallbackInterface = null;
/*
- * false if the connection has been closed by the client, true otherwise.
+ * True if the client is still registered with the Context Hub Service, false otherwise.
*/
- private final AtomicBoolean mConnectionOpen = new AtomicBoolean(true);
+ private boolean mRegistered = true;
/*
* Internal interface used to invoke client callbacks.
@@ -85,6 +89,74 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
void accept(IContextHubClientCallback callback) throws RemoteException;
}
+ /*
+ * The PendingIntent registered with this client.
+ */
+ private final PendingIntentRequest mPendingIntentRequest = new PendingIntentRequest();
+
+ /*
+ * Helper class to manage registered PendingIntent requests from the client.
+ */
+ private class PendingIntentRequest {
+ /*
+ * The PendingIntent object to request, null if there is no open request.
+ */
+ private PendingIntent mPendingIntent;
+
+ /*
+ * The ID of the nanoapp the request is for, invalid if there is no open request.
+ */
+ private long mNanoAppId;
+
+ PendingIntentRequest() {}
+
+ PendingIntentRequest(PendingIntent pendingIntent, long nanoAppId) {
+ mPendingIntent = pendingIntent;
+ mNanoAppId = nanoAppId;
+ }
+
+ public long getNanoAppId() {
+ return mNanoAppId;
+ }
+
+ public PendingIntent getPendingIntent() {
+ return mPendingIntent;
+ }
+
+ public boolean hasPendingIntent() {
+ return mPendingIntent != null;
+ }
+
+ public void clear() {
+ mPendingIntent = null;
+ }
+
+ public boolean register(PendingIntent pendingIntent, long nanoAppId) {
+ boolean success = false;
+ if (hasPendingIntent()) {
+ Log.e(TAG, "Failed to register PendingIntent: registered PendingIntent exists");
+ } else {
+ mNanoAppId = nanoAppId;
+ mPendingIntent = pendingIntent;
+ success = true;
+ }
+
+ return success;
+ }
+
+ public boolean unregister(PendingIntent pendingIntent) {
+ boolean success = false;
+ if (!hasPendingIntent() || !mPendingIntent.equals(pendingIntent)) {
+ Log.e(TAG, "Failed to unregister PendingIntent: PendingIntent is not registered");
+ } else {
+ mPendingIntent = null;
+ success = true;
+ }
+
+ return success;
+ }
+ }
+
/* package */ ContextHubClientBroker(
Context context, IContexthub contextHubProxy, ContextHubClientManager clientManager,
ContextHubInfo contextHubInfo, short hostEndPointId,
@@ -102,8 +174,10 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
*
* @throws RemoteException if the client has already died
*/
- /* package */ void attachDeathRecipient() throws RemoteException {
- mCallbackInterface.asBinder().linkToDeath(this, 0 /* flags */);
+ /* package */ synchronized void attachDeathRecipient() throws RemoteException {
+ if (mCallbackInterface != null) {
+ mCallbackInterface.asBinder().linkToDeath(this, 0 /* flags */);
+ }
}
/**
@@ -118,9 +192,13 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
ContextHubServiceUtil.checkPermissions(mContext);
int result;
- if (mConnectionOpen.get()) {
- ContextHubMsg messageToNanoApp = ContextHubServiceUtil.createHidlContextHubMessage(
- mHostEndPointId, message);
+ IContextHubClientCallback callback = null;
+ synchronized (this) {
+ callback = mCallbackInterface;
+ }
+ if (callback != null) {
+ ContextHubMsg messageToNanoApp =
+ ContextHubServiceUtil.createHidlContextHubMessage(mHostEndPointId, message);
int contextHubId = mAttachedContextHubInfo.getId();
try {
@@ -139,24 +217,37 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
}
/**
- * @param intent the intent to register
- * @param nanoAppId the ID of the nanoapp to send events for
+ * @param pendingIntent the intent to register
+ * @param nanoAppId the ID of the nanoapp to send events for
* @return true on success, false otherwise
*/
@Override
- public boolean registerIntent(PendingIntent intent, long nanoAppId) {
- // TODO: Implement this
- return false;
+ public boolean registerIntent(PendingIntent pendingIntent, long nanoAppId) {
+ ContextHubServiceUtil.checkPermissions(mContext);
+
+ boolean success = false;
+ synchronized (this) {
+ if (mCallbackInterface == null) {
+ Log.e(TAG, "Failed to register PendingIntent: client connection is closed");
+ } else {
+ success = mPendingIntentRequest.register(pendingIntent, nanoAppId);
+ }
+ }
+
+ return success;
}
/**
- * @param intent the intent to unregister
+ * @param pendingIntent the intent to unregister
* @return true on success, false otherwise
*/
@Override
- public boolean unregisterIntent(PendingIntent intent) {
- // TODO: Implement this
- return false;
+ public boolean unregisterIntent(PendingIntent pendingIntent) {
+ ContextHubServiceUtil.checkPermissions(mContext);
+
+ synchronized (this) {
+ return mPendingIntentRequest.unregister(pendingIntent);
+ }
}
/**
@@ -164,8 +255,15 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
*/
@Override
public void close() {
- if (mConnectionOpen.getAndSet(false)) {
- mClientManager.unregisterClient(mHostEndPointId);
+ synchronized (this) {
+ if (mCallbackInterface != null) {
+ mCallbackInterface.asBinder().unlinkToDeath(this, 0 /* flags */);
+ mCallbackInterface = null;
+ }
+ if (!mPendingIntentRequest.hasPendingIntent() && mRegistered) {
+ mClientManager.unregisterClient(mHostEndPointId);
+ mRegistered = false;
+ }
}
}
@@ -197,7 +295,12 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
* @param message the message that came from a nanoapp
*/
/* package */ void sendMessageToClient(NanoAppMessage message) {
- invokeCallbackConcurrent(callback -> callback.onMessageFromNanoApp(message));
+ invokeCallback(callback -> callback.onMessageFromNanoApp(message));
+
+ Supplier<Intent> supplier =
+ () -> createIntent(ContextHubManager.EVENT_NANOAPP_MESSAGE, message.getNanoAppId())
+ .putExtra(ContextHubManager.EXTRA_MESSAGE, message);
+ sendPendingIntent(supplier);
}
/**
@@ -206,7 +309,8 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
* @param nanoAppId the ID of the nanoapp that was loaded.
*/
/* package */ void onNanoAppLoaded(long nanoAppId) {
- invokeCallbackConcurrent(callback -> callback.onNanoAppLoaded(nanoAppId));
+ invokeCallback(callback -> callback.onNanoAppLoaded(nanoAppId));
+ sendPendingIntent(() -> createIntent(ContextHubManager.EVENT_NANOAPP_LOADED, nanoAppId));
}
/**
@@ -215,14 +319,16 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
* @param nanoAppId the ID of the nanoapp that was unloaded.
*/
/* package */ void onNanoAppUnloaded(long nanoAppId) {
- invokeCallbackConcurrent(callback -> callback.onNanoAppUnloaded(nanoAppId));
+ invokeCallback(callback -> callback.onNanoAppUnloaded(nanoAppId));
+ sendPendingIntent(() -> createIntent(ContextHubManager.EVENT_NANOAPP_UNLOADED, nanoAppId));
}
/**
* Notifies the client of a hub reset event if the connection is open.
*/
/* package */ void onHubReset() {
- invokeCallbackConcurrent(callback -> callback.onHubReset());
+ invokeCallback(callback -> callback.onHubReset());
+ sendPendingIntent(() -> createIntent(ContextHubManager.EVENT_HUB_RESET));
}
/**
@@ -232,7 +338,12 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
* @param abortCode the nanoapp specific abort code
*/
/* package */ void onNanoAppAborted(long nanoAppId, int abortCode) {
- invokeCallbackConcurrent(callback -> callback.onNanoAppAborted(nanoAppId, abortCode));
+ invokeCallback(callback -> callback.onNanoAppAborted(nanoAppId, abortCode));
+
+ Supplier<Intent> supplier =
+ () -> createIntent(ContextHubManager.EVENT_NANOAPP_ABORTED, nanoAppId)
+ .putExtra(ContextHubManager.EXTRA_NANOAPP_ABORT_CODE, abortCode);
+ sendPendingIntent(supplier);
}
/**
@@ -240,8 +351,8 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
*
* @param consumer the consumer specifying the callback to invoke
*/
- private void invokeCallbackConcurrent(CallbackConsumer consumer) {
- if (mConnectionOpen.get()) {
+ private synchronized void invokeCallback(CallbackConsumer consumer) {
+ if (mCallbackInterface != null) {
try {
consumer.accept(mCallbackInterface);
} catch (RemoteException e) {
@@ -250,4 +361,53 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
}
}
}
+
+ /**
+ * Creates an Intent object containing the ContextHubManager.EXTRA_EVENT_TYPE extra field
+ *
+ * @param eventType the ContextHubManager.Event type describing the event
+ * @return the Intent object
+ */
+ private Intent createIntent(int eventType) {
+ Intent intent = new Intent();
+ intent.putExtra(ContextHubManager.EXTRA_EVENT_TYPE, eventType);
+ intent.putExtra(ContextHubManager.EXTRA_CONTEXT_HUB_INFO, mAttachedContextHubInfo);
+ return intent;
+ }
+
+ /**
+ * Creates an Intent object containing the ContextHubManager.EXTRA_EVENT_TYPE and the
+ * ContextHubManager.EXTRA_NANOAPP_ID extra fields
+ *
+ * @param eventType the ContextHubManager.Event type describing the event
+ * @param nanoAppId the ID of the nanoapp this event is for
+ * @return the Intent object
+ */
+ private Intent createIntent(int eventType, long nanoAppId) {
+ Intent intent = createIntent(eventType);
+ intent.putExtra(ContextHubManager.EXTRA_NANOAPP_ID, nanoAppId);
+ return intent;
+ }
+
+ /**
+ * Sends an intent to any existing PendingIntent
+ *
+ * @param supplier method to create the extra Intent
+ */
+ private synchronized void sendPendingIntent(Supplier<Intent> supplier) {
+ if (mPendingIntentRequest.hasPendingIntent()) {
+ Intent intent = supplier.get();
+ try {
+ mPendingIntentRequest.getPendingIntent().send(
+ mContext, 0 /* code */, intent, null /* onFinished */, null /* Handler */,
+ Manifest.permission.LOCATION_HARDWARE /* requiredPermission */,
+ null /* options */);
+ } catch (PendingIntent.CanceledException e) {
+ // The PendingIntent is no longer valid
+ Log.w(TAG, "PendingIntent has been canceled, unregistering from client"
+ + " (host endpoint ID " + mHostEndPointId + ")");
+ mPendingIntentRequest.clear();
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/location/ContextHubService.java b/services/core/java/com/android/server/location/ContextHubService.java
index 96e9337a7932..e3c2863e7c72 100644
--- a/services/core/java/com/android/server/location/ContextHubService.java
+++ b/services/core/java/com/android/server/location/ContextHubService.java
@@ -415,10 +415,12 @@ public class ContextHubService extends IContextHubService.Stub {
checkPermissions();
ArrayList<Integer> foundInstances = new ArrayList<>();
- for (NanoAppInstanceInfo info : mNanoAppStateManager.getNanoAppInstanceInfoCollection()) {
- if (filter.testMatch(info)) {
- foundInstances.add(info.getHandle());
- }
+ if (filter != null) {
+ mNanoAppStateManager.foreachNanoAppInstanceInfo((info) -> {
+ if (filter.testMatch(info)) {
+ foundInstances.add(info.getHandle());
+ }
+ });
}
int[] retArray = new int[foundInstances.size()];
@@ -767,9 +769,7 @@ public class ContextHubService extends IContextHubService.Stub {
pw.println("");
pw.println("=================== NANOAPPS ====================");
// Dump nanoAppHash
- for (NanoAppInstanceInfo info : mNanoAppStateManager.getNanoAppInstanceInfoCollection()) {
- pw.println(info);
- }
+ mNanoAppStateManager.foreachNanoAppInstanceInfo((info) -> pw.println(info));
// dump eventLog
}
diff --git a/services/core/java/com/android/server/location/NanoAppStateManager.java b/services/core/java/com/android/server/location/NanoAppStateManager.java
index 98696265c209..e26ccc3a7286 100644
--- a/services/core/java/com/android/server/location/NanoAppStateManager.java
+++ b/services/core/java/com/android/server/location/NanoAppStateManager.java
@@ -21,11 +21,11 @@ import android.hardware.contexthub.V1_0.HubAppInfo;
import android.hardware.location.NanoAppInstanceInfo;
import android.util.Log;
-import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.function.Consumer;
/**
* Manages the state of loaded nanoapps at the Context Hubs.
@@ -70,11 +70,15 @@ import java.util.List;
}
/**
- * @return a collection of NanoAppInstanceInfo objects in the cache
+ * Invokes a Consumer operation for each NanoAppInstanceInfo entry in the cache
+ *
+ * @param consumer the Consumer operation to perform
*/
/* package */
- synchronized Collection<NanoAppInstanceInfo> getNanoAppInstanceInfoCollection() {
- return mNanoAppHash.values();
+ synchronized void foreachNanoAppInstanceInfo(Consumer<NanoAppInstanceInfo> consumer) {
+ for (NanoAppInstanceInfo info : mNanoAppHash.values()) {
+ consumer.accept(info);
+ }
}
/**
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 6d3a3b69bcb5..dc3bfbca893c 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -1627,7 +1627,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// fold tethering stats and operations into uid snapshot
final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID);
tetherSnapshot.filter(UID_ALL, ifaces, TAG_ALL);
- NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot);
+ NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot,
+ mUseBpfTrafficStats);
uidSnapshot.combineAllValues(tetherSnapshot);
final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
@@ -1637,7 +1638,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID);
if (vtStats != null) {
vtStats.filter(UID_ALL, ifaces, TAG_ALL);
- NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats);
+ NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats,
+ mUseBpfTrafficStats);
uidSnapshot.combineAllValues(vtStats);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 8d581df2c43e..924b075f30eb 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -3399,6 +3399,16 @@ public class NotificationManagerService extends SystemService {
}
}
+ @Override
+ public Policy getConsolidatedNotificationPolicy() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return mZenModeHelper.getConsolidatedNotificationPolicy();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
/**
* Sets the notification policy. Apps that target API levels below
* {@link android.os.Build.VERSION_CODES#P} cannot change user-designated values to
@@ -4332,20 +4342,19 @@ public class NotificationManagerService extends SystemService {
*
* Has side effects.
*/
- private boolean checkDisqualifyingFeatures(int userId, int uid, int id, String tag,
+ private boolean checkDisqualifyingFeatures(int userId, int callingUid, int id, String tag,
NotificationRecord r, boolean isAutogroup) {
final String pkg = r.sbn.getPackageName();
final boolean isSystemNotification =
- isUidSystemOrPhone(uid) || ("android".equals(pkg));
+ isUidSystemOrPhone(callingUid) || ("android".equals(pkg));
final boolean isNotificationFromListener = mListeners.isListenerPackage(pkg);
// Limit the number of notifications that any given package except the android
// package or a registered listener can enqueue. Prevents DOS attacks and deals with leaks.
if (!isSystemNotification && !isNotificationFromListener) {
synchronized (mNotificationLock) {
- final int callingUid = Binder.getCallingUid();
if (mNotificationsByKey.get(r.sbn.getKey()) == null
- && isCallerInstantApp(callingUid, userId)) {
+ && isCallerInstantApp(pkg, Binder.getCallingUid(), userId)) {
// Ephemeral apps have some special constraints for notifications.
// They are not allowed to create new notifications however they are allowed to
// update notifications created by the system (e.g. a foreground service
@@ -4661,7 +4670,6 @@ public class NotificationManagerService extends SystemService {
}
mRankingHelper.extractSignals(r);
-
// tell the assistant service about the notification
if (mAssistants.isEnabled()) {
mAssistants.onNotificationEnqueued(r);
@@ -5571,7 +5579,7 @@ public class NotificationManagerService extends SystemService {
record.setIntercepted(mZenModeHelper.shouldIntercept(record));
if (record.isIntercepted()) {
record.setSuppressedVisualEffects(
- mZenModeHelper.getNotificationPolicy().suppressedVisualEffects);
+ mZenModeHelper.getConsolidatedNotificationPolicy().suppressedVisualEffects);
} else {
record.setSuppressedVisualEffects(0);
}
@@ -6453,24 +6461,24 @@ public class NotificationManagerService extends SystemService {
}
@VisibleForTesting
- boolean isCallerInstantApp(int callingUid, int userId) {
+ boolean isCallerInstantApp(String pkg, int callingUid, int userId) {
// System is always allowed to act for ephemeral apps.
if (isUidSystemOrPhone(callingUid)) {
return false;
}
+ mAppOps.checkPackage(callingUid, pkg);
+
try {
- final String pkg = mPackageManager.getNameForUid(callingUid);
- mAppOps.checkPackage(callingUid, pkg);
-
- ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg, 0, userId);
- if (ai == null) {
- throw new SecurityException("Unknown package " + pkg);
- }
- return ai.isInstantApp();
+ ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg, 0, userId);
+ if (ai == null) {
+ throw new SecurityException("Unknown package " + pkg);
+ }
+ return ai.isInstantApp();
} catch (RemoteException re) {
- throw new SecurityException("Unknown uid " + callingUid, re);
+ throw new SecurityException("Unknown package " + pkg, re);
}
+
}
private void checkCallerIsSameApp(String pkg) {
diff --git a/services/core/java/com/android/server/notification/ZenLog.java b/services/core/java/com/android/server/notification/ZenLog.java
index b016fafa3d29..c6af7566a8bd 100644
--- a/services/core/java/com/android/server/notification/ZenLog.java
+++ b/services/core/java/com/android/server/notification/ZenLog.java
@@ -63,6 +63,7 @@ public class ZenLog {
private static final int TYPE_SUPPRESSOR_CHANGED = 14;
private static final int TYPE_LISTENER_HINTS_CHANGED = 15;
private static final int TYPE_SET_NOTIFICATION_POLICY = 16;
+ private static final int TYPE_SET_CONSOLIDATED_ZEN_POLICY = 17;
private static int sNext;
private static int sSize;
@@ -103,6 +104,14 @@ public class ZenLog {
append(TYPE_SET_ZEN_MODE, zenModeToString(zenMode) + "," + reason);
}
+ /**
+ * trace setting the consolidated zen policy
+ */
+ public static void traceSetConsolidatedZenPolicy(NotificationManager.Policy policy,
+ String reason) {
+ append(TYPE_SET_CONSOLIDATED_ZEN_POLICY, policy.toString() + "," + reason);
+ }
+
public static void traceUpdateZenMode(int fromMode, int toMode) {
append(TYPE_UPDATE_ZEN_MODE, zenModeToString(fromMode) + " -> " + zenModeToString(toMode));
}
diff --git a/services/core/java/com/android/server/notification/ZenModeExtractor.java b/services/core/java/com/android/server/notification/ZenModeExtractor.java
index a0aa1c32645f..f3da079dc708 100644
--- a/services/core/java/com/android/server/notification/ZenModeExtractor.java
+++ b/services/core/java/com/android/server/notification/ZenModeExtractor.java
@@ -16,9 +16,6 @@
package com.android.server.notification;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
-
import android.content.Context;
import android.util.Log;
import android.util.Slog;
@@ -50,7 +47,7 @@ public class ZenModeExtractor implements NotificationSignalExtractor {
record.setIntercepted(mZenModeHelper.shouldIntercept(record));
if (record.isIntercepted()) {
record.setSuppressedVisualEffects(
- mZenModeHelper.getNotificationPolicy().suppressedVisualEffects);
+ mZenModeHelper.getConsolidatedNotificationPolicy().suppressedVisualEffects);
} else {
record.setSuppressedVisualEffects(0);
}
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index 28cee7ac4dda..6045f6c73b93 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -23,11 +23,9 @@ import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.media.AudioAttributes;
-import android.media.AudioManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings.Global;
-import android.provider.Settings.Secure;
import android.service.notification.ZenModeConfig;
import android.telecom.TelecomManager;
import android.util.ArrayMap;
@@ -38,7 +36,6 @@ import com.android.internal.util.NotificationMessagingUtil;
import java.io.PrintWriter;
import java.util.Date;
-import java.util.Objects;
public class ZenModeFiltering {
private static final String TAG = ZenModeHelper.TAG;
@@ -88,20 +85,21 @@ public class ZenModeFiltering {
* @param timeoutAffinity affinity to return when the timeout specified via
* <code>contactsTimeoutMs</code> is hit
*/
- public static boolean matchesCallFilter(Context context, int zen, ZenModeConfig config,
- UserHandle userHandle, Bundle extras, ValidateNotificationPeople validator,
- int contactsTimeoutMs, float timeoutAffinity) {
+ public static boolean matchesCallFilter(Context context, int zen, NotificationManager.Policy
+ consolidatedPolicy, UserHandle userHandle, Bundle extras,
+ ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) {
if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) return false; // nothing gets through
if (zen == Global.ZEN_MODE_ALARMS) return false; // not an alarm
if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
- if (config.allowRepeatCallers && REPEAT_CALLERS.isRepeat(context, extras)) {
+ if (consolidatedPolicy.allowRepeatCallers()
+ && REPEAT_CALLERS.isRepeat(context, extras)) {
return true;
}
- if (!config.allowCalls) return false; // no other calls get through
+ if (!consolidatedPolicy.allowCalls()) return false; // no other calls get through
if (validator != null) {
final float contactAffinity = validator.getContactAffinity(userHandle, extras,
contactsTimeoutMs, timeoutAffinity);
- return audienceMatches(config.allowCallsFrom, contactAffinity);
+ return audienceMatches(consolidatedPolicy.allowCallsFrom(), contactAffinity);
}
}
return true;
@@ -116,13 +114,17 @@ public class ZenModeFiltering {
REPEAT_CALLERS.recordCall(mContext, extras(record));
}
- public boolean shouldIntercept(int zen, ZenModeConfig config, NotificationRecord record) {
+ /**
+ * Whether to intercept the notification based on the policy
+ */
+ public boolean shouldIntercept(int zen, NotificationManager.Policy policy,
+ NotificationRecord record) {
// Zen mode is ignored for critical notifications.
if (zen == ZEN_MODE_OFF || isCritical(record)) {
return false;
}
// Make an exception to policy for the notification saying that policy has changed
- if (NotificationManager.Policy.areAllVisualEffectsSuppressed(config.suppressedVisualEffects)
+ if (NotificationManager.Policy.areAllVisualEffectsSuppressed(policy.suppressedVisualEffects)
&& "android".equals(record.sbn.getPackageName())
&& SystemMessageProto.SystemMessage.NOTE_ZEN_UPGRADE == record.sbn.getId()) {
ZenLog.traceNotIntercepted(record, "systemDndChangedNotification");
@@ -148,54 +150,54 @@ public class ZenModeFiltering {
}
if (isAlarm(record)) {
- if (!config.allowAlarms) {
+ if (!policy.allowAlarms()) {
ZenLog.traceIntercepted(record, "!allowAlarms");
return true;
}
return false;
}
if (isCall(record)) {
- if (config.allowRepeatCallers
+ if (policy.allowRepeatCallers()
&& REPEAT_CALLERS.isRepeat(mContext, extras(record))) {
ZenLog.traceNotIntercepted(record, "repeatCaller");
return false;
}
- if (!config.allowCalls) {
+ if (!policy.allowCalls()) {
ZenLog.traceIntercepted(record, "!allowCalls");
return true;
}
- return shouldInterceptAudience(config.allowCallsFrom, record);
+ return shouldInterceptAudience(policy.allowCallsFrom(), record);
}
if (isMessage(record)) {
- if (!config.allowMessages) {
+ if (!policy.allowMessages()) {
ZenLog.traceIntercepted(record, "!allowMessages");
return true;
}
- return shouldInterceptAudience(config.allowMessagesFrom, record);
+ return shouldInterceptAudience(policy.allowMessagesFrom(), record);
}
if (isEvent(record)) {
- if (!config.allowEvents) {
+ if (!policy.allowEvents()) {
ZenLog.traceIntercepted(record, "!allowEvents");
return true;
}
return false;
}
if (isReminder(record)) {
- if (!config.allowReminders) {
+ if (!policy.allowReminders()) {
ZenLog.traceIntercepted(record, "!allowReminders");
return true;
}
return false;
}
if (isMedia(record)) {
- if (!config.allowMedia) {
+ if (!policy.allowMedia()) {
ZenLog.traceIntercepted(record, "!allowMedia");
return true;
}
return false;
}
if (isSystem(record)) {
- if (!config.allowSystem) {
+ if (!policy.allowSystem()) {
ZenLog.traceIntercepted(record, "!allowSystem");
return true;
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 44b80c138346..fc9bd37a0f80 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -54,6 +54,7 @@ import android.service.notification.ConditionProviderService;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ZenRule;
import android.service.notification.ZenModeProto;
+import android.service.notification.ZenPolicy;
import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.Log;
@@ -106,6 +107,7 @@ public class ZenModeHelper {
private final ConditionProviders.Config mServiceConfig;
@VisibleForTesting protected int mZenMode;
+ @VisibleForTesting protected NotificationManager.Policy mConsolidatedPolicy;
private int mUser = UserHandle.USER_SYSTEM;
@VisibleForTesting protected ZenModeConfig mConfig;
@VisibleForTesting protected AudioManagerInternal mAudioManager;
@@ -150,8 +152,8 @@ public class ZenModeHelper {
public boolean matchesCallFilter(UserHandle userHandle, Bundle extras,
ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) {
synchronized (mConfig) {
- return ZenModeFiltering.matchesCallFilter(mContext, mZenMode, mConfig, userHandle,
- extras, validator, contactsTimeoutMs, timeoutAffinity);
+ return ZenModeFiltering.matchesCallFilter(mContext, mZenMode, mConsolidatedPolicy,
+ userHandle, extras, validator, contactsTimeoutMs, timeoutAffinity);
}
}
@@ -165,7 +167,7 @@ public class ZenModeHelper {
public boolean shouldIntercept(NotificationRecord record) {
synchronized (mConfig) {
- return mFiltering.shouldIntercept(mZenMode, mConfig, record);
+ return mFiltering.shouldIntercept(mZenMode, mConsolidatedPolicy, record);
}
}
@@ -479,6 +481,9 @@ public class ZenModeHelper {
rule.condition = null;
rule.conditionId = automaticZenRule.getConditionId();
rule.enabled = automaticZenRule.isEnabled();
+ if (automaticZenRule.getZenPolicy() != null) {
+ rule.zenPolicy = automaticZenRule.getZenPolicy();
+ }
rule.zenMode = NotificationManager.zenModeFromInterruptionFilter(
automaticZenRule.getInterruptionFilter(), Global.ZEN_MODE_OFF);
}
@@ -549,6 +554,7 @@ public class ZenModeHelper {
public void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("mZenMode=");
pw.println(Global.zenModeToString(mZenMode));
+ pw.print("mConsolidatedPolicy=" + mConsolidatedPolicy.toString());
final int N = mConfigs.size();
for (int i = 0; i < N; i++) {
dump(pw, prefix, "mConfigs[u=" + mConfigs.keyAt(i) + "]", mConfigs.valueAt(i));
@@ -713,6 +719,16 @@ public class ZenModeHelper {
}
}
+ /**
+ * @return a copy of the zen mode consolidated policy
+ */
+ public Policy getConsolidatedNotificationPolicy() {
+ if (mConsolidatedPolicy == null) {
+ return null;
+ }
+ return mConsolidatedPolicy.copy();
+ }
+
public boolean setConfigLocked(ZenModeConfig config, ComponentName triggeringComponent,
String reason) {
return setConfigLocked(config, reason, triggeringComponent, true /*setRingerMode*/);
@@ -747,6 +763,7 @@ public class ZenModeHelper {
getNotificationPolicy(config));
if (!config.equals(mConfig)) {
dispatchOnConfigChanged();
+ updateConsolidatedPolicy(reason);
}
if (policyChanged) {
dispatchOnPolicyChanged();
@@ -794,13 +811,18 @@ public class ZenModeHelper {
@VisibleForTesting
protected void evaluateZenMode(String reason, boolean setRingerMode) {
if (DEBUG) Log.d(TAG, "evaluateZenMode");
+ if (mConfig == null) return;
+ final int policyHashBefore = mConsolidatedPolicy == null ? 0
+ : mConsolidatedPolicy.hashCode();
final int zenBefore = mZenMode;
final int zen = computeZenMode();
ZenLog.traceSetZenMode(zen, reason);
mZenMode = zen;
setZenModeSetting(mZenMode);
+ updateConsolidatedPolicy(reason);
updateRingerModeAffectedStreams();
- if (setRingerMode && zen != zenBefore) {
+ if (setRingerMode && (zen != zenBefore || (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
+ && policyHashBefore != mConsolidatedPolicy.hashCode()))) {
applyZenToRingerMode();
}
applyRestrictions();
@@ -815,9 +837,7 @@ public class ZenModeHelper {
}
}
-
private int computeZenMode() {
- // TODO: use mConfig.zenPolicy
if (mConfig == null) return Global.ZEN_MODE_OFF;
synchronized (mConfig) {
if (mConfig.manualRule != null) return mConfig.manualRule.zenMode;
@@ -839,6 +859,24 @@ public class ZenModeHelper {
}
}
+ private void updateConsolidatedPolicy(String reason) {
+ if (mConfig == null) return;
+ synchronized (mConfig) {
+ ZenPolicy policy = new ZenPolicy();
+ for (ZenRule automaticRule : mConfig.automaticRules.values()) {
+ if (automaticRule.isAutomaticActive()) {
+ policy.apply(automaticRule.zenPolicy);
+ }
+ }
+ Policy newPolicy = mConfig.toNotificationPolicy(policy);
+ if (!Objects.equals(mConsolidatedPolicy, newPolicy)) {
+ mConsolidatedPolicy = newPolicy;
+ dispatchOnConsolidatedPolicyChanged();
+ ZenLog.traceSetConsolidatedZenPolicy(mConsolidatedPolicy, reason);
+ }
+ }
+ }
+
private void updateDefaultAutomaticRuleNames() {
for (ZenRule rule : mDefaultConfig.automaticRules.values()) {
if (ZenModeConfig.EVENTS_DEFAULT_RULE_ID.equals(rule.id)) {
@@ -856,23 +894,28 @@ public class ZenModeHelper {
final boolean zenPriorityOnly = mZenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
final boolean zenSilence = mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS;
final boolean zenAlarmsOnly = mZenMode == Global.ZEN_MODE_ALARMS;
+ final boolean allowCalls = mConsolidatedPolicy.allowCalls();
+ final boolean allowRepeatCallers = mConsolidatedPolicy.allowRepeatCallers();
+ final boolean allowSystem = mConsolidatedPolicy.allowSystem();
+ final boolean allowMedia = mConsolidatedPolicy.allowMedia();
+ final boolean allowAlarms = mConsolidatedPolicy.allowAlarms();
// notification restrictions
final boolean muteNotifications =
(mSuppressedEffects & SUPPRESSED_EFFECT_NOTIFICATIONS) != 0;
// call restrictions
final boolean muteCalls = zenAlarmsOnly
- || (zenPriorityOnly && !mConfig.allowCalls && !mConfig.allowRepeatCallers)
+ || (zenPriorityOnly && !allowCalls && !allowRepeatCallers)
|| (mSuppressedEffects & SUPPRESSED_EFFECT_CALLS) != 0;
// alarm restrictions
- final boolean muteAlarms = zenPriorityOnly && !mConfig.allowAlarms;
+ final boolean muteAlarms = zenPriorityOnly && !allowAlarms;
// media restrictions
- final boolean muteMedia = zenPriorityOnly && !mConfig.allowMedia;
+ final boolean muteMedia = zenPriorityOnly && !allowMedia;
// system restrictions
- final boolean muteSystem = zenAlarmsOnly || (zenPriorityOnly && !mConfig.allowSystem);
+ final boolean muteSystem = zenAlarmsOnly || (zenPriorityOnly && !allowSystem);
// total silence restrictions
- final boolean muteEverything = zenSilence
- || (zenPriorityOnly && ZenModeConfig.areAllZenBehaviorSoundsMuted(mConfig));
+ final boolean muteEverything = zenSilence || (zenPriorityOnly
+ && ZenModeConfig.areAllZenBehaviorSoundsMuted(mConsolidatedPolicy));
for (int usage : AudioAttributes.SDK_USAGES) {
final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage);
@@ -968,6 +1011,12 @@ public class ZenModeHelper {
}
}
+ private void dispatchOnConsolidatedPolicyChanged() {
+ for (Callback callback : mCallbacks) {
+ callback.onConsolidatedPolicyChanged();
+ }
+ }
+
private void dispatchOnZenModeChanged() {
for (Callback callback : mCallbacks) {
callback.onZenModeChanged();
@@ -1188,7 +1237,7 @@ public class ZenModeHelper {
int content = R.string.zen_upgrade_notification_content;
int drawable = R.drawable.ic_zen_24dp;
if (NotificationManager.Policy.areAllVisualEffectsSuppressed(
- getNotificationPolicy().suppressedVisualEffects)) {
+ getConsolidatedNotificationPolicy().suppressedVisualEffects)) {
title = R.string.zen_upgrade_notification_visd_title;
content = R.string.zen_upgrade_notification_visd_content;
drawable = R.drawable.ic_dnd_block_notifications;
@@ -1362,6 +1411,6 @@ public class ZenModeHelper {
void onConfigChanged() {}
void onZenModeChanged() {}
void onPolicyChanged() {}
+ void onConsolidatedPolicyChanged() {}
}
-
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b988c6a1c739..9210d46c1476 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4288,8 +4288,12 @@ public class PackageManagerService extends IPackageManager.Stub
int filterCallingUid, int userId) {
if (!sUserManager.exists(userId)) return null;
flags = updateFlagsForApplication(flags, userId, packageName);
- mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */, "get application info");
+
+ if (!isRecentsAccessingChildProfiles(Binder.getCallingUid(), userId)) {
+ mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ false /* requireFullPermission */, false /* checkShell */,
+ "get application info");
+ }
// writer
synchronized (mPackages) {
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 45cb477cb4f3..aae7b95f2dd4 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -344,40 +344,43 @@ public final class DefaultPermissionGrantPolicy {
@SafeVarargs
private final void grantIgnoringSystemPackage(String packageName, int userId,
Set<String>... permissionGroups) {
- grantPermissionsToSystemPackage(packageName, userId, false, true, permissionGroups);
+ grantPermissionsToPackage(
+ packageName, userId, true /* ignoreSystemPackage */, permissionGroups);
}
@SafeVarargs
private final void grantSystemFixedPermissionsToSystemPackage(String packageName, int userId,
Set<String>... permissionGroups) {
- grantPermissionsToSystemPackage(packageName, userId, true, false, permissionGroups);
+ grantPermissionsToSystemPackage(
+ packageName, userId, true /* systemFixed */, permissionGroups);
}
@SafeVarargs
private final void grantPermissionsToSystemPackage(
String packageName, int userId, Set<String>... permissionGroups) {
- grantPermissionsToSystemPackage(packageName, userId, false, false, permissionGroups);
+ grantPermissionsToSystemPackage(
+ packageName, userId, false /* systemFixed */, permissionGroups);
}
@SafeVarargs
private final void grantPermissionsToSystemPackage(String packageName, int userId,
- boolean systemFixed, boolean ignoreSystemPackage, Set<String>... permissionGroups) {
- if (!ignoreSystemPackage && !isSystemPackage(packageName)) {
+ boolean systemFixed, Set<String>... permissionGroups) {
+ if (!isSystemPackage(packageName)) {
return;
}
- grantRuntimePermissionsToPackage(getSystemPackageInfo(packageName),
- userId, systemFixed, ignoreSystemPackage, permissionGroups);
+ grantPermissionsToPackage(getSystemPackageInfo(packageName),
+ userId, systemFixed, false /* ignoreSystemPackage */, permissionGroups);
}
@SafeVarargs
- private final void grantRuntimePermissionsToPackage(String packageName, int userId,
- boolean systemFixed, boolean ignoreSystemPackage, Set<String>... permissionGroups) {
- grantRuntimePermissionsToPackage(getPackageInfo(packageName),
- userId, systemFixed, ignoreSystemPackage, permissionGroups);
+ private final void grantPermissionsToPackage(String packageName, int userId,
+ boolean ignoreSystemPackage, Set<String>... permissionGroups) {
+ grantPermissionsToPackage(getPackageInfo(packageName),
+ userId, false /* systemFixed */, ignoreSystemPackage, permissionGroups);
}
@SafeVarargs
- private final void grantRuntimePermissionsToPackage(PackageInfo packageName, int userId,
+ private final void grantPermissionsToPackage(PackageInfo packageName, int userId,
boolean systemFixed, boolean ignoreSystemPackage, Set<String>... permissionGroups) {
if (packageName == null) return;
if (doesPackageSupportRuntimePermissions(packageName)) {
@@ -589,9 +592,8 @@ public final class DefaultPermissionGrantPolicy {
browserPackage = null;
}
}
- grantRuntimePermissionsToPackage(browserPackage, userId,
- false /* systemFixed */, false /* ignoreSystemPackage */,
- LOCATION_PERMISSIONS);
+ grantPermissionsToPackage(browserPackage, userId,
+ false /* ignoreSystemPackage */, LOCATION_PERMISSIONS);
// Voice interaction
if (voiceInteractPackageNames != null) {
@@ -786,7 +788,7 @@ public final class DefaultPermissionGrantPolicy {
return;
}
Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
- grantRuntimePermissionsToPackage(packageName, userId, false, false,
+ grantPermissionsToPackage(packageName, userId, false /* ignoreSystemPackage */,
PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS);
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 371ac4fefc9c..1dae396af76d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -7891,8 +7891,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// requires freezing various Surface states and won't work well
// with animations, so we disable it in the animation case for now.
if (w != null && !w.isAnimatingLw() &&
- ((w.getAttrs().rotationAnimation == ROTATION_ANIMATION_JUMPCUT) ||
- (w.getAttrs().rotationAnimation == ROTATION_ANIMATION_SEAMLESS))) {
+ w.getAttrs().rotationAnimation == ROTATION_ANIMATION_SEAMLESS) {
return true;
}
return false;
diff --git a/services/core/java/com/android/server/role/RemoteRoleControllerService.java b/services/core/java/com/android/server/role/RemoteRoleControllerService.java
index c737e8bb8710..b670291ba94b 100644
--- a/services/core/java/com/android/server/role/RemoteRoleControllerService.java
+++ b/services/core/java/com/android/server/role/RemoteRoleControllerService.java
@@ -106,6 +106,9 @@ public class RemoteRoleControllerService {
private final Queue<Call> mPendingCalls = new ArrayDeque<>();
@NonNull
+ private final Handler mMainHandler = Handler.getMain();
+
+ @NonNull
private final Runnable mUnbindRunnable = this::unbind;
Connection(@UserIdInt int userId, @NonNull Context context) {
@@ -142,7 +145,7 @@ public class RemoteRoleControllerService {
}
public void enqueueCall(@NonNull Call call) {
- Handler.getMain().post(PooledLambda.obtainRunnable(this::executeCall, call));
+ mMainHandler.post(PooledLambda.obtainRunnable(this::executeCall, call));
}
@MainThread
@@ -158,7 +161,7 @@ public class RemoteRoleControllerService {
@MainThread
private void ensureBound() {
- Handler.getMain().removeCallbacks(mUnbindRunnable);
+ mMainHandler.removeCallbacks(mUnbindRunnable);
if (!mBound) {
Intent intent = new Intent(RoleControllerService.SERVICE_INTERFACE);
intent.setPackage(mContext.getPackageManager()
@@ -169,9 +172,8 @@ public class RemoteRoleControllerService {
}
private void scheduleUnbind() {
- Handler mainHandler = Handler.getMain();
- mainHandler.removeCallbacks(mUnbindRunnable);
- mainHandler.postDelayed(mUnbindRunnable, UNBIND_DELAY_MILLIS);
+ mMainHandler.removeCallbacks(mUnbindRunnable);
+ mMainHandler.postDelayed(mUnbindRunnable, UNBIND_DELAY_MILLIS);
}
@MainThread
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 5c9cef507b67..b7d2ce29563e 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -249,9 +249,42 @@ public class RoleManagerService extends SystemService {
userId = handleIncomingUser(userId, "clearRoleHoldersAsUser");
getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
"clearRoleHoldersAsUser");
+
getControllerService(userId).onClearRoleHolders(roleName, callback);
}
+ @Override
+ public boolean addRoleHolderFromController(@NonNull String roleName,
+ @NonNull String packageName) {
+ Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+ getContext().enforceCallingOrSelfPermission(
+ RoleManager.PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER,
+ "addRoleHolderFromController");
+
+ int userId = UserHandle.getCallingUserId();
+ synchronized (mLock) {
+ RoleUserState userState = getUserStateLocked(userId);
+ return userState.addRoleHolderLocked(roleName, packageName);
+ }
+ }
+
+ @Override
+ public boolean removeRoleHolderFromController(@NonNull String roleName,
+ @NonNull String packageName) {
+ Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+ getContext().enforceCallingOrSelfPermission(
+ RoleManager.PERMISSION_MANAGE_ROLE_HOLDERS_FROM_CONTROLLER,
+ "removeRoleHolderFromController");
+
+ int userId = UserHandle.getCallingUserId();
+ synchronized (mLock) {
+ RoleUserState userState = getUserStateLocked(userId);
+ return userState.removeRoleHolderLocked(roleName, packageName);
+ }
+ }
+
@CheckResult
private int handleIncomingUser(@UserIdInt int userId, @NonNull String name) {
return ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java
index bd5449151beb..caa7c2845ccb 100644
--- a/services/core/java/com/android/server/role/RoleUserState.java
+++ b/services/core/java/com/android/server/role/RoleUserState.java
@@ -174,25 +174,6 @@ public class RoleUserState {
}
/**
- * Remove all holders of a role.
- *
- * @param roleName the name of the role to remove all its holders
- *
- * @return {@code false} only if the set of role holders is null, which should not happen and
- * indicates an issue.
- */
- @GuardedBy("RoleManagerService.mLock")
- public boolean clearRoleHolderLocked(@NonNull String roleName) {
- throwIfDestroyedLocked();
- ArraySet<String> roleHolders = mRoles.get(roleName);
- if (roleHolders == null) {
- return false;
- }
- roleHolders.clear();
- return true;
- }
-
- /**
* Schedule writing the state to file.
*/
@GuardedBy("RoleManagerService.mLock")
diff --git a/services/core/java/com/android/server/security/VerityUtils.java b/services/core/java/com/android/server/security/VerityUtils.java
index 8070f3add5c6..514dfed75843 100644
--- a/services/core/java/com/android/server/security/VerityUtils.java
+++ b/services/core/java/com/android/server/security/VerityUtils.java
@@ -138,8 +138,8 @@ abstract public class VerityUtils {
* <p>It is worthy to note that {@code trackedBufferFactory} generates a "tracked" {@code
* ByteBuffer}. The data will be used outside this method via the factory itself.
*
- * @return fs-verity measurement of {@code filePath}, which is a SHA-256 of fs-verity descriptor
- * and authenticated extensions.
+ * @return fs-verity signed data (struct fsverity_digest_disk) of {@code filePath}, which
+ * includes SHA-256 of fs-verity descriptor and authenticated extensions.
*/
private static byte[] generateFsverityMetadata(String filePath, String signaturePath,
@NonNull TrackedShmBufferFactory trackedBufferFactory)
@@ -151,8 +151,10 @@ abstract public class VerityUtils {
ByteBuffer buffer = result.verityData;
buffer.position(result.merkleTreeSize);
- return generateFsverityDescriptorAndMeasurement(file, result.rootHash, signaturePath,
- buffer);
+
+ final byte[] measurement = generateFsverityDescriptorAndMeasurement(file,
+ result.rootHash, signaturePath, buffer);
+ return constructFsveritySignedDataNative(measurement);
}
}
@@ -211,6 +213,7 @@ abstract public class VerityUtils {
return md.digest();
}
+ private static native byte[] constructFsveritySignedDataNative(@NonNull byte[] measurement);
private static native byte[] constructFsverityDescriptorNative(long fileSize);
private static native byte[] constructFsverityExtensionNative(short extensionId,
int extensionDataSize);
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index 7b35b9145f9a..4d3fc1a8a51d 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -1004,6 +1004,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
e.writeLong(processMemoryState.cacheInBytes);
e.writeLong(processMemoryState.swapInBytes);
e.writeLong(processMemoryState.rssHighWatermarkInBytes);
+ e.writeLong(processMemoryState.startTimeNanos);
pulledData.add(e);
}
}
@@ -1052,6 +1053,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
e.writeLong(callStat.maxRequestSizeBytes);
e.writeLong(callStat.recordedCallCount);
e.writeInt(callStat.screenInteractive ? 1 : 0);
+ e.writeInt(callStat.callingUid);
pulledData.add(e);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index b011da60b210..9a38f6899fd2 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -33,8 +33,8 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.service.voice.IVoiceInteractionSession;
import android.util.SparseIntArray;
-
import android.util.proto.ProtoOutputStream;
+
import com.android.internal.app.IVoiceInteractor;
import com.android.server.am.ActivityServiceConnectionsHolder;
import com.android.server.am.PendingIntentRecord;
@@ -48,7 +48,6 @@ import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Set;
-import java.util.function.Predicate;
/**
* Activity Task manager local system service interface.
@@ -229,8 +228,9 @@ public abstract class ActivityTaskManagerInternal {
* @param callback Callback to run after activity visibilities have been reevaluated. This can
* be used from window manager so that when the callback is called, it's
* guaranteed that all apps have their visibility updated accordingly.
+ * @param displayId The id of the display where the keyguard flags changed.
*/
- public abstract void notifyKeyguardFlagsChanged(@Nullable Runnable callback);
+ public abstract void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId);
/**
* Called when the trusted state of Keyguard has changed.
@@ -348,6 +348,8 @@ public abstract class ActivityTaskManagerInternal {
/** @return The intent used to launch the home activity. */
public abstract Intent getHomeIntent();
public abstract boolean startHomeActivity(int userId, String reason);
+ /** Start home activities on all displays that support system decorations. */
+ public abstract boolean startHomeOnAllDisplays(int userId, String reason);
/** @return true if the given process is the factory test process. */
public abstract boolean isFactoryTestProcess(WindowProcessController wpc);
public abstract void updateTopComponentForFactoryTest();
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index a9d09781d223..10a1be52b71e 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -166,6 +166,7 @@ public class AppTransition implements Dump {
private final Context mContext;
private final WindowManagerService mService;
+ private final DisplayContent mDisplayContent;
private @TransitionType int mNextAppTransition = TRANSIT_UNSET;
private @TransitionFlags int mNextAppTransitionFlags = 0;
@@ -257,10 +258,11 @@ public class AppTransition implements Dump {
final Handler mHandler;
final Runnable mHandleAppTransitionTimeoutRunnable = () -> handleAppTransitionTimeout();
- AppTransition(Context context, WindowManagerService service) {
+ AppTransition(Context context, WindowManagerService service, DisplayContent displayContent) {
mContext = context;
mService = service;
mHandler = new Handler(service.mH.getLooper());
+ mDisplayContent = displayContent;
mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
com.android.internal.R.interpolator.linear_out_slow_in);
mFastOutLinearInInterpolator = AnimationUtils.loadInterpolator(context,
@@ -426,7 +428,7 @@ public class AppTransition implements Dump {
? topOpeningAnim.getStatusBarTransitionsStartTime()
: SystemClock.uptimeMillis(),
AnimationAdapter.STATUS_BAR_TRANSITION_DURATION);
- mService.getDefaultDisplayContentLocked().getDockedDividerController()
+ mDisplayContent.getDockedDividerController()
.notifyAppTransitionStarting(openingApps, transit);
if (mRemoteAnimationController != null) {
@@ -2142,7 +2144,8 @@ public class AppTransition implements Dump {
+ " transit=" + appTransitionToString(transit)
+ " " + this
+ " alwaysKeepCurrent=" + alwaysKeepCurrent
- + " Callers=" + Debug.getCallers(3));
+ + " displayId=" + mDisplayContent.getDisplayId()
+ + " Callers=" + Debug.getCallers(5));
final boolean allowSetCrashing = !isKeyguardTransit(mNextAppTransition)
&& transit == TRANSIT_CRASHING_ACTIVITY_CLOSE;
if (forceOverride || isKeyguardTransit(transit) || !isTransitionSet()
@@ -2218,14 +2221,18 @@ public class AppTransition implements Dump {
private void handleAppTransitionTimeout() {
synchronized (mService.mWindowMap) {
- if (isTransitionSet() || !mService.mOpeningApps.isEmpty()
- || !mService.mClosingApps.isEmpty()) {
+ final DisplayContent dc = mDisplayContent;
+ if (dc == null) {
+ return;
+ }
+ if (isTransitionSet() || !dc.mOpeningApps.isEmpty() || !dc.mClosingApps.isEmpty()) {
if (DEBUG_APP_TRANSITIONS) {
Slog.v(TAG_WM, "*** APP TRANSITION TIMEOUT."
+ + " displayId=" + dc.getDisplayId()
+ " isTransitionSet()="
- + mService.mAppTransition.isTransitionSet()
- + " mOpeningApps.size()=" + mService.mOpeningApps.size()
- + " mClosingApps.size()=" + mService.mClosingApps.size());
+ + dc.mAppTransition.isTransitionSet()
+ + " mOpeningApps.size()=" + dc.mOpeningApps.size()
+ + " mClosingApps.size()=" + dc.mClosingApps.size());
}
setTimeout();
mService.mWindowPlacerLocked.performSurfacePlacement();
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
new file mode 100644
index 000000000000..94a47dd2aa60
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
+import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
+import static android.view.WindowManager.TRANSIT_NONE;
+import static android.view.WindowManager.TRANSIT_TASK_CLOSE;
+import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
+import static android.view.WindowManager.TRANSIT_TASK_OPEN;
+import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
+import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE;
+import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE;
+import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN;
+import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN;
+
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
+import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
+import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+import static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
+
+import android.app.WindowConfiguration;
+import android.os.Trace;
+import android.util.ArraySet;
+import android.util.Slog;
+import android.util.SparseIntArray;
+import android.view.Display;
+import android.view.RemoteAnimationAdapter;
+import android.view.RemoteAnimationDefinition;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
+import android.view.animation.Animation;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.function.Predicate;
+
+
+/**
+ * Checks for app transition readiness, resolves animation attributes and performs visibility
+ * change for apps that animate as part of an app transition.
+ */
+public class AppTransitionController {
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "AppTransitionController" : TAG_WM;
+ private final WindowManagerService mService;
+ private final DisplayContent mDisplayContent;
+ private final WallpaperController mWallpaperControllerLocked;
+
+ private final SparseIntArray mTempTransitionReasons = new SparseIntArray();
+
+ AppTransitionController(WindowManagerService service, DisplayContent displayContent) {
+ mService = service;
+ mDisplayContent = displayContent;
+ mWallpaperControllerLocked = new WallpaperController(mService);
+ }
+
+ /**
+ * Handle application transition for given display.
+ */
+ void handleAppTransitionReady() {
+ final int appsCount = mDisplayContent.mOpeningApps.size();
+ if (!transitionGoodToGo(appsCount, mTempTransitionReasons)) {
+ return;
+ }
+ Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
+
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
+ int transit = mDisplayContent.mAppTransition.getAppTransition();
+ if (mDisplayContent.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) {
+ transit = WindowManager.TRANSIT_UNSET;
+ }
+ mDisplayContent.mSkipAppTransitionAnimation = false;
+ mDisplayContent.mNoAnimationNotifyOnTransitionFinished.clear();
+
+ mDisplayContent.mAppTransition.removeAppTransitionTimeoutCallbacks();
+
+ mService.mRoot.mWallpaperMayChange = false;
+
+ int i;
+ for (i = 0; i < appsCount; i++) {
+ final AppWindowToken wtoken = mDisplayContent.mOpeningApps.valueAt(i);
+ // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
+ // window is removed, or window relayout to invisible. This also affects window
+ // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
+ // transition selection depends on wallpaper target visibility.
+ wtoken.clearAnimatingFlags();
+ }
+
+ // Adjust wallpaper before we pull the lower/upper target, since pending changes
+ // (like the clearAnimatingFlags() above) might affect wallpaper target result.
+ // Or, the opening app window should be a wallpaper target.
+ mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(mDisplayContent,
+ mDisplayContent.mOpeningApps);
+
+ // Determine if closing and opening app token sets are wallpaper targets, in which case
+ // special animations are needed.
+ final boolean hasWallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget() != null;
+ final boolean openingAppHasWallpaper = canBeWallpaperTarget(mDisplayContent.mOpeningApps)
+ && hasWallpaperTarget;
+ final boolean closingAppHasWallpaper = canBeWallpaperTarget(mDisplayContent.mClosingApps)
+ && hasWallpaperTarget;
+
+ transit = maybeUpdateTransitToTranslucentAnim(transit);
+ transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
+ closingAppHasWallpaper);
+
+ // Find the layout params of the top-most application window in the tokens, which is
+ // what will control the animation theme. If all closing windows are obscured, then there is
+ // no need to do an animation. This is the case, for example, when this transition is being
+ // done behind a dream window.
+ final ArraySet<Integer> activityTypes = collectActivityTypes(mDisplayContent.mOpeningApps,
+ mDisplayContent.mClosingApps);
+ final boolean allowAnimations = mService.mPolicy.allowAppAnimationsLw();
+ final AppWindowToken animLpToken = allowAnimations
+ ? findAnimLayoutParamsToken(transit, activityTypes)
+ : null;
+ final AppWindowToken topOpeningApp = allowAnimations
+ ? getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */)
+ : null;
+ final AppWindowToken topClosingApp = allowAnimations
+ ? getTopApp(mDisplayContent.mClosingApps, false /* ignoreHidden */)
+ : null;
+ final WindowManager.LayoutParams animLp = getAnimLp(animLpToken);
+ overrideWithRemoteAnimationIfSet(animLpToken, transit, activityTypes);
+
+ final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mOpeningApps)
+ || containsVoiceInteraction(mDisplayContent.mOpeningApps);
+
+ final int layoutRedo;
+ mService.mSurfaceAnimationRunner.deferStartingAnimations();
+ try {
+ processApplicationsAnimatingInPlace(transit);
+
+ handleClosingApps(transit, animLp, voiceInteraction);
+ handleOpeningApps(transit, animLp, voiceInteraction);
+
+ mDisplayContent.mAppTransition.setLastAppTransition(transit, topOpeningApp,
+ topClosingApp);
+
+ final int flags = mDisplayContent.mAppTransition.getTransitFlags();
+ layoutRedo = mDisplayContent.mAppTransition.goodToGo(transit, topOpeningApp,
+ topClosingApp, mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps);
+ handleNonAppWindowsInTransition(transit, flags);
+ mDisplayContent.mAppTransition.postAnimationCallback();
+ mDisplayContent.mAppTransition.clear();
+ } finally {
+ mService.mSurfaceAnimationRunner.continueStartingAnimations();
+ }
+
+ mService.mTaskSnapshotController.onTransitionStarting(mDisplayContent);
+
+ mDisplayContent.mOpeningApps.clear();
+ mDisplayContent.mClosingApps.clear();
+ mDisplayContent.mUnknownAppVisibilityController.clear();
+
+ // This has changed the visibility of windows, so perform
+ // a new layout to get them all up-to-date.
+ mDisplayContent.setLayoutNeeded();
+
+ mDisplayContent.computeImeTarget(true /* updateImeTarget */);
+
+ mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING,
+ mTempTransitionReasons.clone()).sendToTarget();
+
+ Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
+
+ mDisplayContent.pendingLayoutChanges |=
+ layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
+ }
+
+ private static WindowManager.LayoutParams getAnimLp(AppWindowToken wtoken) {
+ final WindowState mainWindow = wtoken != null ? wtoken.findMainWindow() : null;
+ return mainWindow != null ? mainWindow.mAttrs : null;
+ }
+
+ /**
+ * Overrides the pending transition with the remote animation defined for the transition in the
+ * set of defined remote animations in the app window token.
+ */
+ private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit,
+ ArraySet<Integer> activityTypes) {
+ if (transit == TRANSIT_CRASHING_ACTIVITY_CLOSE) {
+ // The crash transition has higher priority than any involved remote animations.
+ return;
+ }
+ if (animLpToken == null) {
+ return;
+ }
+ final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition();
+ if (definition == null) {
+ return;
+ }
+ final RemoteAnimationAdapter adapter = definition.getAdapter(transit, activityTypes);
+ if (adapter != null) {
+ animLpToken.getDisplayContent().mAppTransition.overridePendingAppTransitionRemote(
+ adapter);
+ }
+ }
+
+ /**
+ * @return The window token that determines the animation theme.
+ */
+ private AppWindowToken findAnimLayoutParamsToken(@WindowManager.TransitionType int transit,
+ ArraySet<Integer> activityTypes) {
+ AppWindowToken result;
+ final ArraySet<AppWindowToken> closingApps = mDisplayContent.mClosingApps;
+ final ArraySet<AppWindowToken> openingApps = mDisplayContent.mOpeningApps;
+
+ // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
+ result = lookForHighestTokenWithFilter(closingApps, openingApps,
+ w -> w.getRemoteAnimationDefinition() != null
+ && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes));
+ if (result != null) {
+ return result;
+ }
+ result = lookForHighestTokenWithFilter(closingApps, openingApps,
+ w -> w.fillsParent() && w.findMainWindow() != null);
+ if (result != null) {
+ return result;
+ }
+ return lookForHighestTokenWithFilter(closingApps, openingApps,
+ w -> w.findMainWindow() != null);
+ }
+
+ /**
+ * @return The set of {@link WindowConfiguration.ActivityType}s contained in the set of apps in
+ * {@code array1} and {@code array2}.
+ */
+ private static ArraySet<Integer> collectActivityTypes(ArraySet<AppWindowToken> array1,
+ ArraySet<AppWindowToken> array2) {
+ final ArraySet<Integer> result = new ArraySet<>();
+ for (int i = array1.size() - 1; i >= 0; i--) {
+ result.add(array1.valueAt(i).getActivityType());
+ }
+ for (int i = array2.size() - 1; i >= 0; i--) {
+ result.add(array2.valueAt(i).getActivityType());
+ }
+ return result;
+ }
+
+ private static AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1,
+ ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) {
+ final int array1count = array1.size();
+ final int count = array1count + array2.size();
+ int bestPrefixOrderIndex = Integer.MIN_VALUE;
+ AppWindowToken bestToken = null;
+ for (int i = 0; i < count; i++) {
+ final AppWindowToken wtoken = i < array1count
+ ? array1.valueAt(i)
+ : array2.valueAt(i - array1count);
+ final int prefixOrderIndex = wtoken.getPrefixOrderIndex();
+ if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) {
+ bestPrefixOrderIndex = prefixOrderIndex;
+ bestToken = wtoken;
+ }
+ }
+ return bestToken;
+ }
+
+ private boolean containsVoiceInteraction(ArraySet<AppWindowToken> apps) {
+ for (int i = apps.size() - 1; i >= 0; i--) {
+ if (apps.valueAt(i).mVoiceInteraction) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void handleOpeningApps(int transit, LayoutParams animLp, boolean voiceInteraction) {
+ final ArraySet<AppWindowToken> openingApps = mDisplayContent.mOpeningApps;
+ final int appsCount = openingApps.size();
+ for (int i = 0; i < appsCount; i++) {
+ AppWindowToken wtoken = openingApps.valueAt(i);
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
+
+ if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)) {
+ // This token isn't going to be animating. Add it to the list of tokens to
+ // be notified of app transition complete since the notification will not be
+ // sent be the app window animator.
+ mDisplayContent.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
+ }
+ wtoken.updateReportedVisibilityLocked();
+ wtoken.waitingToShow = false;
+ if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
+ ">>> OPEN TRANSACTION handleAppTransitionReady()");
+ mService.openSurfaceTransaction();
+ try {
+ wtoken.showAllWindowsLocked();
+ } finally {
+ mService.closeSurfaceTransaction("handleAppTransitionReady");
+ if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
+ "<<< CLOSE TRANSACTION handleAppTransitionReady()");
+ }
+
+ if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailUp()) {
+ wtoken.attachThumbnailAnimation();
+ } else if (mDisplayContent.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) {
+ wtoken.attachCrossProfileAppsThumbnailAnimation();
+ }
+ }
+ }
+
+ private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction) {
+ final ArraySet<AppWindowToken> closingApps = mDisplayContent.mClosingApps;
+ final int appsCount = closingApps.size();
+ for (int i = 0; i < appsCount; i++) {
+ AppWindowToken wtoken = closingApps.valueAt(i);
+
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
+ // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
+ // animating?
+ wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
+ wtoken.updateReportedVisibilityLocked();
+ // Force the allDrawn flag, because we want to start
+ // this guy's animations regardless of whether it's
+ // gotten drawn.
+ wtoken.allDrawn = true;
+ wtoken.deferClearAllDrawn = false;
+ // Ensure that apps that are mid-starting are also scheduled to have their
+ // starting windows removed after the animation is complete
+ if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
+ && wtoken.getController() != null) {
+ wtoken.getController().removeStartingWindow();
+ }
+
+ if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailDown()) {
+ wtoken.attachThumbnailAnimation();
+ }
+ }
+ }
+
+ private void handleNonAppWindowsInTransition(int transit, int flags) {
+ if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
+ if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
+ && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) {
+ Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
+ (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
+ if (anim != null) {
+ mDisplayContent.mWallpaperController.startWallpaperAnimation(anim);
+ }
+ }
+ }
+ if (transit == TRANSIT_KEYGUARD_GOING_AWAY
+ || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
+ mDisplayContent.startKeyguardExitOnNonAppWindows(
+ transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
+ (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
+ }
+ }
+
+ private boolean transitionGoodToGo(int appsCount, SparseIntArray outReasons) {
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
+ "Checking " + appsCount + " opening apps (frozen="
+ + mService.mDisplayFrozen + " timeout="
+ + mDisplayContent.mAppTransition.isTimeout() + ")...");
+ final ScreenRotationAnimation screenRotationAnimation =
+ mService.mAnimator.getScreenRotationAnimationLocked(
+ Display.DEFAULT_DISPLAY);
+
+ outReasons.clear();
+ if (!mDisplayContent.mAppTransition.isTimeout()) {
+ // Imagine the case where we are changing orientation due to an app transition, but a
+ // previous orientation change is still in progress. We won't process the orientation
+ // change for our transition because we need to wait for the rotation animation to
+ // finish.
+ // If we start the app transition at this point, we will interrupt it halfway with a
+ // new rotation animation after the old one finally finishes. It's better to defer the
+ // app transition.
+ if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
+ mService.getDefaultDisplayContentLocked().rotationNeedsUpdate()) {
+ if (DEBUG_APP_TRANSITIONS) {
+ Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
+ }
+ return false;
+ }
+ for (int i = 0; i < appsCount; i++) {
+ AppWindowToken wtoken = mDisplayContent.mOpeningApps.valueAt(i);
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
+ "Check opening app=" + wtoken + ": allDrawn="
+ + wtoken.allDrawn + " startingDisplayed="
+ + wtoken.startingDisplayed + " startingMoved="
+ + wtoken.startingMoved + " isRelaunching()="
+ + wtoken.isRelaunching() + " startingWindow="
+ + wtoken.startingWindow);
+
+
+ final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching();
+ if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
+ return false;
+ }
+ final int windowingMode = wtoken.getWindowingMode();
+ if (allDrawn) {
+ outReasons.put(windowingMode, APP_TRANSITION_WINDOWS_DRAWN);
+ } else {
+ outReasons.put(windowingMode,
+ wtoken.startingData instanceof SplashScreenStartingData
+ ? APP_TRANSITION_SPLASH_SCREEN
+ : APP_TRANSITION_SNAPSHOT);
+ }
+ }
+
+ // We also need to wait for the specs to be fetched, if needed.
+ if (mDisplayContent.mAppTransition.isFetchingAppTransitionsSpecs()) {
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
+ return false;
+ }
+
+ if (!mDisplayContent.mUnknownAppVisibilityController.allResolved()) {
+ if (DEBUG_APP_TRANSITIONS) {
+ Slog.v(TAG, "unknownApps is not empty: "
+ + mDisplayContent.mUnknownAppVisibilityController.getDebugMessage());
+ }
+ return false;
+ }
+
+ // If the wallpaper is visible, we need to check it's ready too.
+ boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
+ mWallpaperControllerLocked.wallpaperTransitionReady();
+ if (wallpaperReady) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
+ boolean closingAppHasWallpaper) {
+ // Given no app transition pass it through instead of a wallpaper transition.
+ // Never convert the crashing transition.
+ // Never update the transition for the wallpaper if we are just docking from recents
+ if (transit == TRANSIT_NONE || transit == TRANSIT_CRASHING_ACTIVITY_CLOSE
+ || transit == TRANSIT_DOCK_TASK_FROM_RECENTS) {
+ return transit;
+ }
+
+ final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
+ final boolean showWallpaper = wallpaperTarget != null
+ && (wallpaperTarget.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
+ // If wallpaper is animating or wallpaperTarget doesn't have SHOW_WALLPAPER flag set,
+ // don't consider upgrading to wallpaper transition.
+ final WindowState oldWallpaper =
+ (mWallpaperControllerLocked.isWallpaperTargetAnimating() || !showWallpaper)
+ ? null
+ : wallpaperTarget;
+ final ArraySet<AppWindowToken> openingApps = mDisplayContent.mOpeningApps;
+ final ArraySet<AppWindowToken> closingApps = mDisplayContent.mClosingApps;
+ final AppWindowToken topOpeningApp = getTopApp(mDisplayContent.mOpeningApps,
+ false /* ignoreHidden */);
+ final AppWindowToken topClosingApp = getTopApp(mDisplayContent.mClosingApps,
+ true /* ignoreHidden */);
+
+ boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps);
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
+ "New wallpaper target=" + wallpaperTarget
+ + ", oldWallpaper=" + oldWallpaper
+ + ", openingApps=" + openingApps
+ + ", closingApps=" + closingApps);
+
+ if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
+ transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
+ "New transit: " + AppTransition.appTransitionToString(transit));
+ }
+ // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic
+ // relies on the fact that we always execute a Keyguard transition after preparing one.
+ else if (!isKeyguardGoingAwayTransit(transit)) {
+ if (closingAppHasWallpaper && openingAppHasWallpaper) {
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
+ switch (transit) {
+ case TRANSIT_ACTIVITY_OPEN:
+ case TRANSIT_TASK_OPEN:
+ case TRANSIT_TASK_TO_FRONT:
+ transit = TRANSIT_WALLPAPER_INTRA_OPEN;
+ break;
+ case TRANSIT_ACTIVITY_CLOSE:
+ case TRANSIT_TASK_CLOSE:
+ case TRANSIT_TASK_TO_BACK:
+ transit = TRANSIT_WALLPAPER_INTRA_CLOSE;
+ break;
+ }
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
+ "New transit: " + AppTransition.appTransitionToString(transit));
+ } else if (oldWallpaper != null && !mDisplayContent.mOpeningApps.isEmpty()
+ && !openingApps.contains(oldWallpaper.mAppToken)
+ && closingApps.contains(oldWallpaper.mAppToken)
+ && topClosingApp == oldWallpaper.mAppToken) {
+ // We are transitioning from an activity with a wallpaper to one without.
+ transit = TRANSIT_WALLPAPER_CLOSE;
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
+ + AppTransition.appTransitionToString(transit));
+ } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()
+ && openingApps.contains(wallpaperTarget.mAppToken)
+ && topOpeningApp == wallpaperTarget.mAppToken
+ && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE) {
+ // We are transitioning from an activity without
+ // a wallpaper to now showing the wallpaper
+ transit = TRANSIT_WALLPAPER_OPEN;
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
+ + AppTransition.appTransitionToString(transit));
+ }
+ }
+ return transit;
+ }
+
+ /**
+ * There are cases where we open/close a new task/activity, but in reality only a translucent
+ * activity on top of existing activities is opening/closing. For that one, we have a different
+ * animation because non of the task/activity animations actually work well with translucent
+ * apps.
+ *
+ * @param transit The current transition type.
+ * @return The current transition type or
+ * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE}/
+ * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_OPEN} if appropriate for the
+ * situation.
+ */
+ @VisibleForTesting
+ int maybeUpdateTransitToTranslucentAnim(int transit) {
+ final boolean taskOrActivity = AppTransition.isTaskTransit(transit)
+ || AppTransition.isActivityTransit(transit);
+ boolean allOpeningVisible = true;
+ boolean allTranslucentOpeningApps = !mDisplayContent.mOpeningApps.isEmpty();
+ for (int i = mDisplayContent.mOpeningApps.size() - 1; i >= 0; i--) {
+ final AppWindowToken token = mDisplayContent.mOpeningApps.valueAt(i);
+ if (!token.isVisible()) {
+ allOpeningVisible = false;
+ if (token.fillsParent()) {
+ allTranslucentOpeningApps = false;
+ }
+ }
+ }
+ boolean allTranslucentClosingApps = !mDisplayContent.mClosingApps.isEmpty();
+ for (int i = mDisplayContent.mClosingApps.size() - 1; i >= 0; i--) {
+ if (mDisplayContent.mClosingApps.valueAt(i).fillsParent()) {
+ allTranslucentClosingApps = false;
+ break;
+ }
+ }
+
+ if (taskOrActivity && allTranslucentClosingApps && allOpeningVisible) {
+ return TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+ }
+ if (taskOrActivity && allTranslucentOpeningApps && mDisplayContent.mClosingApps.isEmpty()) {
+ return TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
+ }
+ return transit;
+ }
+
+ private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
+ for (int i = apps.size() - 1; i >= 0; i--) {
+ if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Finds the top app in a list of apps, using its {@link AppWindowToken#getPrefixOrderIndex} to
+ * compare z-order.
+ *
+ * @param apps The list of apps to search.
+ * @param ignoreHidden If set to true, ignores apps that are {@link AppWindowToken#isHidden}.
+ * @return The top {@link AppWindowToken}.
+ */
+ private AppWindowToken getTopApp(ArraySet<AppWindowToken> apps, boolean ignoreHidden) {
+ int topPrefixOrderIndex = Integer.MIN_VALUE;
+ AppWindowToken topApp = null;
+ for (int i = apps.size() - 1; i >= 0; i--) {
+ final AppWindowToken app = apps.valueAt(i);
+ if (ignoreHidden && app.isHidden()) {
+ continue;
+ }
+ final int prefixOrderIndex = app.getPrefixOrderIndex();
+ if (prefixOrderIndex > topPrefixOrderIndex) {
+ topPrefixOrderIndex = prefixOrderIndex;
+ topApp = app;
+ }
+ }
+ return topApp;
+ }
+
+ private void processApplicationsAnimatingInPlace(int transit) {
+ if (transit == TRANSIT_TASK_IN_PLACE) {
+ // Find the focused window
+ final WindowState win = mDisplayContent.findFocusedWindow();
+ if (win != null) {
+ final AppWindowToken wtoken = win.mAppToken;
+ if (DEBUG_APP_TRANSITIONS)
+ Slog.v(TAG, "Now animating app in place " + wtoken);
+ wtoken.cancelAnimation();
+ wtoken.applyAnimationLocked(null, transit, false, false);
+ wtoken.updateReportedVisibilityLocked();
+ wtoken.showAllWindowsLocked();
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 330c54ca4c1d..7435ea5e532f 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -16,6 +16,15 @@
package com.android.server.wm;
+import static android.app.ActivityOptions.ANIM_CLIP_REVEAL;
+import static android.app.ActivityOptions.ANIM_CUSTOM;
+import static android.app.ActivityOptions.ANIM_OPEN_CROSS_PROFILE_APPS;
+import static android.app.ActivityOptions.ANIM_REMOTE_ANIMATION;
+import static android.app.ActivityOptions.ANIM_SCALE_UP;
+import static android.app.ActivityOptions.ANIM_THUMBNAIL_ASPECT_SCALE_DOWN;
+import static android.app.ActivityOptions.ANIM_THUMBNAIL_ASPECT_SCALE_UP;
+import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN;
+import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_UP;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
@@ -30,14 +39,20 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.app.ActivityManager.TaskSnapshot;
+import android.app.ActivityOptions;
+import android.content.Intent;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
+import android.graphics.GraphicBuffer;
+import android.graphics.Rect;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Slog;
+import android.view.AppTransitionAnimationSpec;
+import android.view.IAppTransitionAnimationSpecsFuture;
import android.view.IApplicationToken;
import android.view.RemoteAnimationDefinition;
import android.view.WindowManager;
@@ -324,6 +339,7 @@ public class AppWindowContainerController
}
final AppWindowToken wtoken = mContainer;
+ final AppTransition appTransition = mContainer.getDisplayContent().mAppTransition;
// Don't set visibility to false if we were already not visible. This prevents WM from
// adding the app to the closing app list which doesn't make sense for something that is
@@ -344,12 +360,13 @@ public class AppWindowContainerController
}
if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility("
- + mToken + ", visible=" + visible + "): " + mService.mAppTransition
+ + mToken + ", visible=" + visible + "): " + appTransition
+ " hidden=" + wtoken.isHidden() + " hiddenRequested="
+ wtoken.hiddenRequested + " Callers=" + Debug.getCallers(6));
- mService.mOpeningApps.remove(wtoken);
- mService.mClosingApps.remove(wtoken);
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ displayContent.mOpeningApps.remove(wtoken);
+ displayContent.mClosingApps.remove(wtoken);
wtoken.waitingToShow = false;
wtoken.hiddenRequested = !visible;
wtoken.mDeferHidingClient = deferHidingClient;
@@ -360,12 +377,12 @@ public class AppWindowContainerController
// if made visible again.
wtoken.removeDeadWindows();
} else {
- if (!mService.mAppTransition.isTransitionSet()
- && mService.mAppTransition.isReady()) {
+ if (!appTransition.isTransitionSet()
+ && appTransition.isReady()) {
// Add the app mOpeningApps if transition is unset but ready. This means
// we're doing a screen freeze, and the unfreeze will wait for all opening
// apps to be ready.
- mService.mOpeningApps.add(wtoken);
+ displayContent.mOpeningApps.add(wtoken);
}
wtoken.startingMoved = false;
// If the token is currently hidden (should be the common case), or has been
@@ -395,16 +412,16 @@ public class AppWindowContainerController
// If we are preparing an app transition, then delay changing
// the visibility of this token until we execute that transition.
- if (wtoken.okToAnimate() && mService.mAppTransition.isTransitionSet()) {
+ if (wtoken.okToAnimate() && appTransition.isTransitionSet()) {
wtoken.inPendingTransaction = true;
if (visible) {
- mService.mOpeningApps.add(wtoken);
+ displayContent.mOpeningApps.add(wtoken);
wtoken.mEnteringAnimation = true;
} else {
- mService.mClosingApps.add(wtoken);
+ displayContent.mClosingApps.add(wtoken);
wtoken.mEnteringAnimation = false;
}
- if (mService.mAppTransition.getAppTransition()
+ if (appTransition.getAppTransition()
== WindowManager.TRANSIT_TASK_OPEN_BEHIND) {
// We're launchingBehind, add the launching activity to mOpeningApps.
final WindowState win = mContainer.getDisplayContent().findFocusedWindow();
@@ -415,7 +432,7 @@ public class AppWindowContainerController
+ " adding " + focusedToken + " to mOpeningApps");
// Force animation to be loaded.
focusedToken.setHidden(true);
- mService.mOpeningApps.add(focusedToken);
+ displayContent.mOpeningApps.add(focusedToken);
}
}
}
@@ -434,7 +451,8 @@ public class AppWindowContainerController
public void notifyUnknownVisibilityLaunched() {
synchronized(mWindowMap) {
if (mContainer != null) {
- mService.mUnknownAppVisibilityController.notifyLaunched(mContainer);
+ mContainer.getDisplayContent().mUnknownAppVisibilityController.notifyLaunched(
+ mContainer);
}
}
}
@@ -547,7 +565,8 @@ public class AppWindowContainerController
private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning,
boolean allowTaskSnapshot, boolean activityCreated, boolean fromRecents,
TaskSnapshot snapshot) {
- if (mService.mAppTransition.getAppTransition() == TRANSIT_DOCK_TASK_FROM_RECENTS) {
+ if (mContainer.getDisplayContent().mAppTransition.getAppTransition()
+ == TRANSIT_DOCK_TASK_FROM_RECENTS) {
// TODO(b/34099271): Remove this statement to add back the starting window and figure
// out why it causes flickering, the starting window appears over the thumbnail while
// the docked from recents transition occurs
@@ -753,6 +772,104 @@ public class AppWindowContainerController
}
/**
+ * Apply override app transition base on options & animation type.
+ */
+ public void applyOptionsLocked(ActivityOptions pendingOptions, Intent intent) {
+ synchronized (mWindowMap) {
+ final int animationType = pendingOptions.getAnimationType();
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ switch (animationType) {
+ case ANIM_CUSTOM:
+ displayContent.mAppTransition.overridePendingAppTransition(
+ pendingOptions.getPackageName(),
+ pendingOptions.getCustomEnterResId(),
+ pendingOptions.getCustomExitResId(),
+ pendingOptions.getOnAnimationStartListener());
+ break;
+ case ANIM_CLIP_REVEAL:
+ displayContent.mAppTransition.overridePendingAppTransitionClipReveal(
+ pendingOptions.getStartX(), pendingOptions.getStartY(),
+ pendingOptions.getWidth(), pendingOptions.getHeight());
+ if (intent.getSourceBounds() == null) {
+ intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
+ pendingOptions.getStartY(),
+ pendingOptions.getStartX() + pendingOptions.getWidth(),
+ pendingOptions.getStartY() + pendingOptions.getHeight()));
+ }
+ break;
+ case ANIM_SCALE_UP:
+ displayContent.mAppTransition.overridePendingAppTransitionScaleUp(
+ pendingOptions.getStartX(), pendingOptions.getStartY(),
+ pendingOptions.getWidth(), pendingOptions.getHeight());
+ if (intent.getSourceBounds() == null) {
+ intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
+ pendingOptions.getStartY(),
+ pendingOptions.getStartX() + pendingOptions.getWidth(),
+ pendingOptions.getStartY() + pendingOptions.getHeight()));
+ }
+ break;
+ case ANIM_THUMBNAIL_SCALE_UP:
+ case ANIM_THUMBNAIL_SCALE_DOWN:
+ final boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
+ final GraphicBuffer buffer = pendingOptions.getThumbnail();
+ displayContent.mAppTransition.overridePendingAppTransitionThumb(buffer,
+ pendingOptions.getStartX(), pendingOptions.getStartY(),
+ pendingOptions.getOnAnimationStartListener(),
+ scaleUp);
+ if (intent.getSourceBounds() == null && buffer != null) {
+ intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
+ pendingOptions.getStartY(),
+ pendingOptions.getStartX() + buffer.getWidth(),
+ pendingOptions.getStartY() + buffer.getHeight()));
+ }
+ break;
+ case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
+ case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
+ final AppTransitionAnimationSpec[] specs = pendingOptions.getAnimSpecs();
+ final IAppTransitionAnimationSpecsFuture specsFuture =
+ pendingOptions.getSpecsFuture();
+ if (specsFuture != null) {
+ // TODO(multidisplay): Shouldn't be really used anymore from next CL.
+ displayContent.mAppTransition.overridePendingAppTransitionMultiThumbFuture(
+ specsFuture, pendingOptions.getOnAnimationStartListener(),
+ animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP);
+ } else if (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_DOWN
+ && specs != null) {
+ displayContent.mAppTransition.overridePendingAppTransitionMultiThumb(
+ specs, pendingOptions.getOnAnimationStartListener(),
+ pendingOptions.getAnimationFinishedListener(), false);
+ } else {
+ displayContent.mAppTransition.overridePendingAppTransitionAspectScaledThumb(
+ pendingOptions.getThumbnail(),
+ pendingOptions.getStartX(), pendingOptions.getStartY(),
+ pendingOptions.getWidth(), pendingOptions.getHeight(),
+ pendingOptions.getOnAnimationStartListener(),
+ (animationType == ANIM_THUMBNAIL_ASPECT_SCALE_UP));
+ if (intent.getSourceBounds() == null) {
+ intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
+ pendingOptions.getStartY(),
+ pendingOptions.getStartX() + pendingOptions.getWidth(),
+ pendingOptions.getStartY() + pendingOptions.getHeight()));
+ }
+ }
+ break;
+ case ANIM_OPEN_CROSS_PROFILE_APPS:
+ displayContent.mAppTransition
+ .overridePendingAppTransitionStartCrossProfileApps();
+ break;
+ case ANIM_REMOTE_ANIMATION:
+ // TODO(multidisplay): Will pass displayId and adjust dependencies from next CL.
+ displayContent.mAppTransition.overridePendingAppTransitionRemote(
+ pendingOptions.getRemoteAnimationAdapter());
+ break;
+ default:
+ Slog.e(TAG_WM, "applyOptionsLocked: Unknown animationType=" + animationType);
+ break;
+ }
+ }
+ }
+
+ /**
* Notifies AWT that this app is waiting to pause in order to determine if it will enter PIP.
* This information helps AWT know that the app is in the process of pausing before it gets the
* signal on the WM side.
diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
index ad92f81f4dde..729f89bb2611 100644
--- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java
+++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java
@@ -96,7 +96,7 @@ class AppWindowThumbnail implements Animatable {
anim.scaleCurrentDuration(mAppToken.mService.getTransitionAnimationScaleLocked());
mSurfaceAnimator.startAnimation(t, new LocalAnimationAdapter(
new WindowAnimationSpec(anim, position,
- mAppToken.mService.mAppTransition.canSkipFirstFrame()),
+ mAppToken.getDisplayContent().mAppTransition.canSkipFirstFrame()),
mAppToken.mService.mSurfaceAnimationRunner), false /* hidden */);
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index e38e22909957..9baafcb73279 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -111,6 +111,7 @@ import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.function.Consumer;
class AppTokenList extends ArrayList<AppWindowToken> {
}
@@ -500,14 +501,14 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
setClientHidden(!visible);
}
- if (!mService.mClosingApps.contains(this) && !mService.mOpeningApps.contains(this)) {
+ if (!getDisplayContent().mClosingApps.contains(this)
+ && !getDisplayContent().mOpeningApps.contains(this)) {
// The token is not closing nor opening, so even if there is an animation set, that
// doesn't mean that it goes through the normal app transition cycle so we have
// to inform the docked controller about visibility change.
// TODO(multi-display): notify docked divider on all displays where visibility was
// affected.
- mService.getDefaultDisplayContentLocked().getDockedDividerController()
- .notifyAppVisibilityChanged();
+ getDisplayContent().getDockedDividerController().notifyAppVisibilityChanged();
// Take the screenshot before possibly hiding the WSA, otherwise the screenshot
// will not be taken.
@@ -524,7 +525,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// no animation but there will still be a transition set.
// We still need to delay hiding the surface such that it
// can be synchronized with showing the next surface in the transition.
- if (isHidden() && !delayed && !mService.mAppTransition.isTransitionSet()) {
+ if (isHidden() && !delayed && !getDisplayContent().mAppTransition.isTransitionSet()) {
SurfaceControl.openTransaction();
for (int i = mChildren.size() - 1; i >= 0; i--) {
mChildren.get(i).mWinAnimator.hide("immediately hidden");
@@ -630,14 +631,14 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
boolean delayed = setVisibility(null, false, TRANSIT_UNSET, true, mVoiceInteraction);
- mService.mOpeningApps.remove(this);
- mService.mUnknownAppVisibilityController.appRemovedOrHidden(this);
+ getDisplayContent().mOpeningApps.remove(this);
+ getDisplayContent().mUnknownAppVisibilityController.appRemovedOrHidden(this);
mService.mTaskSnapshotController.onAppRemoved(this);
waitingToShow = false;
- if (mService.mClosingApps.contains(this)) {
+ if (getDisplayContent().mClosingApps.contains(this)) {
delayed = true;
- } else if (mService.mAppTransition.isTransitionSet()) {
- mService.mClosingApps.add(this);
+ } else if (getDisplayContent().mAppTransition.isTransitionSet()) {
+ getDisplayContent().mClosingApps.add(this);
delayed = true;
}
@@ -652,10 +653,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
// If this window was animating, then we need to ensure that the app transition notifies
- // that animations have completed in WMS.handleAnimatingStoppedAndTransitionLocked(), so
- // add to that list now
+ // that animations have completed in DisplayContent.handleAnimatingStoppedAndTransition(),
+ // so add to that list now
if (isSelfAnimating()) {
- mService.mNoAnimationNotifyOnTransitionFinished.add(token);
+ getDisplayContent().mNoAnimationNotifyOnTransitionFinished.add(token);
}
final TaskStack stack = getStack();
@@ -795,7 +796,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (task == null) {
// It is possible we have been marked as a closing app earlier. We must remove ourselves
// from this list so we do not participate in any future animations.
- mService.mClosingApps.remove(this);
+ getDisplayContent().mClosingApps.remove(this);
} else if (mLastParent != null && mLastParent.mStack != null) {
task.mStack.mExitingAppTokens.remove(this);
}
@@ -1219,7 +1220,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (tStartingWindow != null && fromToken.startingSurface != null) {
// In this case, the starting icon has already been displayed, so start
// letting windows get shown immediately without any more transitions.
- mService.mSkipAppTransitionAnimation = true;
+ getDisplayContent().mSkipAppTransitionAnimation = true;
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Moving existing starting " + tStartingWindow
+ " from " + fromToken + " to " + this);
@@ -1269,7 +1270,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// When transferring an animation, we no longer need to apply an animation to the
// the token we transfer the animation over. Thus, remove the animation from
// pending opening apps.
- mService.mOpeningApps.remove(this);
+ getDisplayContent().mOpeningApps.remove(this);
mService.updateFocusedWindowLocked(
UPDATE_FOCUS_WILL_PLACE_SURFACES, true /*updateInputWindows*/);
@@ -1323,8 +1324,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// The {@link AppWindowToken} should only specify an orientation when it is not closing or
// going to the bottom. Allowing closing {@link AppWindowToken} to participate can lead to
// an Activity in another task being started in the wrong orientation during the transition.
- if (!(sendingToBottom || mService.mClosingApps.contains(this))
- && (isVisible() || mService.mOpeningApps.contains(this))) {
+ if (!(sendingToBottom || getDisplayContent().mClosingApps.contains(this))
+ && (isVisible() || getDisplayContent().mOpeningApps.contains(this))) {
return mOrientation;
}
@@ -1398,7 +1399,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
setAppLayoutChanges(FINISH_LAYOUT_REDO_ANIM, "checkAppWindowsReadyToShow");
// We can now show all of the drawn windows!
- if (!mService.mOpeningApps.contains(this) && canShowWindows()) {
+ if (!getDisplayContent().mOpeningApps.contains(this) && canShowWindows()) {
showAllWindowsLocked();
}
}
@@ -1572,6 +1573,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
return forAllWindowsUnchecked(callback, traverseTopToBottom);
}
+ @Override
+ void forAllAppWindows(Consumer<AppWindowToken> callback) {
+ callback.accept(this);
+ }
+
boolean forAllWindowsUnchecked(ToBooleanFunction<WindowState> callback,
boolean traverseTopToBottom) {
return super.forAllWindows(callback, traverseTopToBottom);
@@ -1629,7 +1635,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
final boolean containsShowWhenLocked = containsShowWhenLockedWindow();
if (containsDismissKeyguard != mLastContainsDismissKeyguardWindow
|| containsShowWhenLocked != mLastContainsShowWhenLockedWindow) {
- mService.notifyKeyguardFlagsChanged(null /* callback */);
+ mService.notifyKeyguardFlagsChanged(null /* callback */,
+ getDisplayContent().getDisplayId());
}
mLastContainsDismissKeyguardWindow = containsDismissKeyguard;
mLastContainsShowWhenLockedWindow = containsShowWhenLocked;
@@ -1787,19 +1794,20 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
getAnimationBounds(mTmpPoint, mTmpRect);
// Delaying animation start isn't compatible with remote animations at all.
- if (mService.mAppTransition.getRemoteAnimationController() != null
+ if (getDisplayContent().mAppTransition.getRemoteAnimationController() != null
&& !mSurfaceAnimator.isAnimationStartDelayed()) {
- adapter = mService.mAppTransition.getRemoteAnimationController()
+ adapter = getDisplayContent().mAppTransition.getRemoteAnimationController()
.createAnimationAdapter(this, mTmpPoint, mTmpRect);
} else {
- final int appStackClipMode = mService.mAppTransition.getAppStackClipMode();
+ final int appStackClipMode =
+ getDisplayContent().mAppTransition.getAppStackClipMode();
mNeedsAnimationBoundsLayer = (appStackClipMode == STACK_CLIP_AFTER_ANIM);
final Animation a = loadAnimation(lp, transit, enter, isVoiceInteraction);
if (a != null) {
adapter = new LocalAnimationAdapter(
new WindowAnimationSpec(a, mTmpPoint, mTmpRect,
- mService.mAppTransition.canSkipFirstFrame(),
+ getDisplayContent().mAppTransition.canSkipFirstFrame(),
appStackClipMode,
true /* isAppAnimation */),
mService.mSurfaceAnimationRunner);
@@ -1807,7 +1815,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
mNeedsZBoost = true;
}
mTransit = transit;
- mTransitFlags = mService.mAppTransition.getTransitFlags();
+ mTransitFlags = getDisplayContent().mAppTransition.getTransitFlags();
} else {
adapter = null;
}
@@ -1877,7 +1885,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
+ " transit=" + AppTransition.appTransitionToString(transit) + " enter=" + enter
+ " frame=" + frame + " insets=" + insets + " surfaceInsets=" + surfaceInsets);
final Configuration displayConfig = displayContent.getConfiguration();
- final Animation a = mService.mAppTransition.loadAnimation(lp, transit, enter,
+ final Animation a = getDisplayContent().mAppTransition.loadAnimation(lp, transit, enter,
displayConfig.uiMode, displayConfig.orientation, frame, displayFrame, insets,
surfaceInsets, stableInsets, isVoiceInteraction, freeform, getTask().mTaskId);
if (a != null) {
@@ -2017,7 +2025,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
final ArrayList<WindowState> children = new ArrayList<>(mChildren);
children.forEach(WindowState::onExitAnimationDone);
- mService.mAppTransition.notifyAppTransitionFinishedLocked(token);
+ getDisplayContent().mAppTransition.notifyAppTransitionFinishedLocked(token);
scheduleAnimation();
}
@@ -2048,8 +2056,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
boolean isWaitingForTransitionStart() {
- return mService.mAppTransition.isTransitionSet()
- && (mService.mOpeningApps.contains(this) || mService.mClosingApps.contains(this));
+ return getDisplayContent().mAppTransition.isTransitionSet()
+ && (getDisplayContent().mOpeningApps.contains(this)
+ || getDisplayContent().mClosingApps.contains(this));
}
public int getTransit() {
@@ -2066,7 +2075,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
final int taskId = getTask().mTaskId;
final GraphicBuffer thumbnailHeader =
- mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
+ getDisplayContent().mAppTransition.getAppTransitionThumbnailHeader(taskId);
if (thumbnailHeader == null) {
if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
return;
@@ -2095,14 +2104,14 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
? R.drawable.ic_account_circle
: R.drawable.ic_corp_badge;
final GraphicBuffer thumbnail =
- mService.mAppTransition
+ getDisplayContent().mAppTransition
.createCrossProfileAppsThumbnail(thumbnailDrawableRes, frame);
if (thumbnail == null) {
return;
}
mThumbnail = new AppWindowThumbnail(getPendingTransaction(), this, thumbnail);
final Animation animation =
- mService.mAppTransition.createCrossProfileAppsThumbnailAnimationLocked(
+ getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked(
win.getFrameLw());
mThumbnail.startAnimation(getPendingTransaction(), animation, new Point(frame.left,
frame.top));
@@ -2119,7 +2128,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight);
final Rect insets = win != null ? win.getContentInsets() : null;
final Configuration displayConfig = mDisplayContent.getConfiguration();
- return mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(
+ return getDisplayContent().mAppTransition.createThumbnailAspectScaleAnimationLocked(
appRect, insets, thumbnailHeader, getTask().mTaskId, displayConfig.uiMode,
displayConfig.orientation);
}
@@ -2357,4 +2366,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
return forAllWindows(ws -> ws.mAttrs.getColorMode() != COLOR_MODE_DEFAULT,
true /* topToBottom */);
}
+
+ void removeFromPendingTransition() {
+ if (isWaitingForTransitionStart() && mDisplayContent != null) {
+ mDisplayContent.mOpeningApps.remove(this);
+ mDisplayContent.mClosingApps.remove(this);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/BlackFrame.java b/services/core/java/com/android/server/wm/BlackFrame.java
index fff1fa4dde66..e358ad5ed756 100644
--- a/services/core/java/com/android/server/wm/BlackFrame.java
+++ b/services/core/java/com/android/server/wm/BlackFrame.java
@@ -16,21 +16,18 @@
package com.android.server.wm;
-import static android.graphics.PixelFormat.OPAQUE;
-import static android.view.SurfaceControl.FX_SURFACE_DIM;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import java.io.PrintWriter;
-
import android.graphics.Matrix;
-import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.util.Slog;
import android.view.Surface.OutOfResourcesException;
import android.view.SurfaceControl;
+import java.io.PrintWriter;
+
/**
* Four black surfaces put together to make a black frame.
*/
@@ -59,6 +56,7 @@ public class BlackFrame {
transaction.setLayerStack(surface, dc.getDisplayId());
transaction.setAlpha(surface, 1);
transaction.setLayer(surface, layer);
+ transaction.setPosition(surface, left, top);
transaction.show(surface);
if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
" BLACK " + surface + ": CREATE layer=" + layer);
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index fa9ae529c6e1..ba030340ef36 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -65,6 +65,7 @@ import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_C
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.DisplayContentProto.ABOVE_APP_WINDOWS;
+import static com.android.server.wm.DisplayContentProto.APP_TRANSITION;
import static com.android.server.wm.DisplayContentProto.BELOW_APP_WINDOWS;
import static com.android.server.wm.DisplayContentProto.DISPLAY_FRAMES;
import static com.android.server.wm.DisplayContentProto.DISPLAY_INFO;
@@ -80,6 +81,7 @@ import static com.android.server.wm.DisplayContentProto.STACKS;
import static com.android.server.wm.DisplayContentProto.SURFACE_SIZE;
import static com.android.server.wm.DisplayContentProto.WINDOW_CONTAINER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_BOOT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS;
@@ -119,6 +121,7 @@ import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW;
+import android.animation.AnimationHandler;
import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -155,6 +158,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.SurfaceSession;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
+import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ToBooleanFunction;
@@ -228,6 +232,21 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
private boolean mTmpInitial;
private int mMaxUiWidth;
+ final AppTransition mAppTransition;
+ final AppTransitionController mAppTransitionController;
+ boolean mSkipAppTransitionAnimation = false;
+
+ final ArraySet<AppWindowToken> mOpeningApps = new ArraySet<>();
+ final ArraySet<AppWindowToken> mClosingApps = new ArraySet<>();
+ final UnknownAppVisibilityController mUnknownAppVisibilityController;
+ BoundsAnimationController mBoundsAnimationController;
+
+ /**
+ * List of clients without a transtiton animation that we notify once we are done
+ * transitioning since they won't be notified through the app window animator.
+ */
+ final List<IBinder> mNoAnimationNotifyOnTransitionFinished = new ArrayList<>();
+
// Mapping from a token IBinder to a WindowToken object on this display.
private final HashMap<IBinder, WindowToken> mTokenMap = new HashMap();
@@ -821,6 +840,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
mDividerControllerLocked = new DockedStackDividerController(service, this);
mPinnedStackControllerLocked = new PinnedStackController(service, this);
+ mAppTransition = new AppTransition(service.mContext, service, this);
+ mAppTransition.registerListenerLocked(service.mActivityManagerAppTransitionNotifier);
+ mAppTransitionController = new AppTransitionController(service, this);
+ mUnknownAppVisibilityController = new UnknownAppVisibilityController(service, this);
+
+ AnimationHandler animationHandler = new AnimationHandler();
+ mBoundsAnimationController = new BoundsAnimationController(service.mContext,
+ mAppTransition, SurfaceAnimationThread.getHandler(), animationHandler);
+
// We use this as our arbitrary surface size for buffer-less parents
// that don't impose cropping on their children. It may need to be larger
// than the display size because fullscreen windows can be shifted offscreen
@@ -2135,6 +2163,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
+ " to its current displayId=" + mDisplayId);
}
+ // Clean up all pending transitions when stack reparent to another display.
+ stack.forAllAppWindows(AppWindowToken::removeFromPendingTransition);
+
prevDc.mTaskStackContainers.removeChild(stack);
mTaskStackContainers.addStackToDisplay(stack, onTop);
}
@@ -2294,6 +2325,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
void removeImmediately() {
mRemovingDisplay = true;
try {
+ // Clear all transitions & screen frozen states when removing display.
+ mOpeningApps.clear();
+ mClosingApps.clear();
+ mUnknownAppVisibilityController.clear();
+ mAppTransition.removeAppTransitionTimeoutCallbacks();
+ handleAnimatingStoppedAndTransition();
+ mService.stopFreezingDisplayLocked();
super.removeImmediately();
if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this);
if (mPointerEventDispatcher != null && mTapDetector != null) {
@@ -2514,6 +2552,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
screenRotationAnimation.writeToProto(proto, SCREEN_ROTATION_ANIMATION);
}
mDisplayFrames.writeToProto(proto, DISPLAY_FRAMES);
+ mAppTransition.writeToProto(proto, APP_TRANSITION);
proto.write(SURFACE_SIZE, mSurfaceSize);
if (mFocusedApp != null) {
mFocusedApp.writeNameToProto(proto, FOCUSED_APP);
@@ -2998,11 +3037,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
if (highestTarget != null) {
- final AppTransition appTransition = mService.mAppTransition;
- if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, appTransition + " " + highestTarget
+ if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, mAppTransition + " " + highestTarget
+ " animating=" + highestTarget.isAnimating());
- if (appTransition.isTransitionSet()) {
+ if (mAppTransition.isTransitionSet()) {
// If we are currently setting up for an animation, hold everything until we
// can find out what will happen.
setInputMethodTarget(highestTarget, true);
@@ -3093,6 +3131,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
pw.println();
}
}
+
+ if (!mOpeningApps.isEmpty() || !mClosingApps.isEmpty()) {
+ pw.println();
+ if (mOpeningApps.size() > 0) {
+ pw.print(" mOpeningApps="); pw.println(mOpeningApps);
+ }
+ if (mClosingApps.size() > 0) {
+ pw.print(" mClosingApps="); pw.println(mClosingApps);
+ }
+ }
+
+ mUnknownAppVisibilityController.dump(pw, " ");
}
void dumpWindowAnimators(PrintWriter pw, String subPrefix) {
@@ -3989,7 +4039,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
final AppTokenList appTokens = mChildren.get(i).mExitingAppTokens;
for (int j = appTokens.size() - 1; j >= 0; --j) {
final AppWindowToken token = appTokens.get(j);
- if (!token.hasVisible && !mService.mClosingApps.contains(token)
+ if (!token.hasVisible && !mClosingApps.contains(token)
&& (!token.mIsExiting || token.isEmpty())) {
// Make sure there is no animation running on this token, so any windows
// associated with it will be removed as soon as their animations are
@@ -4287,8 +4337,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// Only allow force setting the orientation when all unknown visibilities have been
// resolved, as otherwise we just may be starting another occluding activity.
final boolean isUnoccluding =
- mService.mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
- && mService.mUnknownAppVisibilityController.allResolved();
+ mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
+ && mUnknownAppVisibilityController.allResolved();
if (policy.isKeyguardShowingAndNotOccluded() || isUnoccluding) {
return mLastKeyguardForcedOrientation;
}
@@ -4528,4 +4578,56 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
mPointerEventDispatcher.unregisterInputEventListener(listener);
}
}
+
+ void prepareAppTransition(@WindowManager.TransitionType int transit,
+ boolean alwaysKeepCurrent, @WindowManager.TransitionFlags int flags,
+ boolean forceOverride) {
+ final boolean prepared = mAppTransition.prepareAppTransitionLocked(
+ transit, alwaysKeepCurrent, flags, forceOverride);
+ if (prepared && okToAnimate()) {
+ mSkipAppTransitionAnimation = false;
+ }
+ }
+
+ void executeAppTransition() {
+ if (mAppTransition.isTransitionSet()) {
+ if (DEBUG_APP_TRANSITIONS) {
+ Slog.w(TAG_WM, "Execute app transition: " + mAppTransition + ", displayId: "
+ + mDisplayId + " Callers=" + Debug.getCallers(5));
+ }
+ mAppTransition.setReady();
+ mService.mWindowPlacerLocked.requestTraversal();
+ }
+ }
+
+ /**
+ * Update pendingLayoutChanges after app transition has finished.
+ */
+ void handleAnimatingStoppedAndTransition() {
+ int changes = 0;
+
+ mAppTransition.setIdle();
+
+ for (int i = mNoAnimationNotifyOnTransitionFinished.size() - 1; i >= 0; i--) {
+ final IBinder token = mNoAnimationNotifyOnTransitionFinished.get(i);
+ mAppTransition.notifyAppTransitionFinishedLocked(token);
+ }
+ mNoAnimationNotifyOnTransitionFinished.clear();
+
+ mWallpaperController.hideDeferredWallpapersIfNeeded();
+
+ onAppTransitionDone();
+
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ if (DEBUG_WALLPAPER_LIGHT) {
+ Slog.v(TAG_WM, "Wallpaper layer changed: assigning layers + relayout");
+ }
+ computeImeTarget(true /* updateImeTarget */);
+ mService.mRoot.mWallpaperMayChange = true;
+ // Since the window list has been rebuilt, focus might have to be recomputed since the
+ // actual order of windows might have changed again.
+ mService.mFocusMayChange = true;
+
+ pendingLayoutChanges |= changes;
+ }
}
diff --git a/services/core/java/com/android/server/wm/DisplayWindowController.java b/services/core/java/com/android/server/wm/DisplayWindowController.java
index 3282b1c8848a..01d556a699e8 100644
--- a/services/core/java/com/android/server/wm/DisplayWindowController.java
+++ b/services/core/java/com/android/server/wm/DisplayWindowController.java
@@ -16,6 +16,10 @@
package com.android.server.wm;
+import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
+import static android.view.WindowManager.TRANSIT_TASK_OPEN;
+import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
@@ -23,10 +27,17 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import android.content.res.Configuration;
+import android.graphics.GraphicBuffer;
import android.os.Binder;
import android.os.IBinder;
+import android.os.IRemoteCallback;
import android.util.Slog;
+import android.view.AppTransitionAnimationSpec;
import android.view.Display;
+import android.view.WindowManager;
+import android.view.WindowManager.TransitionType;
+
+import com.android.internal.annotations.VisibleForTesting;
/**
* Controller for the display container. This is created by activity manager to link activity
@@ -56,6 +67,12 @@ public class DisplayWindowController
}
}
+ @VisibleForTesting
+ public DisplayWindowController(Display display, WindowManagerService service) {
+ super(null, service);
+ mDisplayId = display.getDisplayId();
+ }
+
@Override
public void removeContainer() {
synchronized (mWindowMap) {
@@ -179,6 +196,124 @@ public class DisplayWindowController
}
}
+ public void prepareAppTransition(@WindowManager.TransitionType int transit,
+ boolean alwaysKeepCurrent) {
+ prepareAppTransition(transit, alwaysKeepCurrent, 0 /* flags */, false /* forceOverride */);
+ }
+
+ /**
+ * @param transit What kind of transition is happening. Use one of the constants
+ * AppTransition.TRANSIT_*.
+ * @param alwaysKeepCurrent If true and a transition is already set, new transition will NOT
+ * be set.
+ * @param flags Additional flags for the app transition, Use a combination of the constants
+ * AppTransition.TRANSIT_FLAG_*.
+ * @param forceOverride Always override the transit, not matter what was set previously.
+ */
+ public void prepareAppTransition(@WindowManager.TransitionType int transit,
+ boolean alwaysKeepCurrent, @WindowManager.TransitionFlags int flags,
+ boolean forceOverride) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId).prepareAppTransition(transit, alwaysKeepCurrent,
+ flags, forceOverride);
+ }
+ }
+
+ public void executeAppTransition() {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId).executeAppTransition();
+ }
+ }
+
+ public void overridePendingAppTransition(String packageName,
+ int enterAnim, int exitAnim, IRemoteCallback startedCallback) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId).mAppTransition.overridePendingAppTransition(
+ packageName, enterAnim, exitAnim, startedCallback);
+ }
+ }
+
+ public void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
+ int startHeight) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId).mAppTransition.overridePendingAppTransitionScaleUp(
+ startX, startY, startWidth, startHeight);
+ }
+ }
+
+ public void overridePendingAppTransitionClipReveal(int startX, int startY,
+ int startWidth, int startHeight) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overridePendingAppTransitionClipReveal(startX, startY,
+ startWidth, startHeight);
+ }
+ }
+
+ public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX,
+ int startY, IRemoteCallback startedCallback, boolean scaleUp) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overridePendingAppTransitionThumb(srcThumb, startX, startY,
+ startedCallback, scaleUp);
+ }
+ }
+
+ public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
+ int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
+ boolean scaleUp) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overridePendingAppTransitionAspectScaledThumb(srcThumb, startX,
+ startY, targetWidth, targetHeight, startedCallback, scaleUp);
+ }
+ }
+
+ public void overridePendingAppTransitionMultiThumb(AppTransitionAnimationSpec[] specs,
+ IRemoteCallback onAnimationStartedCallback, IRemoteCallback onAnimationFinishedCallback,
+ boolean scaleUp) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overridePendingAppTransitionMultiThumb(specs,
+ onAnimationStartedCallback, onAnimationFinishedCallback, scaleUp);
+ }
+ }
+
+ public void overridePendingAppTransitionStartCrossProfileApps() {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overridePendingAppTransitionStartCrossProfileApps();
+ }
+ }
+
+ public void overridePendingAppTransitionInPlace(String packageName, int anim) {
+ synchronized (mWindowMap) {
+ mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.overrideInPlaceAppTransition(packageName, anim);
+ }
+ }
+
+ /**
+ * Get Pending App transition of display.
+ *
+ * @return The pending app transition of the display.
+ */
+ public @TransitionType int getPendingAppTransition() {
+ synchronized (mWindowMap) {
+ return mRoot.getDisplayContent(mDisplayId).mAppTransition.getAppTransition();
+ }
+ }
+
+ /**
+ * Check if pending app transition is for activity / task launch.
+ */
+ public boolean isNextTransitionForward() {
+ final int transit = getPendingAppTransition();
+ return transit == TRANSIT_ACTIVITY_OPEN
+ || transit == TRANSIT_TASK_OPEN
+ || transit == TRANSIT_TASK_TO_FRONT;
+ }
+
@Override
public String toString() {
return "{DisplayWindowController displayId=" + mDisplayId + "}";
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index ac9384872d92..84c3aa39531f 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -27,14 +27,15 @@ import static android.view.WindowManager.DOCKED_INVALID;
import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_RIGHT;
import static android.view.WindowManager.DOCKED_TOP;
+import static android.view.WindowManager.TRANSIT_NONE;
+
import static com.android.server.wm.AppTransition.DEFAULT_APP_TRANSITION_DURATION;
import static com.android.server.wm.AppTransition.TOUCH_RESPONSE_INTERPOLATOR;
-import static android.view.WindowManager.TRANSIT_NONE;
+import static com.android.server.wm.DockedStackDividerControllerProto.MINIMIZED_DOCK;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.H.NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED;
import static com.android.server.wm.WindowManagerService.LAYER_OFFSET_DIM;
-import static com.android.server.wm.DockedStackDividerControllerProto.MINIMIZED_DOCK;
import android.content.Context;
import android.content.res.Configuration;
@@ -531,7 +532,7 @@ public class DockedStackDividerController {
final TaskStack stack =
mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility();
final long transitionDuration = isAnimationMaximizing()
- ? mService.mAppTransition.getLastClipRevealTransitionDuration()
+ ? mDisplayContent.mAppTransition.getLastClipRevealTransitionDuration()
: DEFAULT_APP_TRANSITION_DURATION;
mAnimationDuration = (long)
(transitionDuration * mService.getTransitionAnimationScaleLocked());
@@ -950,7 +951,7 @@ public class DockedStackDividerController {
return naturalAmount;
}
final int minimizeDistance = stack.getMinimizeDistance();
- float startPrime = mService.mAppTransition.getLastClipRevealMaxTranslation()
+ final float startPrime = mDisplayContent.mAppTransition.getLastClipRevealMaxTranslation()
/ (float) minimizeDistance;
final float amountPrime = t * mAnimationTarget + (1 - t) * startPrime;
final float t2 = Math.min(t / mMaximizeMeetFraction, 1);
@@ -963,12 +964,12 @@ public class DockedStackDividerController {
*/
private float getClipRevealMeetFraction(TaskStack stack) {
if (!isAnimationMaximizing() || stack == null ||
- !mService.mAppTransition.hadClipRevealAnimation()) {
+ !mDisplayContent.mAppTransition.hadClipRevealAnimation()) {
return 1f;
}
final int minimizeDistance = stack.getMinimizeDistance();
- final float fraction = Math.abs(mService.mAppTransition.getLastClipRevealMaxTranslation())
- / (float) minimizeDistance;
+ final float fraction = Math.abs(mDisplayContent.mAppTransition
+ .getLastClipRevealMaxTranslation()) / (float) minimizeDistance;
final float t = Math.max(0, Math.min(1, (fraction - CLIP_REVEAL_MEET_FRACTION_MIN)
/ (CLIP_REVEAL_MEET_FRACTION_MAX - CLIP_REVEAL_MEET_FRACTION_MIN)));
return CLIP_REVEAL_MEET_EARLIEST
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index b64d4f867faf..52b0241998b4 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -20,10 +20,10 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.PinnedStackControllerProto.DEFAULT_BOUNDS;
import static com.android.server.wm.PinnedStackControllerProto.MOVEMENT_BOUNDS;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.app.RemoteAction;
import android.content.pm.ParceledListSlice;
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index 02fbfba9d332..1807eeb0ed52 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -117,11 +117,12 @@ public class PinnedStackWindowController extends StackWindowController {
final Rect finalToBounds = toBounds;
final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
schedulePipModeChangedState;
- mService.mBoundsAnimationController.getHandler().post(() -> {
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ displayContent.mBoundsAnimationController.getHandler().post(() -> {
if (mContainer == null) {
return;
}
- mService.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
+ displayContent.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
finalToBounds, animationDuration, finalSchedulePipModeChangedState,
fromFullscreen, toFullscreen);
});
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 5c80759c6998..c4fbee931df3 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -467,7 +467,8 @@ public class RecentsAnimationController implements DeathRecipient {
// so if we are actually transitioning there, notify again here
if (mTargetAppToken != null) {
if (reorderMode == REORDER_MOVE_TO_TOP || reorderMode == REORDER_KEEP_IN_PLACE) {
- mService.mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token);
+ mService.mRoot.getDisplayContent(mDisplayId)
+ .mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token);
}
}
}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 8ec0a014e4a9..0ec4baf06099 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -317,7 +317,7 @@ class RemoteAnimationController implements DeathRecipient {
}
private int getMode() {
- if (mService.mOpeningApps.contains(mAppWindowToken)) {
+ if (mAppWindowToken.getDisplayContent().mOpeningApps.contains(mAppWindowToken)) {
return RemoteAnimationTarget.MODE_OPENING;
} else {
return RemoteAnimationTarget.MODE_CLOSING;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index c8977bede325..62078f722434 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -576,17 +576,15 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
mSustainedPerformanceModeCurrent = false;
mService.mTransactionSequence++;
- // TODO(multi-display):
+ // TODO(multi-display): recents animation & wallpaper need support multi-display.
final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked();
- final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo();
- final int defaultDw = defaultInfo.logicalWidth;
- final int defaultDh = defaultInfo.logicalHeight;
+ final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked;
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
mService.openSurfaceTransaction();
try {
- applySurfaceChangesTransaction(recoveringMemory, defaultDw, defaultDh);
+ applySurfaceChangesTransaction(recoveringMemory);
} catch (RuntimeException e) {
Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
@@ -594,39 +592,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
"<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
}
-
mService.mAnimator.executeAfterPrepareSurfacesRunnables();
- final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked;
-
- // If we are ready to perform an app transition, check through all of the app tokens to be
- // shown and see if they are ready to go.
- if (mService.mAppTransition.isReady()) {
- // This needs to be split into two expressions, as handleAppTransitionReadyLocked may
- // modify dc.pendingLayoutChanges, which would get lost when writing
- // defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked()
- final int layoutChanges = surfacePlacer.handleAppTransitionReadyLocked();
- defaultDisplay.pendingLayoutChanges |= layoutChanges;
- if (DEBUG_LAYOUT_REPEATS)
- surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked",
- defaultDisplay.pendingLayoutChanges);
- }
-
- if (!isAppAnimating() && mService.mAppTransition.isRunning()) {
- // We have finished the animation of an app transition. To do this, we have delayed a
- // lot of operations like showing and hiding apps, moving apps in Z-order, etc. The app
- // token list reflects the correct Z-order, but the window list may now be out of sync
- // with it. So here we will just rebuild the entire app window list. Fun!
- defaultDisplay.pendingLayoutChanges |=
- mService.handleAnimatingStoppedAndTransitionLocked();
- if (DEBUG_LAYOUT_REPEATS)
- surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
- defaultDisplay.pendingLayoutChanges);
- }
+ checkAppTransitionReady(surfacePlacer);
// Defer starting the recents animation until the wallpaper has drawn
final RecentsAnimationController recentsAnimationController =
- mService.getRecentsAnimationController();
+ mService.getRecentsAnimationController();
if (recentsAnimationController != null) {
recentsAnimationController.checkAnimationReady(mWallpaperController);
}
@@ -732,8 +704,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
mUpdateRotation = updateRotationUnchecked();
}
- if (mService.mWaitingForDrawnCallback != null ||
- (mOrientationChangeComplete && !defaultDisplay.isLayoutNeeded()
+ if (mService.mWaitingForDrawnCallback != null
+ || (mOrientationChangeComplete && !isLayoutNeeded()
&& !mUpdateRotation)) {
mService.checkDrawnWindowsLocked();
}
@@ -741,7 +713,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
final int N = mService.mPendingRemove.size();
if (N > 0) {
if (mService.mPendingRemoveTmp.length < N) {
- mService.mPendingRemoveTmp = new WindowState[N+10];
+ mService.mPendingRemoveTmp = new WindowState[N + 10];
}
mService.mPendingRemove.toArray(mService.mPendingRemoveTmp);
mService.mPendingRemove.clear();
@@ -783,12 +755,47 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
"performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating());
}
- private void applySurfaceChangesTransaction(boolean recoveringMemory, int defaultDw,
- int defaultDh) {
+ private void checkAppTransitionReady(WindowSurfacePlacer surfacePlacer) {
+ // Trace all displays app transition by Z-order for pending layout change.
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ final DisplayContent curDisplay = mChildren.get(i);
+
+ // If we are ready to perform an app transition, check through all of the app tokens
+ // to be shown and see if they are ready to go.
+ if (curDisplay.mAppTransition.isReady()) {
+ // handleAppTransitionReady may modify curDisplay.pendingLayoutChanges.
+ curDisplay.mAppTransitionController.handleAppTransitionReady();
+ if (DEBUG_LAYOUT_REPEATS) {
+ surfacePlacer.debugLayoutRepeats("after handleAppTransitionReady",
+ curDisplay.pendingLayoutChanges);
+ }
+ }
+
+ if (!curDisplay.isAppAnimating() && curDisplay.mAppTransition.isRunning()) {
+ // We have finished the animation of an app transition. To do this, we have
+ // delayed a lot of operations like showing and hiding apps, moving apps in
+ // Z-order, etc.
+ // The app token list reflects the correct Z-order, but the window list may now
+ // be out of sync with it. So here we will just rebuild the entire app window
+ // list. Fun!
+ curDisplay.handleAnimatingStoppedAndTransition();
+ if (DEBUG_LAYOUT_REPEATS) {
+ surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
+ curDisplay.pendingLayoutChanges);
+ }
+ }
+ }
+ }
+
+ private void applySurfaceChangesTransaction(boolean recoveringMemory) {
mHoldScreenWindow = null;
mObscuringWindow = null;
// TODO(multi-display): Support these features on secondary screens.
+ final DisplayContent defaultDc = mService.getDefaultDisplayContentLocked();
+ final DisplayInfo defaultInfo = defaultDc.getDisplayInfo();
+ final int defaultDw = defaultInfo.logicalWidth;
+ final int defaultDh = defaultInfo.logicalHeight;
if (mService.mWatermark != null) {
mService.mWatermark.positionSurface(defaultDw, defaultDh);
}
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index 1fd2c0fd19c5..40a002b39319 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -16,6 +16,11 @@
package com.android.server.wm;
+import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
+import static com.android.server.wm.WindowContainer.POSITION_TOP;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+
import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.graphics.Rect;
@@ -31,11 +36,6 @@ import com.android.internal.annotations.VisibleForTesting;
import java.lang.ref.WeakReference;
-import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
/**
* Controller for the stack container. This is created by activity manager to link activity stacks
* to the stack container they use in window manager.
@@ -140,10 +140,11 @@ public class StackWindowController
}
mContainer.positionChildAt(POSITION_TOP, childTask, includingParents);
- if (mService.mAppTransition.isTransitionSet()) {
+ final DisplayContent displayContent = mContainer.getDisplayContent();
+ if (displayContent.mAppTransition.isTransitionSet()) {
childTask.setSendingToBottom(false);
}
- mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
+ displayContent.layoutAndAssignWindowLayersIfNeeded();
}
}
@@ -162,7 +163,7 @@ public class StackWindowController
}
mContainer.positionChildAt(POSITION_BOTTOM, childTask, includingParents);
- if (mService.mAppTransition.isTransitionSet()) {
+ if (mContainer.getDisplayContent().mAppTransition.isTransitionSet()) {
childTask.setSendingToBottom(true);
}
mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 6aa0e0144c40..2a529d95fcff 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -45,6 +45,7 @@ import android.graphics.Rect;
import android.util.EventLog;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import android.view.Display;
import android.view.Surface;
import android.view.SurfaceControl;
@@ -68,7 +69,12 @@ class Task extends WindowContainer<AppWindowToken> {
// Bounds used to calculate the insets.
private final Rect mTempInsetBounds = new Rect();
- // Device rotation as of the last time {@link #mBounds} was set.
+ /** ID of the display which rotation {@link #mRotation} has. */
+ private int mLastRotationDisplayId = Display.INVALID_DISPLAY;
+ /**
+ * Display rotation as of the last time {@link #setBounds(Rect)} was called or this task was
+ * moved to a new display.
+ */
private int mRotation;
// For comparison with DisplayContent bounds.
@@ -510,8 +516,20 @@ class Task extends WindowContainer<AppWindowToken> {
setBounds(null);
return;
}
+ final int displayId = displayContent.getDisplayId();
final int newRotation = displayContent.getDisplayInfo().rotation;
+ if (displayId != mLastRotationDisplayId) {
+ // This task is on a display that it wasn't on. There is no point to keep the relative
+ // position if display rotations for old and new displays are different. Just keep these
+ // values.
+ mLastRotationDisplayId = displayId;
+ mRotation = newRotation;
+ return;
+ }
+
if (mRotation == newRotation) {
+ // Rotation didn't change. We don't need to adjust the bounds to keep the relative
+ // position.
return;
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index ef63b9b70b3b..0d5469bd4847 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -129,8 +129,8 @@ class TaskSnapshotController {
mPersister.start();
}
- void onTransitionStarting() {
- handleClosingApps(mService.mClosingApps);
+ void onTransitionStarting(DisplayContent displayContent) {
+ handleClosingApps(displayContent.mClosingApps);
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 00cacebe2960..f39ba6d0db74 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -32,6 +32,7 @@ import static android.view.WindowManager.DOCKED_INVALID;
import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_RIGHT;
import static android.view.WindowManager.DOCKED_TOP;
+
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS;
import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME;
@@ -63,10 +64,12 @@ import android.util.proto.ProtoOutputStream;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.SurfaceControl;
+
import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget;
import com.android.internal.policy.DockedDividerUtils;
import com.android.server.EventLogTags;
+
import java.io.PrintWriter;
public class TaskStack extends WindowContainer<Task> implements
@@ -99,7 +102,7 @@ public class TaskStack extends WindowContainer<Task> implements
*/
private final Rect mFullyAdjustedImeBounds = new Rect();
- // Device rotation as of the last time {@link #mBounds} was set.
+ // Display rotation as of the last time {@link #mBounds} was set.
private int mRotation;
/** Density as of last time {@link #mBounds} was set. */
@@ -1638,7 +1641,7 @@ public class TaskStack extends WindowContainer<Task> implements
return;
}
- mService.mBoundsAnimationController.onAllWindowsDrawn();
+ getDisplayContent().mBoundsAnimationController.onAllWindowsDrawn();
}
@Override // AnimatesBounds
diff --git a/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java b/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java
index eb751fa9749f..01abcab45760 100644
--- a/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java
+++ b/services/core/java/com/android/server/wm/UnknownAppVisibilityController.java
@@ -60,8 +60,11 @@ class UnknownAppVisibilityController {
private final WindowManagerService mService;
- UnknownAppVisibilityController(WindowManagerService service) {
+ private final DisplayContent mDisplayContent;
+
+ UnknownAppVisibilityController(WindowManagerService service, DisplayContent displayContent) {
mService = service;
+ mDisplayContent = displayContent;
}
boolean allResolved() {
@@ -128,7 +131,8 @@ class UnknownAppVisibilityController {
int state = mUnknownApps.get(appWindow);
if (state == UNKNOWN_STATE_WAITING_RELAYOUT) {
mUnknownApps.put(appWindow, UNKNOWN_STATE_WAITING_VISIBILITY_UPDATE);
- mService.notifyKeyguardFlagsChanged(this::notifyVisibilitiesUpdated);
+ mService.notifyKeyguardFlagsChanged(this::notifyVisibilitiesUpdated,
+ appWindow.getDisplayContent().getDisplayId());
}
}
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index a448f97306f0..942cdb9c1559 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -16,16 +16,14 @@
package com.android.server.wm;
-import com.android.internal.util.ToBooleanFunction;
-
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
@@ -50,6 +48,8 @@ import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.animation.Animation;
+import com.android.internal.util.ToBooleanFunction;
+
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -263,7 +263,8 @@ class WallpaperController {
&& (mWallpaperTarget != winGoingAway || mPrevWallpaperTarget != null)) {
return;
}
- if (mService.mAppTransition.isRunning()) {
+ if (mWallpaperTarget != null
+ && mWallpaperTarget.getDisplayContent().mAppTransition.isRunning()) {
// Defer hiding the wallpaper when app transition is running until the animations
// are done.
mDeferredHideWallpaper = winGoingAway;
@@ -549,9 +550,9 @@ class WallpaperController {
// is not. If they're both hidden, still use the new target.
mWallpaperTarget = prevWallpaperTarget;
} else if (newTargetHidden == oldTargetHidden
- && !mService.mOpeningApps.contains(wallpaperTarget.mAppToken)
- && (mService.mOpeningApps.contains(prevWallpaperTarget.mAppToken)
- || mService.mClosingApps.contains(prevWallpaperTarget.mAppToken))) {
+ && !dc.mOpeningApps.contains(wallpaperTarget.mAppToken)
+ && (dc.mOpeningApps.contains(prevWallpaperTarget.mAppToken)
+ || dc.mClosingApps.contains(prevWallpaperTarget.mAppToken))) {
// If they're both hidden (or both not hidden), prefer the one that's currently in
// opening or closing app list, this allows transition selection logic to better
// determine the wallpaper status of opening/closing apps.
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 46999a2a847e..abc382656db3 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -826,6 +826,12 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
wrapper.release();
}
+ void forAllAppWindows(Consumer<AppWindowToken> callback) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ mChildren.get(i).forAllAppWindows(callback);
+ }
+ }
+
/**
* For all tasks at or below this container call the callback.
*
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 3aad73c28f78..96fc2e241a48 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -67,12 +67,10 @@ import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
import static com.android.server.LockGuard.INDEX_WINDOW;
import static com.android.server.LockGuard.installLock;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.KeyguardDisableHandler.KEYGUARD_POLICY_CHANGED;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_BOOT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DISPLAY;
@@ -86,7 +84,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREEN_ON;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
@@ -96,7 +93,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSA
import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.WindowManagerServiceDumpProto.APP_TRANSITION;
import static com.android.server.wm.WindowManagerServiceDumpProto.DISPLAY_FROZEN;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_WINDOW;
@@ -108,7 +104,6 @@ import static com.android.server.wm.WindowManagerServiceDumpProto.ROTATION;
import android.Manifest;
import android.Manifest.permission;
-import android.animation.AnimationHandler;
import android.animation.ValueAnimator;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -134,7 +129,6 @@ import android.content.pm.PackageManagerInternal;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Bitmap;
-import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Rect;
@@ -188,7 +182,6 @@ import android.util.SparseIntArray;
import android.util.TimeUtils;
import android.util.TypedValue;
import android.util.proto.ProtoOutputStream;
-import android.view.AppTransitionAnimationSpec;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
@@ -221,7 +214,6 @@ import android.view.View;
import android.view.WindowContentFrameStats;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
-import android.view.WindowManager.TransitionFlags;
import android.view.WindowManager.TransitionType;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
@@ -266,7 +258,6 @@ import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
-import java.util.List;
/** {@hide} */
public class WindowManagerService extends IWindowManager.Stub
@@ -612,14 +603,6 @@ public class WindowManagerService extends IWindowManager.Stub
// changes the orientation.
private final PowerManager.WakeLock mScreenFrozenLock;
- final AppTransition mAppTransition;
- boolean mSkipAppTransitionAnimation = false;
-
- final ArraySet<AppWindowToken> mOpeningApps = new ArraySet<>();
- final ArraySet<AppWindowToken> mClosingApps = new ArraySet<>();
-
- final UnknownAppVisibilityController mUnknownAppVisibilityController =
- new UnknownAppVisibilityController(this);
final TaskSnapshotController mTaskSnapshotController;
boolean mIsTouchDevice;
@@ -751,7 +734,6 @@ public class WindowManagerService extends IWindowManager.Stub
* up when the animation finishes.
*/
final ArrayMap<AnimationAdapter, SurfaceAnimator> mAnimationTransferMap = new ArrayMap<>();
- final BoundsAnimationController mBoundsAnimationController;
private WindowContentFrameStats mTempWindowRenderStats;
@@ -779,10 +761,6 @@ public class WindowManagerService extends IWindowManager.Stub
// For example, when this flag is true, there will be no wallpaper service.
final boolean mOnlyCore;
- // List of clients without a transtiton animation that we notify once we are done transitioning
- // since they won't be notified through the app window animator.
- final List<IBinder> mNoAnimationNotifyOnTransitionFinished = new ArrayList<>();
-
static WindowManagerThreadPriorityBooster sThreadPriorityBooster =
new WindowManagerThreadPriorityBooster();
@@ -975,13 +953,6 @@ public class WindowManagerService extends IWindowManager.Stub
PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN");
mScreenFrozenLock.setReferenceCounted(false);
- mAppTransition = new AppTransition(context, this);
- mAppTransition.registerListenerLocked(mActivityManagerAppTransitionNotifier);
-
- final AnimationHandler animationHandler = new AnimationHandler();
- mBoundsAnimationController = new BoundsAnimationController(context, mAppTransition,
- AnimationThread.getHandler(), animationHandler);
-
mActivityManager = ActivityManager.getService();
mActivityTaskManager = ActivityTaskManager.getService();
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
@@ -1577,11 +1548,13 @@ public class WindowManagerService extends IWindowManager.Stub
Rect frame = replacedWindow.getVisibleFrameLw();
// We treat this as if this activity was opening, so we can trigger the app transition
// animation and piggy-back on existing transition animation infrastructure.
- mOpeningApps.add(atoken);
- prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_RELAUNCH, ALWAYS_KEEP_CURRENT);
- mAppTransition.overridePendingAppTransitionClipReveal(frame.left, frame.top,
+ final DisplayContent dc = atoken.getDisplayContent();
+ dc.mOpeningApps.add(atoken);
+ dc.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_RELAUNCH, ALWAYS_KEEP_CURRENT,
+ 0 /* flags */, false /* forceOverride */);
+ dc.mAppTransition.overridePendingAppTransitionClipReveal(frame.left, frame.top,
frame.width(), frame.height());
- executeAppTransition();
+ dc.executeAppTransition();
return true;
}
@@ -1590,10 +1563,12 @@ public class WindowManagerService extends IWindowManager.Stub
// unfreeze wait for the apps to be drawn.
// Note that if the display unfroze already because app unfreeze timed out,
// we don't set up the transition anymore and just let it go.
- if (mDisplayFrozen && !mOpeningApps.contains(atoken) && atoken.isRelaunching()) {
- mOpeningApps.add(atoken);
- prepareAppTransition(WindowManager.TRANSIT_NONE, !ALWAYS_KEEP_CURRENT);
- executeAppTransition();
+ final DisplayContent dc = atoken.getDisplayContent();
+ if (mDisplayFrozen && !dc.mOpeningApps.contains(atoken) && atoken.isRelaunching()) {
+ dc.mOpeningApps.add(atoken);
+ dc.prepareAppTransition(WindowManager.TRANSIT_NONE, !ALWAYS_KEEP_CURRENT, 0 /* flags */,
+ false /* forceOverride */);
+ dc.executeAppTransition();
}
}
@@ -2087,7 +2062,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (win.mAppToken != null) {
- mUnknownAppVisibilityController.notifyRelayouted(win.mAppToken);
+ dc.mUnknownAppVisibilityController.notifyRelayouted(win.mAppToken);
}
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
@@ -2445,6 +2420,9 @@ public class WindowManagerService extends IWindowManager.Stub
long ident = Binder.clearCallingIdentity();
try {
final DisplayContent dc = mRoot.getDisplayContent(displayId);
+ if (dc == null) {
+ return false;
+ }
final int req = dc.getOrientation();
if (req != dc.getLastOrientation() || forceUpdate) {
dc.setLastOrientation(req);
@@ -2475,109 +2453,15 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ // TODO(multi-display): remove when no default display use case.
+ // (i.e. KeyguardController / RecentsAnimation)
@Override
public void prepareAppTransition(@TransitionType int transit, boolean alwaysKeepCurrent) {
- prepareAppTransition(transit, alwaysKeepCurrent, 0 /* flags */, false /* forceOverride */);
- }
-
- /**
- * @param transit What kind of transition is happening. Use one of the constants
- * AppTransition.TRANSIT_*.
- * @param alwaysKeepCurrent If true and a transition is already set, new transition will NOT
- * be set.
- * @param flags Additional flags for the app transition, Use a combination of the constants
- * AppTransition.TRANSIT_FLAG_*.
- * @param forceOverride Always override the transit, not matter what was set previously.
- */
- public void prepareAppTransition(@TransitionType int transit, boolean alwaysKeepCurrent,
- @TransitionFlags int flags, boolean forceOverride) {
if (!checkCallingPermission(MANAGE_APP_TOKENS, "prepareAppTransition()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
- synchronized(mWindowMap) {
- boolean prepared = mAppTransition.prepareAppTransitionLocked(transit, alwaysKeepCurrent,
- flags, forceOverride);
- // TODO (multidisplay): associate app transitions with displays
- final DisplayContent dc = mRoot.getDisplayContent(DEFAULT_DISPLAY);
- if (prepared && dc != null && dc.okToAnimate()) {
- mSkipAppTransitionAnimation = false;
- }
- }
- }
-
- @Override
- public @TransitionType int getPendingAppTransition() {
- return mAppTransition.getAppTransition();
- }
-
- @Override
- public void overridePendingAppTransition(String packageName,
- int enterAnim, int exitAnim, IRemoteCallback startedCallback) {
- synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransition(packageName, enterAnim, exitAnim,
- startedCallback);
- }
- }
-
- @Override
- public void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
- int startHeight) {
- synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransitionScaleUp(startX, startY, startWidth,
- startHeight);
- }
- }
-
- @Override
- public void overridePendingAppTransitionClipReveal(int startX, int startY,
- int startWidth, int startHeight) {
- synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransitionClipReveal(startX, startY, startWidth,
- startHeight);
- }
- }
-
- @Override
- public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX,
- int startY, IRemoteCallback startedCallback, boolean scaleUp) {
- synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransitionThumb(srcThumb, startX, startY,
- startedCallback, scaleUp);
- }
- }
-
- @Override
- public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
- int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
- boolean scaleUp) {
- synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransitionAspectScaledThumb(srcThumb, startX, startY,
- targetWidth, targetHeight, startedCallback, scaleUp);
- }
- }
-
- @Override
- public void overridePendingAppTransitionMultiThumb(AppTransitionAnimationSpec[] specs,
- IRemoteCallback onAnimationStartedCallback, IRemoteCallback onAnimationFinishedCallback,
- boolean scaleUp) {
- synchronized (mWindowMap) {
- mAppTransition.overridePendingAppTransitionMultiThumb(specs, onAnimationStartedCallback,
- onAnimationFinishedCallback, scaleUp);
-
- }
- }
-
- public void overridePendingAppTransitionStartCrossProfileApps() {
- synchronized (mWindowMap) {
- mAppTransition.overridePendingAppTransitionStartCrossProfileApps();
- }
- }
-
- @Override
- public void overridePendingAppTransitionInPlace(String packageName, int anim) {
- synchronized(mWindowMap) {
- mAppTransition.overrideInPlaceAppTransition(packageName, anim);
- }
+ getDefaultDisplayContentLocked().prepareAppTransition(transit,
+ alwaysKeepCurrent, 0 /* flags */, false /* forceOverride */);
}
@Override
@@ -2585,8 +2469,10 @@ public class WindowManagerService extends IWindowManager.Stub
IAppTransitionAnimationSpecsFuture specsFuture, IRemoteCallback callback,
boolean scaleUp) {
synchronized(mWindowMap) {
- mAppTransition.overridePendingAppTransitionMultiThumbFuture(specsFuture, callback,
- scaleUp);
+ // TODO(multi-display): sysui using this api only support default display.
+ mRoot.getDisplayContent(DEFAULT_DISPLAY)
+ .mAppTransition.overridePendingAppTransitionMultiThumbFuture(specsFuture,
+ callback, scaleUp);
}
}
@@ -2598,7 +2484,9 @@ public class WindowManagerService extends IWindowManager.Stub
"Requires CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS permission");
}
synchronized (mWindowMap) {
- mAppTransition.overridePendingAppTransitionRemote(remoteAnimationAdapter);
+ // TODO(multi-display): sysui using this api only support default display.
+ mRoot.getDisplayContent(DEFAULT_DISPLAY)
+ .mAppTransition.overridePendingAppTransitionRemote(remoteAnimationAdapter);
}
}
@@ -2607,20 +2495,14 @@ public class WindowManagerService extends IWindowManager.Stub
// TODO: Remove once clients are updated.
}
+ // TODO(multi-display): remove when no default display use case.
+ // (i.e. KeyguardController / RecentsAnimation)
@Override
public void executeAppTransition() {
if (!checkCallingPermission(MANAGE_APP_TOKENS, "executeAppTransition()")) {
throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
}
-
- synchronized(mWindowMap) {
- if (DEBUG_APP_TRANSITIONS) Slog.w(TAG_WM, "Execute app transition: " + mAppTransition
- + " Callers=" + Debug.getCallers(5));
- if (mAppTransition.isTransitionSet()) {
- mAppTransition.setReady();
- mWindowPlacerLocked.requestTraversal();
- }
- }
+ getDefaultDisplayContentLocked().executeAppTransition();
}
public void initializeRecentsAnimation(int targetActivityType,
@@ -2630,7 +2512,7 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized (mWindowMap) {
mRecentsAnimationController = new RecentsAnimationController(this,
recentsAnimationRunner, callbacks, displayId);
- mAppTransition.updateBooster();
+ mRoot.getDisplayContent(displayId).mAppTransition.updateBooster();
mRecentsAnimationController.initialize(targetActivityType, recentTaskIds);
}
}
@@ -2650,7 +2532,8 @@ public class WindowManagerService extends IWindowManager.Stub
*/
public boolean canStartRecentsAnimation() {
synchronized (mWindowMap) {
- if (mAppTransition.isTransitionSet()) {
+ // TODO(multi-display): currently only default display support recent activity
+ if (getDefaultDisplayContentLocked().mAppTransition.isTransitionSet()) {
return false;
}
return true;
@@ -2677,7 +2560,8 @@ public class WindowManagerService extends IWindowManager.Stub
final RecentsAnimationController controller = mRecentsAnimationController;
mRecentsAnimationController = null;
controller.cleanupAnimation(reorderMode);
- mAppTransition.updateBooster();
+ // TODO(mult-display): currently only default display support recents animation.
+ getDefaultDisplayContentLocked().mAppTransition.updateBooster();
}
}
}
@@ -2747,7 +2631,8 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void notifyShowingDreamChanged() {
- notifyKeyguardFlagsChanged(null /* callback */);
+ // TODO(multi-display): support show dream in multi-display.
+ notifyKeyguardFlagsChanged(null /* callback */, DEFAULT_DISPLAY);
}
@Override
@@ -2822,11 +2707,12 @@ public class WindowManagerService extends IWindowManager.Stub
* reevaluate the visibilities of the activities.
* @param callback Runnable to be called when activity manager is done reevaluating visibilities
*/
- void notifyKeyguardFlagsChanged(@Nullable Runnable callback) {
+ void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) {
final Runnable wrappedCallback = callback != null
? () -> { synchronized (mWindowMap) { callback.run(); } }
: null;
- mH.obtainMessage(H.NOTIFY_KEYGUARD_FLAGS_CHANGED, wrappedCallback).sendToTarget();
+ mH.obtainMessage(H.NOTIFY_KEYGUARD_FLAGS_CHANGED, displayId, 0,
+ wrappedCallback).sendToTarget();
}
public boolean isKeyguardTrusted() {
@@ -3215,7 +3101,6 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized (mWindowMap) {
mCurrentUserId = newUserId;
mCurrentProfileIds = currentProfileIds;
- mAppTransition.setCurrentUser(newUserId);
mPolicy.setCurrentUserLw(newUserId);
// If keyguard was disabled, re-enable it
@@ -3234,6 +3119,8 @@ public class WindowManagerService extends IWindowManager.Stub
displayContent.mDividerControllerLocked.notifyDockedStackExistsChanged(
stack != null && stack.hasTaskForUser(newUserId));
+ mRoot.forAllDisplays(dc -> dc.mAppTransition.setCurrentUser(newUserId));
+
// If the display is already prepared, update the density.
// Otherwise, we'll update it when it's prepared.
if (mDisplayReady) {
@@ -4895,7 +4782,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
break;
case NOTIFY_KEYGUARD_FLAGS_CHANGED: {
- mAtmInternal.notifyKeyguardFlagsChanged((Runnable) msg.obj);
+ mAtmInternal.notifyKeyguardFlagsChanged((Runnable) msg.obj, msg.arg1);
}
break;
case NOTIFY_KEYGUARD_TRUSTED_CHANGED: {
@@ -5314,39 +5201,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- /**
- * @return bitmap indicating if another pass through layout must be made.
- */
- int handleAnimatingStoppedAndTransitionLocked() {
- int changes = 0;
-
- mAppTransition.setIdle();
-
- for (int i = mNoAnimationNotifyOnTransitionFinished.size() - 1; i >= 0; i--) {
- final IBinder token = mNoAnimationNotifyOnTransitionFinished.get(i);
- mAppTransition.notifyAppTransitionFinishedLocked(token);
- }
- mNoAnimationNotifyOnTransitionFinished.clear();
-
- // TODO: multi-display.
- final DisplayContent dc = getDefaultDisplayContentLocked();
-
- dc.mWallpaperController.hideDeferredWallpapersIfNeeded();
-
- dc.onAppTransitionDone();
-
- changes |= FINISH_LAYOUT_REDO_LAYOUT;
- if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG_WM,
- "Wallpaper layer changed: assigning layers + relayout");
- dc.computeImeTarget(true /* updateImeTarget */);
- mRoot.mWallpaperMayChange = true;
- // Since the window list has been rebuilt, focus might have to be recomputed since the
- // actual order of windows might have changed again.
- mFocusMayChange = true;
-
- return changes;
- }
-
void checkDrawnWindowsLocked() {
if (mWaitingForDrawn.isEmpty() || mWaitingForDrawnCallback == null) {
return;
@@ -5459,8 +5313,8 @@ public class WindowManagerService extends IWindowManager.Stub
mInputManagerCallback.freezeInputDispatchingLw();
- if (mAppTransition.isTransitionSet()) {
- mAppTransition.freeze();
+ if (displayContent.mAppTransition.isTransitionSet()) {
+ displayContent.mAppTransition.freeze();
}
if (PROFILE_ORIENTATION) {
@@ -5495,15 +5349,16 @@ public class WindowManagerService extends IWindowManager.Stub
return;
}
+ final DisplayContent dc = mRoot.getDisplayContent(mFrozenDisplayId);
if (mWaitingForConfig || mAppsFreezingScreen > 0
|| mWindowsFreezingScreen == WINDOWS_FREEZING_SCREENS_ACTIVE
- || mClientFreezingScreen || !mOpeningApps.isEmpty()) {
+ || mClientFreezingScreen || (dc != null && !dc.mOpeningApps.isEmpty())) {
if (DEBUG_ORIENTATION) Slog.d(TAG_WM,
"stopFreezingDisplayLocked: Returning mWaitingForConfig=" + mWaitingForConfig
+ ", mAppsFreezingScreen=" + mAppsFreezingScreen
+ ", mWindowsFreezingScreen=" + mWindowsFreezingScreen
+ ", mClientFreezingScreen=" + mClientFreezingScreen
- + ", mOpeningApps.size()=" + mOpeningApps.size());
+ + ", mOpeningApps.size()=" + (dc != null ? dc.mOpeningApps.size() : 0));
return;
}
@@ -5583,7 +5438,7 @@ public class WindowManagerService extends IWindowManager.Stub
mScreenFrozenLock.release();
- if (updateRotation) {
+ if (updateRotation && displayContent != null && updateRotation) {
if (DEBUG_ORIENTATION) Slog.d(TAG_WM, "Performing post-rotate rotation");
configChanged |= displayContent.updateRotationUnchecked();
}
@@ -5909,7 +5764,8 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized (mWindowMap) {
final AppWindowToken appWindow = mRoot.getAppWindowToken(token);
if (appWindow != null) {
- mUnknownAppVisibilityController.notifyAppResumedFinished(appWindow);
+ appWindow.getDisplayContent().mUnknownAppVisibilityController
+ .notifyAppResumedFinished(appWindow);
}
}
}
@@ -5955,15 +5811,6 @@ public class WindowManagerService extends IWindowManager.Stub
private void dumpTokensLocked(PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)");
mRoot.dumpTokens(pw, dumpAll);
- if (!mOpeningApps.isEmpty() || !mClosingApps.isEmpty()) {
- pw.println();
- if (mOpeningApps.size() > 0) {
- pw.print(" mOpeningApps="); pw.println(mOpeningApps);
- }
- if (mClosingApps.size() > 0) {
- pw.print(" mClosingApps="); pw.println(mClosingApps);
- }
- }
}
private void dumpSessionsLocked(PrintWriter pw, boolean dumpAll) {
@@ -6000,7 +5847,6 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayContent defaultDisplayContent = getDefaultDisplayContentLocked();
proto.write(ROTATION, defaultDisplayContent.getRotation());
proto.write(LAST_ORIENTATION, defaultDisplayContent.getLastOrientation());
- mAppTransition.writeToProto(proto, APP_TRANSITION);
}
void traceStateLocked(String where) {
@@ -6133,7 +5979,6 @@ public class WindowManagerService extends IWindowManager.Stub
pw.println();
mInputManagerCallback.dump(pw, " ");
- mUnknownAppVisibilityController.dump(pw, " ");
mTaskSnapshotController.dump(pw, " ");
if (dumpAll) {
@@ -6172,9 +6017,6 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" window="); pw.print(mWindowAnimationScaleSetting);
pw.print(" transition="); pw.print(mTransitionAnimationScaleSetting);
pw.print(" animator="); pw.println(mAnimatorDurationScaleSetting);
- pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
- pw.println(" mLayoutToAnim:");
- mAppTransition.dump(pw, " ");
if (mRecentsAnimationController != null) {
pw.print(" mRecentsAnimationController="); pw.println(mRecentsAnimationController);
mRecentsAnimationController.dump(pw, " ");
@@ -7024,10 +6866,12 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ // TODO(multi-display): currently only used by PWM to notify keyguard transitions as well
+ // forwarding it to SystemUI for synchronizing status and navigation bar animations.
@Override
public void registerAppTransitionListener(AppTransitionListener listener) {
synchronized (mWindowMap) {
- mAppTransition.registerListenerLocked(listener);
+ getDefaultDisplayContentLocked().mAppTransition.registerListenerLocked(listener);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 2f89d5ced6cc..9dc77219e8db 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1364,7 +1364,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
boolean hasContentToDisplay() {
if (!mAppFreezing && isDrawnLw() && (mViewVisibility == View.VISIBLE
- || (isAnimating() && !mService.mAppTransition.isTransitionSet()))) {
+ || (isAnimating() && !getDisplayContent().mAppTransition.isTransitionSet()))) {
return true;
}
@@ -1473,7 +1473,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
* of a transition that has not yet been started.
*/
boolean isReadyForDisplay() {
- if (mToken.waitingToShow && mService.mAppTransition.isTransitionSet()) {
+ if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet()) {
return false;
}
final boolean parentAndClientVisible = !isParentWindowHidden()
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 2beb7887698e..838d2a1abb81 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1364,7 +1364,8 @@ class WindowStateAnimator {
break;
}
if (attr >= 0) {
- a = mService.mAppTransition.loadAnimationAttr(mWin.mAttrs, attr, TRANSIT_NONE);
+ a = mWin.getDisplayContent().mAppTransition.loadAnimationAttr(
+ mWin.mAttrs, attr, TRANSIT_NONE);
}
}
if (DEBUG_ANIM) Slog.v(TAG,
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index e13a70a399e2..e82ffe8b271e 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -16,62 +16,18 @@
package com.android.server.wm;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_TASK_CLOSE;
-import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
-import static android.view.WindowManager.TRANSIT_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
-import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
-import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE;
-import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE;
-import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN;
-import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
-import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
-import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
import static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
import static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
-import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
-import android.app.WindowConfiguration;
import android.os.Debug;
import android.os.Trace;
-import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseIntArray;
-import android.view.Display;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.WindowManager.TransitionType;
-import android.view.animation.Animation;
-
-import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
-import java.util.function.Predicate;
/**
* Positions windows and their surfaces.
@@ -233,550 +189,6 @@ class WindowSurfacePlacer {
return mInLayout;
}
- /**
- * @return bitmap indicating if another pass through layout must be made.
- */
- int handleAppTransitionReadyLocked() {
- int appsCount = mService.mOpeningApps.size();
- if (!transitionGoodToGo(appsCount, mTempTransitionReasons)) {
- return 0;
- }
- Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
-
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
- int transit = mService.mAppTransition.getAppTransition();
- if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) {
- transit = WindowManager.TRANSIT_UNSET;
- }
- mService.mSkipAppTransitionAnimation = false;
- mService.mNoAnimationNotifyOnTransitionFinished.clear();
-
- mService.mAppTransition.removeAppTransitionTimeoutCallbacks();
-
- final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
-
- mService.mRoot.mWallpaperMayChange = false;
-
- int i;
- for (i = 0; i < appsCount; i++) {
- final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
- // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
- // window is removed, or window relayout to invisible. This also affects window
- // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
- // transition selection depends on wallpaper target visibility.
- wtoken.clearAnimatingFlags();
- }
-
- // Adjust wallpaper before we pull the lower/upper target, since pending changes
- // (like the clearAnimatingFlags() above) might affect wallpaper target result.
- // Or, the opening app window should be a wallpaper target.
- mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent,
- mService.mOpeningApps);
-
- // Determine if closing and opening app token sets are wallpaper targets, in which case
- // special animations are needed.
- final boolean hasWallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget() != null;
- final boolean openingAppHasWallpaper = canBeWallpaperTarget(mService.mOpeningApps)
- && hasWallpaperTarget;
- final boolean closingAppHasWallpaper = canBeWallpaperTarget(mService.mClosingApps)
- && hasWallpaperTarget;
-
- transit = maybeUpdateTransitToTranslucentAnim(transit);
- transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
- closingAppHasWallpaper);
-
- // Find the layout params of the top-most application window in the tokens, which is
- // what will control the animation theme. If all closing windows are obscured, then there is
- // no need to do an animation. This is the case, for example, when this transition is being
- // done behind a dream window.
- final ArraySet<Integer> activityTypes = collectActivityTypes(mService.mOpeningApps,
- mService.mClosingApps);
- final boolean allowAnimations = mService.mPolicy.allowAppAnimationsLw();
- final AppWindowToken animLpToken = allowAnimations
- ? findAnimLayoutParamsToken(transit, activityTypes)
- : null;
- final AppWindowToken topOpeningApp = allowAnimations
- ? getTopApp(mService.mOpeningApps, false /* ignoreHidden */)
- : null;
- final AppWindowToken topClosingApp = allowAnimations
- ? getTopApp(mService.mClosingApps, false /* ignoreHidden */)
- : null;
- final LayoutParams animLp = getAnimLp(animLpToken);
- overrideWithRemoteAnimationIfSet(animLpToken, transit, activityTypes);
-
- final boolean voiceInteraction = containsVoiceInteraction(mService.mOpeningApps)
- || containsVoiceInteraction(mService.mOpeningApps);
-
- final int layoutRedo;
- mService.mSurfaceAnimationRunner.deferStartingAnimations();
- try {
- processApplicationsAnimatingInPlace(transit);
-
- handleClosingApps(transit, animLp, voiceInteraction);
- handleOpeningApps(transit, animLp, voiceInteraction);
-
- mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp);
-
- final int flags = mService.mAppTransition.getTransitFlags();
- layoutRedo = mService.mAppTransition.goodToGo(transit, topOpeningApp, topClosingApp,
- mService.mOpeningApps, mService.mClosingApps);
- handleNonAppWindowsInTransition(transit, flags);
- mService.mAppTransition.postAnimationCallback();
- mService.mAppTransition.clear();
- } finally {
- mService.mSurfaceAnimationRunner.continueStartingAnimations();
- }
-
- mService.mTaskSnapshotController.onTransitionStarting();
-
- mService.mOpeningApps.clear();
- mService.mClosingApps.clear();
- mService.mUnknownAppVisibilityController.clear();
-
- // This has changed the visibility of windows, so perform
- // a new layout to get them all up-to-date.
- displayContent.setLayoutNeeded();
-
- // TODO(multidisplay): IMEs are only supported on the default display.
- final DisplayContent dc = mService.getDefaultDisplayContentLocked();
- dc.computeImeTarget(true /* updateImeTarget */);
- mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
- true /*updateInputWindows*/);
- mService.mFocusMayChange = false;
-
- mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING,
- mTempTransitionReasons.clone()).sendToTarget();
-
- Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
-
- return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
- }
-
- private static LayoutParams getAnimLp(AppWindowToken wtoken) {
- final WindowState mainWindow = wtoken != null ? wtoken.findMainWindow() : null;
- return mainWindow != null ? mainWindow.mAttrs : null;
- }
-
- /**
- * Overrides the pending transition with the remote animation defined for the transition in the
- * set of defined remote animations in the app window token.
- */
- private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit,
- ArraySet<Integer> activityTypes) {
- if (transit == TRANSIT_CRASHING_ACTIVITY_CLOSE) {
- // The crash transition has higher priority than any involved remote animations.
- return;
- }
- if (animLpToken == null) {
- return;
- }
- final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition();
- if (definition != null) {
- final RemoteAnimationAdapter adapter = definition.getAdapter(transit, activityTypes);
- if (adapter != null) {
- mService.mAppTransition.overridePendingAppTransitionRemote(adapter);
- }
- }
- }
-
- /**
- * @return The window token that determines the animation theme.
- */
- private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit,
- ArraySet<Integer> activityTypes) {
- AppWindowToken result;
-
- // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
- result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
- w -> w.getRemoteAnimationDefinition() != null
- && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes));
- if (result != null) {
- return result;
- }
- result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
- w -> w.fillsParent() && w.findMainWindow() != null);
- if (result != null) {
- return result;
- }
- return lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
- w -> w.findMainWindow() != null);
- }
-
- /**
- * @return The set of {@link WindowConfiguration.ActivityType}s contained in the set of apps in
- * {@code array1} and {@code array2}.
- */
- private ArraySet<Integer> collectActivityTypes(ArraySet<AppWindowToken> array1,
- ArraySet<AppWindowToken> array2) {
- final ArraySet<Integer> result = new ArraySet<>();
- for (int i = array1.size() - 1; i >= 0; i--) {
- result.add(array1.valueAt(i).getActivityType());
- }
- for (int i = array2.size() - 1; i >= 0; i--) {
- result.add(array2.valueAt(i).getActivityType());
- }
- return result;
- }
-
- private AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1,
- ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) {
- final int array1count = array1.size();
- final int count = array1count + array2.size();
- int bestPrefixOrderIndex = Integer.MIN_VALUE;
- AppWindowToken bestToken = null;
- for (int i = 0; i < count; i++) {
- final AppWindowToken wtoken = i < array1count
- ? array1.valueAt(i)
- : array2.valueAt(i - array1count);
- final int prefixOrderIndex = wtoken.getPrefixOrderIndex();
- if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) {
- bestPrefixOrderIndex = prefixOrderIndex;
- bestToken = wtoken;
- }
- }
- return bestToken;
- }
-
- private boolean containsVoiceInteraction(ArraySet<AppWindowToken> apps) {
- for (int i = apps.size() - 1; i >= 0; i--) {
- if (apps.valueAt(i).mVoiceInteraction) {
- return true;
- }
- }
- return false;
- }
-
- private void handleOpeningApps(int transit, LayoutParams animLp, boolean voiceInteraction) {
- final int appsCount = mService.mOpeningApps.size();
- for (int i = 0; i < appsCount; i++) {
- AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
-
- if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)) {
- // This token isn't going to be animating. Add it to the list of tokens to
- // be notified of app transition complete since the notification will not be
- // sent be the app window animator.
- mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
- }
- wtoken.updateReportedVisibilityLocked();
- wtoken.waitingToShow = false;
- if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
- ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
- mService.openSurfaceTransaction();
- try {
- wtoken.showAllWindowsLocked();
- } finally {
- mService.closeSurfaceTransaction("handleAppTransitionReadyLocked");
- if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
- "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()");
- }
-
- if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) {
- wtoken.attachThumbnailAnimation();
- } else if (mService.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) {
- wtoken.attachCrossProfileAppsThumbnailAnimation();
- }
- }
- }
-
- private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction) {
- final int appsCount;
- appsCount = mService.mClosingApps.size();
- for (int i = 0; i < appsCount; i++) {
- AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
-
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
- // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
- // animating?
- wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
- wtoken.updateReportedVisibilityLocked();
- // Force the allDrawn flag, because we want to start
- // this guy's animations regardless of whether it's
- // gotten drawn.
- wtoken.allDrawn = true;
- wtoken.deferClearAllDrawn = false;
- // Ensure that apps that are mid-starting are also scheduled to have their
- // starting windows removed after the animation is complete
- if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
- && wtoken.getController() != null) {
- wtoken.getController().removeStartingWindow();
- }
-
- if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) {
- wtoken.attachThumbnailAnimation();
- }
- }
- }
-
- private void handleNonAppWindowsInTransition(int transit, int flags) {
- if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
- if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
- && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) {
- Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
- (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
- if (anim != null) {
- mService.getDefaultDisplayContentLocked().mWallpaperController
- .startWallpaperAnimation(anim);
- }
- }
- }
- if (transit == TRANSIT_KEYGUARD_GOING_AWAY
- || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
- mService.getDefaultDisplayContentLocked().startKeyguardExitOnNonAppWindows(
- transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
- (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
- }
- }
-
- private boolean transitionGoodToGo(int appsCount, SparseIntArray outReasons) {
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "Checking " + appsCount + " opening apps (frozen="
- + mService.mDisplayFrozen + " timeout="
- + mService.mAppTransition.isTimeout() + ")...");
- final ScreenRotationAnimation screenRotationAnimation =
- mService.mAnimator.getScreenRotationAnimationLocked(
- Display.DEFAULT_DISPLAY);
-
- outReasons.clear();
- if (!mService.mAppTransition.isTimeout()) {
- // Imagine the case where we are changing orientation due to an app transition, but a previous
- // orientation change is still in progress. We won't process the orientation change
- // for our transition because we need to wait for the rotation animation to finish.
- // If we start the app transition at this point, we will interrupt it halfway with a new rotation
- // animation after the old one finally finishes. It's better to defer the
- // app transition.
- if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
- mService.getDefaultDisplayContentLocked().rotationNeedsUpdate()) {
- if (DEBUG_APP_TRANSITIONS) {
- Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
- }
- return false;
- }
- for (int i = 0; i < appsCount; i++) {
- AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "Check opening app=" + wtoken + ": allDrawn="
- + wtoken.allDrawn + " startingDisplayed="
- + wtoken.startingDisplayed + " startingMoved="
- + wtoken.startingMoved + " isRelaunching()="
- + wtoken.isRelaunching() + " startingWindow="
- + wtoken.startingWindow);
-
-
- final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching();
- if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
- return false;
- }
- final int windowingMode = wtoken.getWindowingMode();
- if (allDrawn) {
- outReasons.put(windowingMode, APP_TRANSITION_WINDOWS_DRAWN);
- } else {
- outReasons.put(windowingMode,
- wtoken.startingData instanceof SplashScreenStartingData
- ? APP_TRANSITION_SPLASH_SCREEN
- : APP_TRANSITION_SNAPSHOT);
- }
- }
-
- // We also need to wait for the specs to be fetched, if needed.
- if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) {
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
- return false;
- }
-
- if (!mService.mUnknownAppVisibilityController.allResolved()) {
- if (DEBUG_APP_TRANSITIONS) {
- Slog.v(TAG, "unknownApps is not empty: "
- + mService.mUnknownAppVisibilityController.getDebugMessage());
- }
- return false;
- }
-
- // If the wallpaper is visible, we need to check it's ready too.
- boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
- mWallpaperControllerLocked.wallpaperTransitionReady();
- if (wallpaperReady) {
- return true;
- }
- return false;
- }
- return true;
- }
-
- private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
- boolean closingAppHasWallpaper) {
- // Given no app transition pass it through instead of a wallpaper transition.
- // Never convert the crashing transition.
- // Never update the transition for the wallpaper if we are just docking from recents
- if (transit == TRANSIT_NONE || transit == TRANSIT_CRASHING_ACTIVITY_CLOSE
- || transit == TRANSIT_DOCK_TASK_FROM_RECENTS) {
- return transit;
- }
-
- final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
- final boolean showWallpaper = wallpaperTarget != null
- && (wallpaperTarget.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
- // If wallpaper is animating or wallpaperTarget doesn't have SHOW_WALLPAPER flag set,
- // don't consider upgrading to wallpaper transition.
- final WindowState oldWallpaper =
- (mWallpaperControllerLocked.isWallpaperTargetAnimating() || !showWallpaper)
- ? null
- : wallpaperTarget;
- final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps;
- final ArraySet<AppWindowToken> closingApps = mService.mClosingApps;
- final AppWindowToken topOpeningApp = getTopApp(mService.mOpeningApps,
- false /* ignoreHidden */);
- final AppWindowToken topClosingApp = getTopApp(mService.mClosingApps,
- true /* ignoreHidden */);
-
- boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps);
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "New wallpaper target=" + wallpaperTarget
- + ", oldWallpaper=" + oldWallpaper
- + ", openingApps=" + openingApps
- + ", closingApps=" + closingApps);
-
- if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
- transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "New transit: " + AppTransition.appTransitionToString(transit));
- }
- // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic
- // relies on the fact that we always execute a Keyguard transition after preparing one.
- else if (!isKeyguardGoingAwayTransit(transit)) {
- if (closingAppHasWallpaper && openingAppHasWallpaper) {
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
- switch (transit) {
- case TRANSIT_ACTIVITY_OPEN:
- case TRANSIT_TASK_OPEN:
- case TRANSIT_TASK_TO_FRONT:
- transit = TRANSIT_WALLPAPER_INTRA_OPEN;
- break;
- case TRANSIT_ACTIVITY_CLOSE:
- case TRANSIT_TASK_CLOSE:
- case TRANSIT_TASK_TO_BACK:
- transit = TRANSIT_WALLPAPER_INTRA_CLOSE;
- break;
- }
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
- "New transit: " + AppTransition.appTransitionToString(transit));
- } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty()
- && !openingApps.contains(oldWallpaper.mAppToken)
- && closingApps.contains(oldWallpaper.mAppToken)
- && topClosingApp == oldWallpaper.mAppToken) {
- // We are transitioning from an activity with a wallpaper to one without.
- transit = TRANSIT_WALLPAPER_CLOSE;
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
- + AppTransition.appTransitionToString(transit));
- } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()
- && openingApps.contains(wallpaperTarget.mAppToken)
- && topOpeningApp == wallpaperTarget.mAppToken
- && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE) {
- // We are transitioning from an activity without
- // a wallpaper to now showing the wallpaper
- transit = TRANSIT_WALLPAPER_OPEN;
- if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
- + AppTransition.appTransitionToString(transit));
- }
- }
- return transit;
- }
-
- /**
- * There are cases where we open/close a new task/activity, but in reality only a translucent
- * activity on top of existing activities is opening/closing. For that one, we have a different
- * animation because non of the task/activity animations actually work well with translucent
- * apps.
- *
- * @param transit The current transition type.
- * @return The current transition type or
- * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE}/
- * {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_OPEN} if appropriate for the
- * situation.
- */
- @VisibleForTesting
- int maybeUpdateTransitToTranslucentAnim(int transit) {
- final boolean taskOrActivity = AppTransition.isTaskTransit(transit)
- || AppTransition.isActivityTransit(transit);
- boolean allOpeningVisible = true;
- boolean allTranslucentOpeningApps = !mService.mOpeningApps.isEmpty();
- for (int i = mService.mOpeningApps.size() - 1; i >= 0; i--) {
- final AppWindowToken token = mService.mOpeningApps.valueAt(i);
- if (!token.isVisible()) {
- allOpeningVisible = false;
- if (token.fillsParent()) {
- allTranslucentOpeningApps = false;
- }
- }
- }
- boolean allTranslucentClosingApps = !mService.mClosingApps.isEmpty();
- for (int i = mService.mClosingApps.size() - 1; i >= 0; i--) {
- if (mService.mClosingApps.valueAt(i).fillsParent()) {
- allTranslucentClosingApps = false;
- break;
- }
- }
-
- if (taskOrActivity && allTranslucentClosingApps && allOpeningVisible) {
- return TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
- }
- if (taskOrActivity && allTranslucentOpeningApps && mService.mClosingApps.isEmpty()) {
- return TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
- }
- return transit;
- }
-
- private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
- for (int i = apps.size() - 1; i >= 0; i--) {
- if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Finds the top app in a list of apps, using its {@link AppWindowToken#getPrefixOrderIndex} to
- * compare z-order.
- *
- * @param apps The list of apps to search.
- * @param ignoreHidden If set to true, ignores apps that are {@link AppWindowToken#isHidden}.
- * @return The top {@link AppWindowToken}.
- */
- private AppWindowToken getTopApp(ArraySet<AppWindowToken> apps, boolean ignoreHidden) {
- int topPrefixOrderIndex = Integer.MIN_VALUE;
- AppWindowToken topApp = null;
- for (int i = apps.size() - 1; i >= 0; i--) {
- final AppWindowToken app = apps.valueAt(i);
- if (ignoreHidden && app.isHidden()) {
- continue;
- }
- final int prefixOrderIndex = app.getPrefixOrderIndex();
- if (prefixOrderIndex > topPrefixOrderIndex) {
- topPrefixOrderIndex = prefixOrderIndex;
- topApp = app;
- }
- }
- return topApp;
- }
-
- private void processApplicationsAnimatingInPlace(int transit) {
- if (transit == TRANSIT_TASK_IN_PLACE) {
- // TODO (b/111362605): non-default-display transition.
- // Find the focused window
- final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow();
- if (win != null) {
- final AppWindowToken wtoken = win.mAppToken;
- if (DEBUG_APP_TRANSITIONS)
- Slog.v(TAG, "Now animating app in place " + wtoken);
- wtoken.cancelAnimation();
- wtoken.applyAnimationLocked(null, transit, false, false);
- wtoken.updateReportedVisibilityLocked();
- wtoken.showAllWindowsLocked();
- }
- }
- }
-
void requestTraversal() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
diff --git a/services/core/jni/com_android_server_connectivity_Vpn.cpp b/services/core/jni/com_android_server_connectivity_Vpn.cpp
index b6bea11a66ea..836d6d8abdb2 100644
--- a/services/core/jni/com_android_server_connectivity_Vpn.cpp
+++ b/services/core/jni/com_android_server_connectivity_Vpn.cpp
@@ -57,7 +57,7 @@ static inline in_addr_t *as_in_addr(sockaddr *sa) {
static int create_interface(int mtu)
{
- int tun = open("/dev/tun", O_RDWR | O_NONBLOCK);
+ int tun = open("/dev/tun", O_RDWR | O_NONBLOCK | O_CLOEXEC);
ifreq ifr4;
memset(&ifr4, 0, sizeof(ifr4));
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index b47dbfa58669..a4983a96afd8 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -40,7 +40,7 @@
#include <cinttypes>
#include <iomanip>
-static jobject mCallbacksObj = NULL;
+static jobject mCallbacksObj = nullptr;
static jmethodID method_reportLocation;
static jmethodID method_reportStatus;
@@ -717,7 +717,7 @@ Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb(
std::vector<uint8_t> navigationData = message.data;
uint8_t* data = &(navigationData[0]);
- if (dataLength == 0 || data == NULL) {
+ if (dataLength == 0 || data == nullptr) {
ALOGE("Invalid Navigation Message found: data=%p, length=%zd", data,
dataLength);
return Void();
@@ -749,7 +749,7 @@ struct GnssMeasurementCallback : public IGnssMeasurementCallback_V1_1 {
Return<void> GnssMeasurementCb(const IGnssMeasurementCallback_V1_0::GnssData& data) override;
private:
void translateGnssMeasurement_V1_0(
- JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
JavaObject& object);
jobjectArray translateGnssMeasurements(
JNIEnv* env,
@@ -772,7 +772,7 @@ Return<void> GnssMeasurementCallback::gnssMeasurementCb(
clock = translateGnssClock(env, &data.clock);
measurementArray = translateGnssMeasurements(
- env, data.measurements.data(), NULL, data.measurements.size());
+ env, data.measurements.data(), nullptr, data.measurements.size());
setMeasurementData(env, clock, measurementArray);
env->DeleteLocalRef(clock);
@@ -789,7 +789,7 @@ Return<void> GnssMeasurementCallback::GnssMeasurementCb(
clock = translateGnssClock(env, &data.clock);
measurementArray = translateGnssMeasurements(
- env, NULL, data.measurements.data(), data.measurementCount);
+ env, nullptr, data.measurements.data(), data.measurementCount);
setMeasurementData(env, clock, measurementArray);
env->DeleteLocalRef(clock);
@@ -799,7 +799,7 @@ Return<void> GnssMeasurementCallback::GnssMeasurementCb(
// preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
void GnssMeasurementCallback::translateGnssMeasurement_V1_0(
- JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
JavaObject& object) {
uint32_t flags = static_cast<uint32_t>(measurement->flags);
@@ -816,7 +816,7 @@ void GnssMeasurementCallback::translateGnssMeasurement_V1_0(
measurement->pseudorangeRateUncertaintyMps);
SET(AccumulatedDeltaRangeState,
(static_cast<int32_t>(measurement->accumulatedDeltaRangeState) &
- !ADR_STATE_HALF_CYCLE_REPORTED)); // Half Cycle state not reported from Hardware in V1_0
+ ~ADR_STATE_HALF_CYCLE_REPORTED)); // Half Cycle state not reported from Hardware in V1_0
SET(AccumulatedDeltaRangeMeters, measurement->accumulatedDeltaRangeM);
SET(AccumulatedDeltaRangeUncertaintyMeters,
measurement->accumulatedDeltaRangeUncertaintyM);
@@ -883,26 +883,26 @@ jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env,
const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
size_t count) {
if (count == 0) {
- return NULL;
+ return nullptr;
}
jclass gnssMeasurementClass = env->FindClass("android/location/GnssMeasurement");
jobjectArray gnssMeasurementArray = env->NewObjectArray(
count,
gnssMeasurementClass,
- NULL /* initialElement */);
+ nullptr /* initialElement */);
for (uint16_t i = 0; i < count; ++i) {
JavaObject object(env, "android/location/GnssMeasurement");
- if (measurements_v1_1 != NULL) {
- translateGnssMeasurement_V1_0(env, &(measurements_v1_1[i].v1_0), object);
+ if (measurements_v1_1 != nullptr) {
+ translateGnssMeasurement_V1_0(&(measurements_v1_1[i].v1_0), object);
// Set the V1_1 flag, and mark that new field has valid information for Java Layer
SET(AccumulatedDeltaRangeState,
(static_cast<int32_t>(measurements_v1_1[i].accumulatedDeltaRangeState) |
ADR_STATE_HALF_CYCLE_REPORTED));
} else {
- translateGnssMeasurement_V1_0(env, &(measurements_v1_0[i]), object);
+ translateGnssMeasurement_V1_0(&(measurements_v1_0[i]), object);
}
env->SetObjectArrayElement(gnssMeasurementArray, i, object.get());
@@ -987,14 +987,12 @@ struct AGnssCallback : public IAGnssCallback {
Return<void> AGnssCallback::agnssStatusIpV6Cb(
const IAGnssCallback::AGnssStatusIpV6& agps_status) {
JNIEnv* env = getJniEnv();
- jbyteArray byteArray = NULL;
- bool isSupported = false;
+ jbyteArray byteArray = nullptr;
byteArray = env->NewByteArray(16);
- if (byteArray != NULL) {
+ if (byteArray != nullptr) {
env->SetByteArrayRegion(byteArray, 0, 16,
(const jbyte*)(agps_status.ipV6Addr.data()));
- isSupported = true;
} else {
ALOGE("Unable to allocate byte array for IPv6 address.");
}
@@ -1006,7 +1004,7 @@ Return<void> AGnssCallback::agnssStatusIpV6Cb(
ALOGD("AGPS IP is v6: %s", str);
}
- jsize byteArrayLength = byteArray != NULL ? env->GetArrayLength(byteArray) : 0;
+ jsize byteArrayLength = byteArray != nullptr ? env->GetArrayLength(byteArray) : 0;
ALOGV("Passing AGPS IP addr: size %d", byteArrayLength);
env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus,
agps_status.type, agps_status.status, byteArray);
@@ -1023,7 +1021,7 @@ Return<void> AGnssCallback::agnssStatusIpV6Cb(
Return<void> AGnssCallback::agnssStatusIpV4Cb(
const IAGnssCallback::AGnssStatusIpV4& agps_status) {
JNIEnv* env = getJniEnv();
- jbyteArray byteArray = NULL;
+ jbyteArray byteArray = nullptr;
uint32_t ipAddr = agps_status.ipV4Addr;
byteArray = convertToIpV4(ipAddr);
@@ -1039,7 +1037,7 @@ Return<void> AGnssCallback::agnssStatusIpV4Cb(
}
jsize byteArrayLength =
- byteArray != NULL ? env->GetArrayLength(byteArray) : 0;
+ byteArray != nullptr ? env->GetArrayLength(byteArray) : 0;
ALOGV("Passing AGPS IP addr: size %d", byteArrayLength);
env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus,
agps_status.type, agps_status.status, byteArray);
@@ -1054,14 +1052,14 @@ Return<void> AGnssCallback::agnssStatusIpV4Cb(
jbyteArray AGnssCallback::convertToIpV4(uint32_t ip) {
if (INADDR_NONE == ip) {
- return NULL;
+ return nullptr;
}
JNIEnv* env = getJniEnv();
jbyteArray byteArray = env->NewByteArray(4);
- if (byteArray == NULL) {
+ if (byteArray == nullptr) {
ALOGE("Unable to allocate byte array for IPv4 address");
- return NULL;
+ return nullptr;
}
jbyte ipv4[4];
@@ -1341,7 +1339,7 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject
sp<IGnssXtraCallback> gnssXtraCbIface = new GnssXtraCallback();
if (gnssXtraIface == nullptr) {
- ALOGE("Unable to initialize GNSS Xtra interface\n");
+ ALOGI("Unable to initialize GNSS Xtra interface\n");
} else {
result = gnssXtraIface->setCallback(gnssXtraCbIface);
if (!result.isOk() || !result) {
@@ -1483,7 +1481,7 @@ static void android_location_GnssLocationProvider_agps_set_id(JNIEnv *env, jobje
return;
}
- const char *setid = env->GetStringUTFChars(setid_string, NULL);
+ const char *setid = env->GetStringUTFChars(setid_string, nullptr);
agnssRilIface->setSetId((IAGnssRil::SetIDType)type, setid);
env->ReleaseStringUTFChars(setid_string, setid);
}
@@ -1579,12 +1577,12 @@ static void android_location_GnssLocationProvider_agps_data_conn_open(
ALOGE("no AGPS interface in agps_data_conn_open");
return;
}
- if (apn == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+ if (apn == nullptr) {
+ jniThrowException(env, "java/lang/IllegalArgumentException", nullptr);
return;
}
- const char *apnStr = env->GetStringUTFChars(apn, NULL);
+ const char *apnStr = env->GetStringUTFChars(apn, nullptr);
auto result = agnssIface->dataConnOpen(apnStr, static_cast<IAGnss::ApnIpType>(apnIpType));
if (!result.isOk() || !result){
@@ -1626,7 +1624,7 @@ static void android_location_GnssLocationProvider_set_agps_server(JNIEnv* env, j
return;
}
- const char *c_hostname = env->GetStringUTFChars(hostname, NULL);
+ const char *c_hostname = env->GetStringUTFChars(hostname, nullptr);
auto result = agnssIface->setServer(static_cast<IAGnssCallback::AGnssType>(type),
c_hostname,
port);
@@ -1649,7 +1647,7 @@ static void android_location_GnssLocationProvider_send_ni_response(JNIEnv* /* en
static jstring android_location_GnssLocationProvider_get_internal_state(JNIEnv* env,
jobject /* obj */) {
- jstring result = NULL;
+ jstring result = nullptr;
/*
* TODO(b/33089503) : Create a jobject to represent GnssDebug.
*/
@@ -1736,7 +1734,7 @@ static void android_location_GnssLocationProvider_update_network_state(JNIEnv* e
ALOGE("updateNetworkState failed");
}
- const char *c_apn = env->GetStringUTFChars(apn, NULL);
+ const char *c_apn = env->GetStringUTFChars(apn, nullptr);
result = agnssRilIface->updateNetworkAvailability(available, c_apn);
if (!result.isOk() || !result) {
ALOGE("updateNetworkAvailability failed");
@@ -2019,15 +2017,15 @@ static jboolean android_location_GnssLocationProvider_set_satellite_blacklist(
}
jint *constellation_array = env->GetIntArrayElements(constellations, 0);
- if (NULL == constellation_array) {
- ALOGI("GetIntArrayElements returns NULL.");
+ if (nullptr == constellation_array) {
+ ALOGI("GetIntArrayElements returns nullptr.");
return JNI_FALSE;
}
jsize length = env->GetArrayLength(constellations);
jint *sv_id_array = env->GetIntArrayElements(sv_ids, 0);
- if (NULL == sv_id_array) {
- ALOGI("GetIntArrayElements returns NULL.");
+ if (nullptr == sv_id_array) {
+ ALOGI("GetIntArrayElements returns nullptr.");
return JNI_FALSE;
}
diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp
index d0f173b572c8..ec94e3c92ed8 100644
--- a/services/core/jni/com_android_server_security_VerityUtils.cpp
+++ b/services/core/jni/com_android_server_security_VerityUtils.cpp
@@ -66,6 +66,30 @@ class JavaByteArrayHolder {
jbyte* mElements;
};
+jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteArray digest) {
+#if HAS_FSVERITY
+ const int kSha256Bytes = 32;
+ auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest_disk) + kSha256Bytes);
+ fsverity_digest_disk* data = reinterpret_cast<fsverity_digest_disk*>(raii->getRaw());
+
+ data->digest_algorithm = FS_VERITY_ALG_SHA256;
+ data->digest_size = kSha256Bytes;
+ if (env->GetArrayLength(digest) != kSha256Bytes) {
+ jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid hash size of %d",
+ env->GetArrayLength(digest));
+ return 0;
+ }
+ const jbyte* src = env->GetByteArrayElements(digest, nullptr);
+ memcpy(data->digest, src, kSha256Bytes);
+
+ return raii->release();
+#else
+ LOG_ALWAYS_FATAL("fs-verity is used while not enabled");
+ return 0;
+#endif // HAS_FSVERITY
+}
+
+
jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong fileSize) {
#if HAS_FSVERITY
auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_descriptor));
@@ -122,6 +146,7 @@ jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */,
}
const JNINativeMethod sMethods[] = {
+ { "constructFsveritySignedDataNative", "([B)[B", (void *)constructFsveritySignedData },
{ "constructFsverityDescriptorNative", "(J)[B", (void *)constructFsverityDescriptor },
{ "constructFsverityExtensionNative", "(SI)[B", (void *)constructFsverityExtension },
{ "constructFsverityFooterNative", "(I)[B", (void *)constructFsverityFooter },
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index bbc4f4441294..b1b5a7a49b01 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -243,6 +243,8 @@ public final class SystemServer {
"com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle";
private static final String ACCESSIBILITY_MANAGER_SERVICE_CLASS =
"com.android.server.accessibility.AccessibilityManagerService$Lifecycle";
+ private static final String ADB_SERVICE_CLASS =
+ "com.android.server.adb.AdbService$Lifecycle";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
@@ -1372,6 +1374,15 @@ public final class SystemServer {
traceEnd();
}
+ // Start ADB Debugging Service
+ traceBeginAndSlog("StartAdbService");
+ try {
+ mSystemServiceManager.startService(ADB_SERVICE_CLASS);
+ } catch (Throwable e) {
+ Slog.e(TAG, "Failure starting AdbService");
+ }
+ traceEnd();
+
if (!isWatch) {
traceBeginAndSlog("StartSerialService");
try {
diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
index f85ffc84e788..3979a8e762d3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java
@@ -27,7 +27,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.timeout;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static com.android.server.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_LONG_TIME;
@@ -40,14 +39,15 @@ import static com.android.server.AlarmManagerService.Constants.KEY_MIN_FUTURITY;
import static com.android.server.AlarmManagerService.Constants.KEY_MIN_INTERVAL;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.atLeastOnce;
import android.app.ActivityManager;
import android.app.AlarmManager;
@@ -61,7 +61,6 @@ import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
@@ -92,7 +91,6 @@ public class AlarmManagerServiceTest {
private static final String TEST_CALLING_PACKAGE = "com.android.framework.test-package";
private static final int SYSTEM_UI_UID = 123456789;
private static final int TEST_CALLING_UID = 12345;
- private static final long DEFAULT_TIMEOUT = 5_000;
private AlarmManagerService mService;
@Mock
@@ -126,10 +124,11 @@ public class AlarmManagerServiceTest {
mElapsed = millisElapsed;
}
- synchronized long expire() {
+ synchronized void expire() throws InterruptedException {
mExpired = true;
- notify();
- return mElapsed;
+ notifyAll();
+ // Now wait for the alarm thread to finish execution.
+ wait();
}
}
@@ -146,6 +145,7 @@ public class AlarmManagerServiceTest {
@Override
int waitForAlarm() {
synchronized (mTestTimer) {
+ mTestTimer.notifyAll();
if (!mTestTimer.mExpired) {
try {
mTestTimer.wait();
@@ -268,15 +268,16 @@ public class AlarmManagerServiceTest {
final PendingIntent alarmPi = getNewMockPendingIntent();
setTestAlarm(ELAPSED_REALTIME_WAKEUP, triggerTime, alarmPi);
- mNowElapsedTest = mTestTimer.expire();
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
final ArgumentCaptor<PendingIntent.OnFinished> onFinishedCaptor =
ArgumentCaptor.forClass(PendingIntent.OnFinished.class);
- verify(alarmPi, timeout(DEFAULT_TIMEOUT)).send(any(Context.class), eq(0),
- any(Intent.class), onFinishedCaptor.capture(), any(Handler.class), isNull(), any());
- verify(mWakeLock, timeout(DEFAULT_TIMEOUT)).acquire();
+ verify(alarmPi).send(any(Context.class), eq(0), any(Intent.class),
+ onFinishedCaptor.capture(), any(Handler.class), isNull(), any());
+ verify(mWakeLock).acquire();
onFinishedCaptor.getValue().onSendFinished(alarmPi, null, 0, null, null);
- verify(mWakeLock, timeout(DEFAULT_TIMEOUT)).release();
+ verify(mWakeLock).release();
}
@Test
@@ -351,57 +352,58 @@ public class AlarmManagerServiceTest {
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_WORKING_SET);
- mNowElapsedTest = mTestTimer.expire();
- verify(mUsageStatsManagerInternal, timeout(DEFAULT_TIMEOUT).atLeastOnce())
+
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+
+ verify(mUsageStatsManagerInternal, atLeastOnce())
.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
final long expectedNextTrigger = mNowElapsedTest
+ mService.getMinDelayForBucketLocked(STANDBY_BUCKET_WORKING_SET);
- assertTrue("Incorrect next alarm trigger. Expected " + expectedNextTrigger + " found: "
- + mTestTimer.getElapsed(), pollingCheck(DEFAULT_TIMEOUT,
- () -> (mTestTimer.getElapsed() == expectedNextTrigger)));
+ assertEquals("Incorrect next alarm trigger", expectedNextTrigger, mTestTimer.getElapsed());
}
@Test
- public void testStandbyBucketDelay_frequent() {
+ public void testStandbyBucketDelay_frequent() throws Exception {
setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 5, getNewMockPendingIntent());
setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, getNewMockPendingIntent());
assertEquals(mNowElapsedTest + 5, mTestTimer.getElapsed());
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_FREQUENT);
- mNowElapsedTest = mTestTimer.expire();
- verify(mUsageStatsManagerInternal, timeout(DEFAULT_TIMEOUT).atLeastOnce())
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+
+ verify(mUsageStatsManagerInternal, atLeastOnce())
.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
final long expectedNextTrigger = mNowElapsedTest
+ mService.getMinDelayForBucketLocked(STANDBY_BUCKET_FREQUENT);
- assertTrue("Incorrect next alarm trigger. Expected " + expectedNextTrigger + " found: "
- + mTestTimer.getElapsed(), pollingCheck(DEFAULT_TIMEOUT,
- () -> (mTestTimer.getElapsed() == expectedNextTrigger)));
+ assertEquals("Incorrect next alarm trigger.", expectedNextTrigger, mTestTimer.getElapsed());
}
@Test
- public void testStandbyBucketDelay_rare() {
+ public void testStandbyBucketDelay_rare() throws Exception {
setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 5, getNewMockPendingIntent());
setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 6, getNewMockPendingIntent());
assertEquals(mNowElapsedTest + 5, mTestTimer.getElapsed());
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), anyInt(),
anyLong())).thenReturn(STANDBY_BUCKET_RARE);
- mNowElapsedTest = mTestTimer.expire();
- verify(mUsageStatsManagerInternal, timeout(DEFAULT_TIMEOUT).atLeastOnce())
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+
+ verify(mUsageStatsManagerInternal, atLeastOnce())
.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
eq(UserHandle.getUserId(TEST_CALLING_UID)), anyLong());
final long expectedNextTrigger = mNowElapsedTest
+ mService.getMinDelayForBucketLocked(STANDBY_BUCKET_RARE);
- assertTrue("Incorrect next alarm trigger. Expected " + expectedNextTrigger + " found: "
- + mTestTimer.getElapsed(), pollingCheck(DEFAULT_TIMEOUT,
- () -> (mTestTimer.getElapsed() == expectedNextTrigger)));
+ assertEquals("Incorrect next alarm trigger.", expectedNextTrigger, mTestTimer.getElapsed());
}
@Test
- public void testAlarmRestrictedInBatterSaver() throws PendingIntent.CanceledException {
+ public void testAlarmRestrictedInBatterSaver() throws Exception {
final ArgumentCaptor<AppStateTracker.Listener> listenerArgumentCaptor =
ArgumentCaptor.forClass(AppStateTracker.Listener.class);
verify(mAppStateTracker).addListener(listenerArgumentCaptor.capture());
@@ -416,8 +418,9 @@ public class AlarmManagerServiceTest {
mService.mPendingBackgroundAlarms;
assertNull(restrictedAlarms.get(TEST_CALLING_UID));
- mNowElapsedTest = mTestTimer.expire();
- pollingCheck(DEFAULT_TIMEOUT, () -> (restrictedAlarms.get(TEST_CALLING_UID) != null));
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+ assertNotNull(restrictedAlarms.get(TEST_CALLING_UID));
listenerArgumentCaptor.getValue().unblockAlarmsForUid(TEST_CALLING_UID);
verify(alarmPi).send(any(Context.class), eq(0), any(Intent.class), any(),
@@ -431,25 +434,4 @@ public class AlarmManagerServiceTest {
mMockingSession.finishMocking();
}
}
-
- private boolean pollingCheck(long timeout, Condition condition) {
- final long deadline = SystemClock.uptimeMillis() + timeout;
- boolean interrupted = false;
- while (!condition.check() && SystemClock.uptimeMillis() < deadline) {
- try {
- Thread.sleep(500);
- } catch (InterruptedException ie) {
- interrupted = true;
- }
- }
- if (interrupted) {
- Thread.currentThread().interrupt();
- }
- return condition.check();
- }
-
- @FunctionalInterface
- interface Condition {
- boolean check();
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index 92211ec0b649..7c002995a769 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -118,8 +118,8 @@ public class TrampolineTest {
}
@Test
- public void initialize_forUserSystem_successfullyInitialized() {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ public void initializeService_forUserSystem_successfullyInitialized() {
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
}
@@ -127,29 +127,29 @@ public class TrampolineTest {
// The BackupManagerService can only be initialized by USER_SYSTEM, so we check that if any
// other user trying to initialize it leaves it non-active.
@Test
- public void initialize_forNonUserSystem_nonInitialized() {
- mTrampoline.initialize(NON_USER_SYSTEM);
+ public void initializeService_forNonUserSystem_nonInitialized() {
+ mTrampoline.initializeService(NON_USER_SYSTEM);
assertFalse(mTrampoline.isBackupServiceActive(NON_USER_SYSTEM));
}
@Test
- public void initialize_globallyDisabled_nonInitialized() {
+ public void initializeService_globallyDisabled_nonInitialized() {
TrampolineTestable.sBackupDisabled = true;
TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
- trampoline.initialize(UserHandle.USER_SYSTEM);
+ trampoline.initializeService(UserHandle.USER_SYSTEM);
assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
}
// Verify that BackupManagerService is not initialized if suppress file exists.
@Test
- public void initialize_suppressFileExists_nonInitialized() {
+ public void initializeService_suppressFileExists_nonInitialized() {
when(mSuppressFileMock.exists()).thenReturn(true);
TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
- trampoline.initialize(UserHandle.USER_SYSTEM);
+ trampoline.initializeService(UserHandle.USER_SYSTEM);
assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
}
@@ -229,7 +229,7 @@ public class TrampolineTest {
@Test
public void setBackupServiceActive_makeNonActive_serviceDeletedAndSuppressFileCreated()
throws IOException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
@@ -243,7 +243,7 @@ public class TrampolineTest {
setBackupServiceActive_makeNonActive_serviceDeletedAndSuppressFileCreated_ioExceptionHandled()
throws IOException {
when(mSuppressFileMock.createNewFile()).thenThrow(new IOException());
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
@@ -269,7 +269,7 @@ public class TrampolineTest {
@Test
public void dataChanged_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.dataChanged(PACKAGE_NAME);
verify(mBackupManagerServiceMock).dataChanged(PACKAGE_NAME);
}
@@ -282,7 +282,7 @@ public class TrampolineTest {
@Test
public void clearBackupData_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
verify(mBackupManagerServiceMock).clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
}
@@ -295,7 +295,7 @@ public class TrampolineTest {
@Test
public void agentConnected_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock);
verify(mBackupManagerServiceMock).agentConnected(PACKAGE_NAME, mAgentMock);
}
@@ -308,7 +308,7 @@ public class TrampolineTest {
@Test
public void agentDisconnected_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.agentDisconnected(PACKAGE_NAME);
verify(mBackupManagerServiceMock).agentDisconnected(PACKAGE_NAME);
}
@@ -321,7 +321,7 @@ public class TrampolineTest {
@Test
public void restoreAtInstall_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.restoreAtInstall(PACKAGE_NAME, 123);
verify(mBackupManagerServiceMock).restoreAtInstall(PACKAGE_NAME, 123);
}
@@ -334,7 +334,7 @@ public class TrampolineTest {
@Test
public void setBackupEnabled_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.setBackupEnabled(true);
verify(mBackupManagerServiceMock).setBackupEnabled(true);
}
@@ -347,7 +347,7 @@ public class TrampolineTest {
@Test
public void setAutoRestore_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.setAutoRestore(true);
verify(mBackupManagerServiceMock).setAutoRestore(true);
}
@@ -360,7 +360,7 @@ public class TrampolineTest {
@Test
public void setBackupProvisioned_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.setBackupProvisioned(true);
verify(mBackupManagerServiceMock).setBackupProvisioned(true);
}
@@ -373,7 +373,7 @@ public class TrampolineTest {
@Test
public void isBackupEnabled_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.isBackupEnabled();
verify(mBackupManagerServiceMock).isBackupEnabled();
}
@@ -386,7 +386,7 @@ public class TrampolineTest {
@Test
public void setBackupPassword_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
verify(mBackupManagerServiceMock).setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
}
@@ -399,7 +399,7 @@ public class TrampolineTest {
@Test
public void hasBackupPassword_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.hasBackupPassword();
verify(mBackupManagerServiceMock).hasBackupPassword();
}
@@ -412,7 +412,7 @@ public class TrampolineTest {
@Test
public void backupNow_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.backupNow();
verify(mBackupManagerServiceMock).backupNow();
}
@@ -427,7 +427,7 @@ public class TrampolineTest {
@Test
public void adbBackup_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.adbBackup(mParcelFileDescriptorMock, true, true, true, true, true, true, true,
true,
PACKAGE_NAMES);
@@ -444,7 +444,7 @@ public class TrampolineTest {
@Test
public void fullTransportBackup_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.fullTransportBackup(PACKAGE_NAMES);
verify(mBackupManagerServiceMock).fullTransportBackup(PACKAGE_NAMES);
}
@@ -457,7 +457,7 @@ public class TrampolineTest {
@Test
public void adbRestore_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.adbRestore(mParcelFileDescriptorMock);
verify(mBackupManagerServiceMock).adbRestore(mParcelFileDescriptorMock);
}
@@ -472,7 +472,7 @@ public class TrampolineTest {
@Test
public void acknowledgeFullBackupOrRestore_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD,
mFullBackupRestoreObserverMock);
verify(mBackupManagerServiceMock).acknowledgeAdbBackupOrRestore(123, true, CURRENT_PASSWORD,
@@ -489,7 +489,7 @@ public class TrampolineTest {
public void getCurrentTransport_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.getCurrentTransport()).thenReturn(TRANSPORT_NAME);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransport());
verify(mBackupManagerServiceMock).getCurrentTransport();
@@ -505,7 +505,7 @@ public class TrampolineTest {
public void listAllTransports_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.listAllTransports()).thenReturn(TRANSPORTS);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(TRANSPORTS, mTrampoline.listAllTransports());
verify(mBackupManagerServiceMock).listAllTransports();
}
@@ -521,7 +521,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.listAllTransportComponents()).thenReturn(
TRANSPORT_COMPONENTS);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponents());
verify(mBackupManagerServiceMock).listAllTransportComponents();
}
@@ -536,7 +536,7 @@ public class TrampolineTest {
public void getTransportWhitelist_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist());
verify(mBackupManagerServiceMock).getTransportWhitelist();
}
@@ -552,7 +552,7 @@ public class TrampolineTest {
public void describeTransport_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.updateTransportAttributes(TRANSPORT_COMPONENT_NAME, TRANSPORT_NAME, null,
"Transport Destination", null, "Data Management");
verify(mBackupManagerServiceMock).updateTransportAttributes(TRANSPORT_COMPONENT_NAME,
@@ -567,7 +567,7 @@ public class TrampolineTest {
@Test
public void selectBackupTransport_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.selectBackupTransport(TRANSPORT_NAME);
verify(mBackupManagerServiceMock).selectBackupTransport(TRANSPORT_NAME);
}
@@ -634,7 +634,7 @@ public class TrampolineTest {
@Test
public void selectBackupTransportAsync_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null);
verify(mBackupManagerServiceMock).selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME,
null);
@@ -652,7 +652,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.getConfigurationIntent(TRANSPORT_NAME)).thenReturn(
configurationIntentStub);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(configurationIntentStub, mTrampoline.getConfigurationIntent(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getConfigurationIntent(TRANSPORT_NAME);
}
@@ -668,7 +668,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.getDestinationString(TRANSPORT_NAME)).thenReturn(
DESTINATION_STRING);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(DESTINATION_STRING, mTrampoline.getDestinationString(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getDestinationString(TRANSPORT_NAME);
}
@@ -685,7 +685,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.getDataManagementIntent(TRANSPORT_NAME)).thenReturn(
dataManagementIntent);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(dataManagementIntent, mTrampoline.getDataManagementIntent(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getDataManagementIntent(TRANSPORT_NAME);
}
@@ -701,7 +701,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.getDataManagementLabel(TRANSPORT_NAME)).thenReturn(
DATA_MANAGEMENT_LABEL);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(DATA_MANAGEMENT_LABEL, mTrampoline.getDataManagementLabel(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getDataManagementLabel(TRANSPORT_NAME);
}
@@ -714,7 +714,7 @@ public class TrampolineTest {
@Test
public void beginRestoreSession_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME);
verify(mBackupManagerServiceMock).beginRestoreSession(PACKAGE_NAME, TRANSPORT_NAME);
}
@@ -727,7 +727,7 @@ public class TrampolineTest {
@Test
public void opComplete_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.opComplete(1, 2);
verify(mBackupManagerServiceMock).opComplete(1, 2);
}
@@ -742,7 +742,7 @@ public class TrampolineTest {
public void getAvailableRestoreToken_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.getAvailableRestoreToken(PACKAGE_NAME)).thenReturn(123L);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(123, mTrampoline.getAvailableRestoreToken(PACKAGE_NAME));
verify(mBackupManagerServiceMock).getAvailableRestoreToken(PACKAGE_NAME);
}
@@ -757,7 +757,7 @@ public class TrampolineTest {
public void isAppEligibleForBackup_forwarded() throws RemoteException {
when(mBackupManagerServiceMock.isAppEligibleForBackup(PACKAGE_NAME)).thenReturn(true);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertTrue(mTrampoline.isAppEligibleForBackup(PACKAGE_NAME));
verify(mBackupManagerServiceMock).isAppEligibleForBackup(PACKAGE_NAME);
}
@@ -774,7 +774,7 @@ public class TrampolineTest {
when(mBackupManagerServiceMock.requestBackup(PACKAGE_NAMES, mBackupObserverMock,
mBackupManagerMonitorMock, 123)).thenReturn(456);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertEquals(456, mTrampoline.requestBackup(PACKAGE_NAMES, mBackupObserverMock,
mBackupManagerMonitorMock, 123));
verify(mBackupManagerServiceMock).requestBackup(PACKAGE_NAMES, mBackupObserverMock,
@@ -789,7 +789,7 @@ public class TrampolineTest {
@Test
public void cancelBackups_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.cancelBackups();
verify(mBackupManagerServiceMock).cancelBackups();
}
@@ -805,7 +805,7 @@ public class TrampolineTest {
FullBackupJob fullBackupJob = new FullBackupJob();
when(mBackupManagerServiceMock.beginFullBackup(fullBackupJob)).thenReturn(true);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
assertTrue(mTrampoline.beginFullBackup(fullBackupJob));
verify(mBackupManagerServiceMock).beginFullBackup(fullBackupJob);
}
@@ -818,7 +818,7 @@ public class TrampolineTest {
@Test
public void endFullBackup_forwarded() throws RemoteException {
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.endFullBackup();
verify(mBackupManagerServiceMock).endFullBackup();
}
@@ -829,7 +829,7 @@ public class TrampolineTest {
android.Manifest.permission.DUMP)).thenReturn(
PackageManager.PERMISSION_DENIED);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]);
@@ -853,7 +853,7 @@ public class TrampolineTest {
android.Manifest.permission.DUMP)).thenReturn(
PackageManager.PERMISSION_GRANTED);
- mTrampoline.initialize(UserHandle.USER_SYSTEM);
+ mTrampoline.initializeService(UserHandle.USER_SYSTEM);
mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, null);
diff --git a/services/tests/servicestests/src/com/android/server/inputmethod/InputMethodUtilsTest.java b/services/tests/servicestests/src/com/android/server/inputmethod/InputMethodUtilsTest.java
index 4d0278fe7a07..e4c9cc3c05d9 100644
--- a/services/tests/servicestests/src/com/android/server/inputmethod/InputMethodUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/inputmethod/InputMethodUtilsTest.java
@@ -16,9 +16,6 @@
package com.android.server.inputmethod;
-import static android.view.inputmethod.InputMethodManager.CONTROL_WINDOW_IS_TEXT_EDITOR;
-import static android.view.inputmethod.InputMethodManager.CONTROL_WINDOW_VIEW_HAS_FOCUS;
-
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.in;
import static org.hamcrest.Matchers.not;
@@ -45,6 +42,8 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.inputmethod.StartInputFlags;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -1090,21 +1089,19 @@ public class InputMethodUtilsTest {
assertTrue(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
Build.VERSION_CODES.O_MR1, 0));
assertTrue(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
- Build.VERSION_CODES.O_MR1, CONTROL_WINDOW_VIEW_HAS_FOCUS));
+ Build.VERSION_CODES.O_MR1, StartInputFlags.VIEW_HAS_FOCUS));
assertTrue(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
Build.VERSION_CODES.O_MR1,
- CONTROL_WINDOW_VIEW_HAS_FOCUS | CONTROL_WINDOW_IS_TEXT_EDITOR));
+ StartInputFlags.VIEW_HAS_FOCUS | StartInputFlags.IS_TEXT_EDITOR));
// On P+ devices, SOFT_INPUT_STATE_VISIBLE/SOFT_INPUT_STATE_ALWAYS_VISIBLE are allowed only
// when there is a focused View and its View#onCheckIsTextEditor() returns true.
assertFalse(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
Build.VERSION_CODES.P, 0));
assertFalse(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
- Build.VERSION_CODES.P, CONTROL_WINDOW_VIEW_HAS_FOCUS));
+ Build.VERSION_CODES.P, StartInputFlags.VIEW_HAS_FOCUS));
assertTrue(InputMethodUtils.isSoftInputModeStateVisibleAllowed(
Build.VERSION_CODES.P,
- CONTROL_WINDOW_VIEW_HAS_FOCUS | CONTROL_WINDOW_IS_TEXT_EDITOR));
-
+ StartInputFlags.VIEW_HAS_FOCUS | StartInputFlags.IS_TEXT_EDITOR));
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 047adddd794d..793d6b0639a8 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -61,6 +61,7 @@ public class AppTimeLimitControllerTests {
private static final long TIME_30_MIN = 30 * 60_000L;
private static final long TIME_10_MIN = 10 * 60_000L;
+ private static final long TIME_1_MIN = 10 * 60_000L;
private static final long MAX_OBSERVER_PER_UID = 10;
private static final long MIN_TIME_LIMIT = 4_000L;
@@ -77,7 +78,8 @@ public class AppTimeLimitControllerTests {
PKG_GAME1, PKG_GAME2
};
- private final CountDownLatch mCountDownLatch = new CountDownLatch(1);
+ private CountDownLatch mLimitReachedLatch = new CountDownLatch(1);
+ private CountDownLatch mSessionEndLatch = new CountDownLatch(1);
private AppTimeLimitController mController;
@@ -85,18 +87,24 @@ public class AppTimeLimitControllerTests {
private long mUptimeMillis;
- AppTimeLimitController.OnLimitReachedListener mListener
- = new AppTimeLimitController.OnLimitReachedListener() {
-
- @Override
- public void onLimitReached(int observerId, int userId, long timeLimit, long timeElapsed,
- PendingIntent callbackIntent) {
- mCountDownLatch.countDown();
- }
- };
+ AppTimeLimitController.TimeLimitCallbackListener mListener =
+ new AppTimeLimitController.TimeLimitCallbackListener() {
+ @Override
+ public void onLimitReached(int observerId, int userId, long timeLimit,
+ long timeElapsed,
+ PendingIntent callbackIntent) {
+ mLimitReachedLatch.countDown();
+ }
+
+ @Override
+ public void onSessionEnd(int observerId, int userId, long timeElapsed,
+ PendingIntent callbackIntent) {
+ mSessionEndLatch.countDown();
+ }
+ };
class MyAppTimeLimitController extends AppTimeLimitController {
- MyAppTimeLimitController(AppTimeLimitController.OnLimitReachedListener listener,
+ MyAppTimeLimitController(AppTimeLimitController.TimeLimitCallbackListener listener,
Looper looper) {
super(listener, looper);
}
@@ -107,7 +115,12 @@ public class AppTimeLimitControllerTests {
}
@Override
- protected long getObserverPerUidLimit() {
+ protected long getAppUsageObserverPerUidLimit() {
+ return MAX_OBSERVER_PER_UID;
+ }
+
+ @Override
+ protected long getUsageSessionObserverPerUidLimit() {
return MAX_OBSERVER_PER_UID;
}
@@ -129,188 +142,551 @@ public class AppTimeLimitControllerTests {
mThread.quit();
}
- /** Verify observer is added */
+ /** Verify app usage observer is added */
+ @Test
+ public void testAppUsageObserver_AddObserver() {
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
+ addAppUsageObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID2));
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
+ }
+
+ /** Verify usage session observer is added */
+ @Test
+ public void testUsageSessionObserver_AddObserver() {
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
+ addUsageSessionObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID2));
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
+ }
+
+ /** Verify app usage observer is removed */
@Test
- public void testAddObserver() {
- addObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- assertTrue("Observer wasn't added", hasObserver(OBS_ID1));
- addObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
- assertTrue("Observer wasn't added", hasObserver(OBS_ID2));
- assertTrue("Observer wasn't added", hasObserver(OBS_ID1));
+ public void testAppUsageObserver_RemoveObserver() {
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
+ mController.removeAppUsageObserver(UID, OBS_ID1, USER_ID);
+ assertFalse("Observer wasn't removed", hasAppUsageObserver(UID, OBS_ID1));
}
- /** Verify observer is removed */
+ /** Verify usage session observer is removed */
@Test
- public void testRemoveObserver() {
- addObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- assertTrue("Observer wasn't added", hasObserver(OBS_ID1));
- mController.removeObserver(UID, OBS_ID1, USER_ID);
- assertFalse("Observer wasn't removed", hasObserver(OBS_ID1));
+ public void testUsageSessionObserver_RemoveObserver() {
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
+ mController.removeUsageSessionObserver(UID, OBS_ID1, USER_ID);
+ assertFalse("Observer wasn't removed", hasUsageSessionObserver(UID, OBS_ID1));
}
/** Re-adding an observer should result in only one copy */
@Test
- public void testObserverReAdd() {
- addObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- assertTrue("Observer wasn't added", hasObserver(OBS_ID1));
- addObserver(OBS_ID1, GROUP1, TIME_10_MIN);
+ public void testAppUsageObserver_ObserverReAdd() {
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_10_MIN);
assertTrue("Observer wasn't added",
- mController.getObserverGroup(OBS_ID1, USER_ID).timeLimit == TIME_10_MIN);
- mController.removeObserver(UID, OBS_ID1, USER_ID);
- assertFalse("Observer wasn't removed", hasObserver(OBS_ID1));
+ mController.getAppUsageGroup(UID, OBS_ID1).getTimeLimitMs() == TIME_10_MIN);
+ mController.removeAppUsageObserver(UID, OBS_ID1, USER_ID);
+ assertFalse("Observer wasn't removed", hasAppUsageObserver(UID, OBS_ID1));
+ }
+
+ /** Re-adding an observer should result in only one copy */
+ @Test
+ public void testUsageSessionObserver_ObserverReAdd() {
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_10_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added",
+ mController.getSessionUsageGroup(UID, OBS_ID1).getTimeLimitMs() == TIME_10_MIN);
+ mController.removeUsageSessionObserver(UID, OBS_ID1, USER_ID);
+ assertFalse("Observer wasn't removed", hasUsageSessionObserver(UID, OBS_ID1));
+ }
+
+ /** Different type observers can be registered to the same observerId value */
+ @Test
+ public void testAllObservers_ExclusiveObserverIds() {
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_10_MIN);
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
+ assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
+
+ AppTimeLimitController.UsageGroup appUsageGroup = mController.getAppUsageGroup(UID,
+ OBS_ID1);
+ AppTimeLimitController.UsageGroup sessionUsageGroup = mController.getSessionUsageGroup(UID,
+ OBS_ID1);
+
+ // Verify data still intact
+ assertEquals(TIME_10_MIN, appUsageGroup.getTimeLimitMs());
+ assertEquals(TIME_30_MIN, sessionUsageGroup.getTimeLimitMs());
+ }
+
+ /** Verify that usage across different apps within a group are added up */
+ @Test
+ public void testAppUsageObserver_Accumulation() throws Exception {
+ setTime(0L);
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ startUsage(PKG_SOC1);
+ // Add 10 mins
+ setTime(TIME_10_MIN);
+ stopUsage(PKG_SOC1);
+
+ AppTimeLimitController.UsageGroup group = mController.getAppUsageGroup(UID, OBS_ID1);
+
+ long timeRemaining = group.getTimeLimitMs() - group.getUsageTimeMs();
+ assertEquals(TIME_10_MIN * 2, timeRemaining);
+
+ startUsage(PKG_SOC1);
+ setTime(TIME_10_MIN * 2);
+ stopUsage(PKG_SOC1);
+
+ timeRemaining = group.getTimeLimitMs() - group.getUsageTimeMs();
+ assertEquals(TIME_10_MIN, timeRemaining);
+
+ setTime(TIME_30_MIN);
+
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+
+ // Add a different package in the group
+ startUsage(PKG_GAME1);
+ setTime(TIME_30_MIN + TIME_10_MIN);
+ stopUsage(PKG_GAME1);
+
+ assertEquals(0, group.getTimeLimitMs() - group.getUsageTimeMs());
+ assertTrue(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
}
/** Verify that usage across different apps within a group are added up */
@Test
- public void testAccumulation() throws Exception {
+ public void testUsageSessionObserver_Accumulation() throws Exception {
setTime(0L);
- addObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- moveToForeground(PKG_SOC1);
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ startUsage(PKG_SOC1);
// Add 10 mins
setTime(TIME_10_MIN);
- moveToBackground(PKG_SOC1);
+ stopUsage(PKG_SOC1);
+
+ AppTimeLimitController.UsageGroup group = mController.getSessionUsageGroup(UID, OBS_ID1);
- long timeRemaining = mController.getObserverGroup(OBS_ID1, USER_ID).timeRemaining;
+ long timeRemaining = group.getTimeLimitMs() - group.getUsageTimeMs();
assertEquals(TIME_10_MIN * 2, timeRemaining);
- moveToForeground(PKG_SOC1);
+ startUsage(PKG_SOC1);
setTime(TIME_10_MIN * 2);
- moveToBackground(PKG_SOC1);
+ stopUsage(PKG_SOC1);
- timeRemaining = mController.getObserverGroup(OBS_ID1, USER_ID).timeRemaining;
+ timeRemaining = group.getTimeLimitMs() - group.getUsageTimeMs();
assertEquals(TIME_10_MIN, timeRemaining);
setTime(TIME_30_MIN);
- assertFalse(mCountDownLatch.await(100L, TimeUnit.MILLISECONDS));
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
// Add a different package in the group
- moveToForeground(PKG_GAME1);
+ startUsage(PKG_GAME1);
setTime(TIME_30_MIN + TIME_10_MIN);
- moveToBackground(PKG_GAME1);
+ stopUsage(PKG_GAME1);
- assertEquals(0, mController.getObserverGroup(OBS_ID1, USER_ID).timeRemaining);
- assertTrue(mCountDownLatch.await(100L, TimeUnit.MILLISECONDS));
+ assertEquals(0, group.getTimeLimitMs() - group.getUsageTimeMs());
+ assertTrue(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
}
/** Verify that time limit does not get triggered due to a different app */
@Test
- public void testTimeoutOtherApp() throws Exception {
+ public void testAppUsageObserver_TimeoutOtherApp() throws Exception {
setTime(0L);
- addObserver(OBS_ID1, GROUP1, 4_000L);
- moveToForeground(PKG_SOC2);
- assertFalse(mCountDownLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ addAppUsageObserver(OBS_ID1, GROUP1, 4_000L);
+ startUsage(PKG_SOC2);
+ assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
setTime(6_000L);
- moveToBackground(PKG_SOC2);
- assertFalse(mCountDownLatch.await(100L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC2);
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+ }
+
+ /** Verify that time limit does not get triggered due to a different app */
+ @Test
+ public void testUsageSessionObserver_TimeoutOtherApp() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, 4_000L, 1_000L);
+ startUsage(PKG_SOC2);
+ assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ setTime(6_000L);
+ stopUsage(PKG_SOC2);
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+
}
/** Verify the timeout message is delivered at the right time */
@Test
- public void testTimeout() throws Exception {
+ public void testAppUsageObserver_Timeout() throws Exception {
setTime(0L);
- addObserver(OBS_ID1, GROUP1, 4_000L);
- moveToForeground(PKG_SOC1);
+ addAppUsageObserver(OBS_ID1, GROUP1, 4_000L);
+ startUsage(PKG_SOC1);
setTime(6_000L);
- assertTrue(mCountDownLatch.await(6_000L, TimeUnit.MILLISECONDS));
- moveToBackground(PKG_SOC1);
+ assertTrue(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
// Verify that the observer was removed
- assertFalse(hasObserver(OBS_ID1));
+ assertFalse(hasAppUsageObserver(UID, OBS_ID1));
+ }
+
+ /** Verify the timeout message is delivered at the right time */
+ @Test
+ public void testUsageSessionObserver_Timeout() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, 4_000L, 1_000L);
+ startUsage(PKG_SOC1);
+ setTime(6_000L);
+ assertTrue(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Usage has stopped, Session should end in a second. Verify session end occurs in a second
+ // (+/- 100ms, which is hopefully not too slim a margin)
+ assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
+ // Verify that the observer was not removed
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
}
/** If an app was already running, make sure it is partially counted towards the time limit */
@Test
- public void testAlreadyRunning() throws Exception {
+ public void testAppUsageObserver_AlreadyRunning() throws Exception {
setTime(TIME_10_MIN);
- moveToForeground(PKG_GAME1);
+ startUsage(PKG_GAME1);
setTime(TIME_30_MIN);
- addObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
setTime(TIME_30_MIN + TIME_10_MIN);
- moveToBackground(PKG_GAME1);
- assertFalse(mCountDownLatch.await(1000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_GAME1);
+ assertFalse(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
- moveToForeground(PKG_GAME2);
+ startUsage(PKG_GAME2);
setTime(TIME_30_MIN + TIME_30_MIN);
- moveToBackground(PKG_GAME2);
- assertTrue(mCountDownLatch.await(1000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_GAME2);
+ assertTrue(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
+ // Verify that the observer was removed
+ assertFalse(hasAppUsageObserver(UID, OBS_ID2));
+ }
+
+ /** If an app was already running, make sure it is partially counted towards the time limit */
+ @Test
+ public void testUsageSessionObserver_AlreadyRunning() throws Exception {
+ setTime(TIME_10_MIN);
+ startUsage(PKG_GAME1);
+ setTime(TIME_30_MIN);
+ addUsageSessionObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN, TIME_1_MIN);
+ setTime(TIME_30_MIN + TIME_10_MIN);
+ stopUsage(PKG_GAME1);
+ assertFalse(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
+
+ startUsage(PKG_GAME2);
+ setTime(TIME_30_MIN + TIME_30_MIN);
+ stopUsage(PKG_GAME2);
+ assertTrue(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
+ // Verify that the observer was removed
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID2));
+ }
+
+ /** If watched app is already running, verify the timeout callback happens at the right time */
+ @Test
+ public void testAppUsageObserver_AlreadyRunningTimeout() throws Exception {
+ setTime(0);
+ startUsage(PKG_SOC1);
+ setTime(TIME_10_MIN);
+ // 10 second time limit
+ addAppUsageObserver(OBS_ID1, GROUP_SOC, 10_000L);
+ setTime(TIME_10_MIN + 5_000L);
+ // Shouldn't call back in 6 seconds
+ assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ setTime(TIME_10_MIN + 10_000L);
+ // Should call back by 11 seconds (6 earlier + 5 now)
+ assertTrue(mLimitReachedLatch.await(5_000L, TimeUnit.MILLISECONDS));
// Verify that the observer was removed
- assertFalse(hasObserver(OBS_ID2));
+ assertFalse(hasAppUsageObserver(UID, OBS_ID1));
}
/** If watched app is already running, verify the timeout callback happens at the right time */
@Test
- public void testAlreadyRunningTimeout() throws Exception {
+ public void testUsageSessionObserver_AlreadyRunningTimeout() throws Exception {
setTime(0);
- moveToForeground(PKG_SOC1);
+ startUsage(PKG_SOC1);
setTime(TIME_10_MIN);
// 10 second time limit
- addObserver(OBS_ID1, GROUP_SOC, 10_000L);
+ addUsageSessionObserver(OBS_ID1, GROUP_SOC, 10_000L, 1_000L);
setTime(TIME_10_MIN + 5_000L);
// Shouldn't call back in 6 seconds
- assertFalse(mCountDownLatch.await(6_000L, TimeUnit.MILLISECONDS));
+ assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
setTime(TIME_10_MIN + 10_000L);
// Should call back by 11 seconds (6 earlier + 5 now)
- assertTrue(mCountDownLatch.await(5_000L, TimeUnit.MILLISECONDS));
+ assertTrue(mLimitReachedLatch.await(5_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Usage has stopped, Session should end in a second. Verify session end occurs in a second
+ // (+/- 100ms, which is hopefully not too slim a margin)
+ assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
// Verify that the observer was removed
- assertFalse(hasObserver(OBS_ID1));
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
}
- /** Verify that App Time Limit Controller will limit the number of observerIds */
+ /**
+ * Verify that App Time Limit Controller will limit the number of observerIds for app usage
+ * observers
+ */
@Test
- public void testMaxObserverLimit() throws Exception {
+ public void testAppUsageObserver_MaxObserverLimit() throws Exception {
boolean receivedException = false;
int ANOTHER_UID = UID + 1;
- addObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID2, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID3, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID4, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID5, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID6, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID7, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID8, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID9, GROUP1, TIME_30_MIN);
- addObserver(OBS_ID10, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID2, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID3, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID4, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID5, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID6, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID7, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID8, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID9, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID10, GROUP1, TIME_30_MIN);
// Readding an observer should not cause an IllegalStateException
- addObserver(OBS_ID5, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID5, GROUP1, TIME_30_MIN);
// Adding an observer for a different uid shouldn't cause an IllegalStateException
- mController.addObserver(ANOTHER_UID, OBS_ID11, GROUP1, TIME_30_MIN, null, USER_ID);
+ mController.addAppUsageObserver(ANOTHER_UID, OBS_ID11, GROUP1, TIME_30_MIN, null, USER_ID);
try {
- addObserver(OBS_ID11, GROUP1, TIME_30_MIN);
+ addAppUsageObserver(OBS_ID11, GROUP1, TIME_30_MIN);
} catch (IllegalStateException ise) {
receivedException = true;
}
assertTrue("Should have caused an IllegalStateException", receivedException);
}
- /** Verify that addObserver minimum time limit is one minute */
+ /**
+ * Verify that App Time Limit Controller will limit the number of observerIds for usage session
+ * observers
+ */
@Test
- public void testMinimumTimeLimit() throws Exception {
+ public void testUsageSessionObserver_MaxObserverLimit() throws Exception {
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ boolean receivedException = false;
+ int ANOTHER_UID = UID + 1;
+ addUsageSessionObserver(OBS_ID2, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID3, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID4, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID5, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID6, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID7, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID8, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID9, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ addUsageSessionObserver(OBS_ID10, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ // Readding an observer should not cause an IllegalStateException
+ addUsageSessionObserver(OBS_ID5, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ // Adding an observer for a different uid shouldn't cause an IllegalStateException
+ mController.addUsageSessionObserver(ANOTHER_UID, OBS_ID11, GROUP1, TIME_30_MIN, TIME_1_MIN,
+ null, null, USER_ID);
+ try {
+ addUsageSessionObserver(OBS_ID11, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ } catch (IllegalStateException ise) {
+ receivedException = true;
+ }
+ assertTrue("Should have caused an IllegalStateException", receivedException);
+ }
+
+ /** Verify that addAppUsageObserver minimum time limit is one minute */
+ @Test
+ public void testAppUsageObserver_MinimumTimeLimit() throws Exception {
boolean receivedException = false;
// adding an observer with a one minute time limit should not cause an exception
- addObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT);
+ addAppUsageObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT);
try {
- addObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT - 1);
+ addAppUsageObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT - 1);
} catch (IllegalArgumentException iae) {
receivedException = true;
}
assertTrue("Should have caused an IllegalArgumentException", receivedException);
}
- private void moveToForeground(String packageName) {
- mController.moveToForeground(packageName, "class", USER_ID);
+ /** Verify that addUsageSessionObserver minimum time limit is one minute */
+ @Test
+ public void testUsageSessionObserver_MinimumTimeLimit() throws Exception {
+ boolean receivedException = false;
+ // test also for session observers
+ addUsageSessionObserver(OBS_ID10, GROUP1, MIN_TIME_LIMIT, TIME_1_MIN);
+ try {
+ addUsageSessionObserver(OBS_ID10, GROUP1, MIN_TIME_LIMIT - 1, TIME_1_MIN);
+ } catch (IllegalArgumentException iae) {
+ receivedException = true;
+ }
+ assertTrue("Should have caused an IllegalArgumentException", receivedException);
+ }
+
+ /** Verify that concurrent usage from multiple apps in the same group will counted correctly */
+ @Test
+ public void testAppUsageObserver_ConcurrentUsage() throws Exception {
+ setTime(0L);
+ addAppUsageObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ AppTimeLimitController.UsageGroup group = mController.getAppUsageGroup(UID, OBS_ID1);
+ startUsage(PKG_SOC1);
+ // Add 10 mins
+ setTime(TIME_10_MIN);
+
+ // Add a different package in the group will first package is still in use
+ startUsage(PKG_GAME1);
+ setTime(TIME_10_MIN * 2);
+ // Stop first package usage
+ stopUsage(PKG_SOC1);
+
+ setTime(TIME_30_MIN);
+ stopUsage(PKG_GAME1);
+
+ assertEquals(TIME_30_MIN, group.getUsageTimeMs());
+ assertTrue(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+ }
+
+ /** Verify that concurrent usage from multiple apps in the same group will counted correctly */
+ @Test
+ public void testUsageSessionObserver_ConcurrentUsage() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
+ AppTimeLimitController.UsageGroup group = mController.getSessionUsageGroup(UID, OBS_ID1);
+ startUsage(PKG_SOC1);
+ // Add 10 mins
+ setTime(TIME_10_MIN);
+
+ // Add a different package in the group will first package is still in use
+ startUsage(PKG_GAME1);
+ setTime(TIME_10_MIN * 2);
+ // Stop first package usage
+ stopUsage(PKG_SOC1);
+
+ setTime(TIME_30_MIN);
+ stopUsage(PKG_GAME1);
+
+ assertEquals(TIME_30_MIN, group.getUsageTimeMs());
+ assertTrue(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+ }
+
+ /** Verify that a session will continue if usage starts again within the session threshold */
+ @Test
+ public void testUsageSessionObserver_ContinueSession() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, 10_000L, 2_000L);
+ startUsage(PKG_SOC1);
+ setTime(6_000L);
+ stopUsage(PKG_SOC1);
+ // Wait momentarily, Session should not end
+ assertFalse(mSessionEndLatch.await(1_000L, TimeUnit.MILLISECONDS));
+
+ setTime(7_000L);
+ startUsage(PKG_SOC1);
+ setTime(10_500L);
+ stopUsage(PKG_SOC1);
+ // Total usage time has not reached the limit. Time limit callback should not fire yet
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+
+ setTime(10_600L);
+ startUsage(PKG_SOC1);
+ setTime(12_000L);
+ assertTrue(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Usage has stopped, Session should end in 2 seconds. Verify session end occurs
+ // (+/- 100ms, which is hopefully not too slim a margin)
+ assertFalse(mSessionEndLatch.await(1_900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
+ // Verify that the observer was not removed
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
+ }
+
+ /** Verify that a new session will start if next usage starts after the session threshold */
+ @Test
+ public void testUsageSessionObserver_NewSession() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, 10_000L, 1_000L);
+ startUsage(PKG_SOC1);
+ setTime(6_000L);
+ stopUsage(PKG_SOC1);
+ // Wait for longer than the session threshold. Session end callback should not be triggered
+ // because the usage timelimit hasn't been triggered.
+ assertFalse(mSessionEndLatch.await(1_500L, TimeUnit.MILLISECONDS));
+
+ setTime(7_500L);
+ // This should be the start of a new session
+ startUsage(PKG_SOC1);
+ setTime(16_000L);
+ stopUsage(PKG_SOC1);
+ // Total usage has exceed the timelimit, but current session time has not
+ assertFalse(mLimitReachedLatch.await(100L, TimeUnit.MILLISECONDS));
+
+ setTime(16_100L);
+ startUsage(PKG_SOC1);
+ setTime(18_000L);
+ assertTrue(mLimitReachedLatch.await(2000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Usage has stopped, Session should end in 2 seconds. Verify session end occurs
+ // (+/- 100ms, which is hopefully not too slim a margin)
+ assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
+ // Verify that the observer was not removed
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
+ }
+
+ /** Verify that the callbacks will be triggered for multiple sessions */
+ @Test
+ public void testUsageSessionObserver_RepeatSessions() throws Exception {
+ setTime(0L);
+ addUsageSessionObserver(OBS_ID1, GROUP1, 10_000L, 1_000L);
+ startUsage(PKG_SOC1);
+ setTime(9_000L);
+ stopUsage(PKG_SOC1);
+ // Stutter usage here, to reduce real world time needed trigger limit reached callback
+ startUsage(PKG_SOC1);
+ setTime(11_000L);
+ assertTrue(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ // Usage has stopped, Session should end in 1 seconds. Verify session end occurs
+ // (+/- 100ms, which is hopefully not too slim a margin)
+ assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
+
+ // Rearm the countdown latches
+ mLimitReachedLatch = new CountDownLatch(1);
+ mSessionEndLatch = new CountDownLatch(1);
+
+ // New session start
+ setTime(20_000L);
+ startUsage(PKG_SOC1);
+ setTime(29_000L);
+ stopUsage(PKG_SOC1);
+ startUsage(PKG_SOC1);
+ setTime(31_000L);
+ assertTrue(mLimitReachedLatch.await(2_000L, TimeUnit.MILLISECONDS));
+ stopUsage(PKG_SOC1);
+ assertFalse(mSessionEndLatch.await(900L, TimeUnit.MILLISECONDS));
+ assertTrue(mSessionEndLatch.await(200L, TimeUnit.MILLISECONDS));
+ assertTrue(hasUsageSessionObserver(UID, OBS_ID1));
+ }
+
+ private void startUsage(String packageName) {
+ mController.noteUsageStart(packageName, USER_ID);
+ }
+
+ private void stopUsage(String packageName) {
+ mController.noteUsageStop(packageName, USER_ID);
+ }
+
+ private void addAppUsageObserver(int observerId, String[] packages, long timeLimit) {
+ mController.addAppUsageObserver(UID, observerId, packages, timeLimit, null, USER_ID);
}
- private void moveToBackground(String packageName) {
- mController.moveToBackground(packageName, "class", USER_ID);
+ private void addUsageSessionObserver(int observerId, String[] packages, long timeLimit,
+ long sessionThreshold) {
+ mController.addUsageSessionObserver(UID, observerId, packages, timeLimit, sessionThreshold,
+ null, null, USER_ID);
}
- private void addObserver(int observerId, String[] packages, long timeLimit) {
- mController.addObserver(UID, observerId, packages, timeLimit, null, USER_ID);
+ /** Is there still an app usage observer by that id */
+ private boolean hasAppUsageObserver(int uid, int observerId) {
+ return mController.getAppUsageGroup(uid, observerId) != null;
}
- /** Is there still an observer by that id */
- private boolean hasObserver(int observerId) {
- return mController.getObserverGroup(observerId, USER_ID) != null;
+ /** Is there still an usage session observer by that id */
+ private boolean hasUsageSessionObserver(int uid, int observerId) {
+ return mController.getSessionUsageGroup(uid, observerId) != null;
}
private void setTime(long time) {
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java b/services/tests/servicestests/src/com/android/server/wm/AppTransitionControllerTest.java
index 057f04740198..aa495f7d4515 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppTransitionControllerTest.java
@@ -36,14 +36,14 @@ import org.junit.runner.RunWith;
@SmallTest
@Presubmit
@RunWith(AndroidJUnit4.class)
-public class WindowSurfacePlacerTest extends WindowTestsBase {
+public class AppTransitionControllerTest extends WindowTestsBase {
- private WindowSurfacePlacer mWindowSurfacePlacer;
+ private AppTransitionController mAppTransitionController;
@Before
public void setUp() throws Exception {
super.setUp();
- mWindowSurfacePlacer = new WindowSurfacePlacer(sWm);
+ mAppTransitionController = new AppTransitionController(sWm, mDisplayContent);
}
@Test
@@ -55,10 +55,11 @@ public class WindowSurfacePlacerTest extends WindowTestsBase {
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
translucentOpening.setFillsParent(false);
translucentOpening.setHidden(true);
- sWm.mOpeningApps.add(behind);
- sWm.mOpeningApps.add(translucentOpening);
+ mDisplayContent.mOpeningApps.add(behind);
+ mDisplayContent.mOpeningApps.add(translucentOpening);
assertEquals(WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN,
- mWindowSurfacePlacer.maybeUpdateTransitToTranslucentAnim(TRANSIT_TASK_OPEN));
+ mAppTransitionController.maybeUpdateTransitToTranslucentAnim(
+ TRANSIT_TASK_OPEN));
}
}
@@ -70,9 +71,10 @@ public class WindowSurfacePlacerTest extends WindowTestsBase {
final AppWindowToken translucentClosing = createAppWindowToken(mDisplayContent,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
translucentClosing.setFillsParent(false);
- sWm.mClosingApps.add(translucentClosing);
+ mDisplayContent.mClosingApps.add(translucentClosing);
assertEquals(WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE,
- mWindowSurfacePlacer.maybeUpdateTransitToTranslucentAnim(TRANSIT_TASK_CLOSE));
+ mAppTransitionController.maybeUpdateTransitToTranslucentAnim(
+ TRANSIT_TASK_CLOSE));
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
index 3053c4197f82..ee6fbac3f19f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
@@ -16,22 +16,33 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
import android.content.Context;
+import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
+import android.view.Display;
+import android.view.IApplicationToken;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -43,51 +54,142 @@ import org.junit.runner.RunWith;
@SmallTest
@Presubmit
@RunWith(AndroidJUnit4.class)
-public class AppTransitionTests {
+public class AppTransitionTests extends WindowTestsBase {
- @Rule
- public final WindowManagerServiceRule mRule = new WindowManagerServiceRule();
- private WindowManagerService mWm;
+ private DisplayContent mDc;
@Before
public void setUp() throws Exception {
+ super.setUp();
final Context context = InstrumentationRegistry.getTargetContext();
- mWm = mRule.getWindowManagerService();
+ mDc = sWm.getDefaultDisplayContentLocked();
+ // For unit test, we don't need to test performSurfacePlacement to prevent some
+ // abnormal interaction with surfaceflinger native side.
+ sWm.mRoot = spy(sWm.mRoot);
+ doNothing().when(sWm.mRoot).performSurfacePlacement(anyBoolean());
}
@Test
public void testKeyguardOverride() throws Exception {
- mWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
- mWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
- assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mWm.mAppTransition.getAppTransition());
+ sWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
+ sWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
+ assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mDc.mAppTransition.getAppTransition());
}
@Test
public void testKeyguardKeep() throws Exception {
- mWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
- mWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
- assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mWm.mAppTransition.getAppTransition());
+ sWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
+ sWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
+ assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mDc.mAppTransition.getAppTransition());
}
@Test
public void testForceOverride() throws Exception {
- mWm.prepareAppTransition(TRANSIT_KEYGUARD_UNOCCLUDE, false /* alwaysKeepCurrent */);
- mWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */,
- 0 /* flags */, true /* forceOverride */);
- assertEquals(TRANSIT_ACTIVITY_OPEN, mWm.mAppTransition.getAppTransition());
+ sWm.prepareAppTransition(TRANSIT_KEYGUARD_UNOCCLUDE, false /* alwaysKeepCurrent */);
+ mDc.getController().prepareAppTransition(TRANSIT_ACTIVITY_OPEN,
+ false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */);
+ assertEquals(TRANSIT_ACTIVITY_OPEN, mDc.mAppTransition.getAppTransition());
}
@Test
public void testCrashing() throws Exception {
- mWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
- mWm.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
- assertEquals(TRANSIT_CRASHING_ACTIVITY_CLOSE, mWm.mAppTransition.getAppTransition());
+ sWm.prepareAppTransition(TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */);
+ sWm.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
+ assertEquals(TRANSIT_CRASHING_ACTIVITY_CLOSE, mDc.mAppTransition.getAppTransition());
}
@Test
public void testKeepKeyguard_withCrashing() throws Exception {
- mWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
- mWm.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
- assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mWm.mAppTransition.getAppTransition());
+ sWm.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */);
+ sWm.prepareAppTransition(TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
+ assertEquals(TRANSIT_KEYGUARD_GOING_AWAY, mDc.mAppTransition.getAppTransition());
+ }
+
+ @Test
+ public void testAppTransitionStateForMultiDisplay() throws Exception {
+ // Create 2 displays & presume both display the state is ON for ready to display & animate.
+ final DisplayContent dc1 = createNewDisplayWithController(Display.STATE_ON);
+ final DisplayContent dc2 = createNewDisplayWithController(Display.STATE_ON);
+
+ // Create 2 app window tokens to represent 2 activity window.
+ final WindowTestUtils.TestAppWindowToken token1 = createTestAppWindowToken(dc1,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ final WindowTestUtils.TestAppWindowToken token2 = createTestAppWindowToken(dc2,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+
+ // Set TestAppWindowContainerController & assign first app token state to be good to go.
+ final WindowTestUtils.TestAppWindowContainerController controller1 =
+ createAppWindowController(dc1, token1.appToken);
+ final WindowTestUtils.TestAppWindowContainerController controller2 =
+ createAppWindowController(dc1, token2.appToken);
+ controller1.setContainer(token1);
+ token1.allDrawn = true;
+ token1.startingDisplayed = true;
+ token1.startingMoved = true;
+ controller2.setContainer(token2);
+
+ // Simulate activity resume / finish flows to prepare app transition & set visibility,
+ // make sure transition is set as expected for each display.
+ dc1.getController().prepareAppTransition(TRANSIT_ACTIVITY_OPEN,
+ false /* alwaysKeepCurrent */, 0 /* flags */, false /* forceOverride */);
+ assertEquals(TRANSIT_ACTIVITY_OPEN, dc1.mAppTransition.getAppTransition());
+ dc2.getController().prepareAppTransition(TRANSIT_ACTIVITY_CLOSE,
+ false /* alwaysKeepCurrent */, 0 /* flags */, false /* forceOverride */);
+ assertEquals(TRANSIT_ACTIVITY_CLOSE, dc2.mAppTransition.getAppTransition());
+ // One activity window is visible for resuming & the other activity window is invisible
+ // for finishing in different display.
+ controller1.setVisibility(true, false);
+ controller2.setVisibility(false, false);
+
+ // Make sure each display is in animating stage.
+ assertTrue(dc1.mOpeningApps.size() > 0);
+ assertTrue(dc2.mClosingApps.size() > 0);
+ assertTrue(dc1.isAppAnimating());
+ assertTrue(dc2.isAppAnimating());
+ }
+
+ @Test
+ public void testCleanAppTransitionWhenTaskStackReparent() throws Exception {
+ // Create 2 displays & presume both display the state is ON for ready to display & animate.
+ final DisplayContent dc1 = createNewDisplayWithController(Display.STATE_ON);
+ final DisplayContent dc2 = createNewDisplayWithController(Display.STATE_ON);
+
+ final TaskStack stack1 = createTaskStackOnDisplay(dc1);
+ final Task task1 = createTaskInStack(stack1, 0 /* userId */);
+ final WindowTestUtils.TestAppWindowToken token1 =
+ WindowTestUtils.createTestAppWindowToken(dc1);
+ task1.addChild(token1, 0);
+
+ // Simulate same app is during opening / closing transition set stage.
+ dc1.mClosingApps.add(token1);
+ assertTrue(dc1.mClosingApps.size() > 0);
+
+ dc1.getController().prepareAppTransition(TRANSIT_ACTIVITY_OPEN,
+ false /* alwaysKeepCurrent */, 0 /* flags */, false /* forceOverride */);
+ assertEquals(TRANSIT_ACTIVITY_OPEN, dc1.mAppTransition.getAppTransition());
+ assertTrue(dc1.mAppTransition.isTransitionSet());
+
+ dc1.mOpeningApps.add(token1);
+ assertTrue(dc1.mOpeningApps.size() > 0);
+
+ // Move stack to another display.
+ stack1.getController().reparent(dc2.getDisplayId(), new Rect(), true);
+
+ // Verify if token are cleared from both pending transition list in former display.
+ assertFalse(dc1.mOpeningApps.contains(token1));
+ assertFalse(dc1.mOpeningApps.contains(token1));
+ }
+
+ private WindowTestUtils.TestAppWindowContainerController createAppWindowController(
+ DisplayContent dc, IApplicationToken token) {
+ return createAppWindowController(
+ new WindowTestUtils.TestTaskWindowContainerController(
+ createStackControllerOnDisplay(dc)), token);
+ }
+
+ private WindowTestUtils.TestAppWindowContainerController createAppWindowController(
+ WindowTestUtils.TestTaskWindowContainerController taskController,
+ IApplicationToken token) {
+ return new WindowTestUtils.TestAppWindowContainerController(taskController, token);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index e6e08bb93c8e..d65055cf0e07 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
@@ -90,7 +92,7 @@ public class BoundsAnimationControllerTests extends WindowTestsBase {
private AppTransitionListener mListener;
MockAppTransition(Context context) {
- super(context, sWm);
+ super(context, sWm, mDisplayContent);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 7d19baa9f871..ae92984ebf65 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -85,7 +85,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
@Test
public void testRun() throws Exception {
final WindowState win = createWindow(null /* parent */, TYPE_BASE_APPLICATION, "testWin");
- sWm.mOpeningApps.add(win.mAppToken);
+ mDisplayContent.mOpeningApps.add(win.mAppToken);
try {
final AnimationAdapter adapter = mController.createAnimationAdapter(win.mAppToken,
new Point(50, 100), new Rect(50, 100, 150, 150));
@@ -113,7 +113,7 @@ public class RemoteAnimationControllerTest extends WindowTestsBase {
finishedCaptor.getValue().onAnimationFinished();
verify(mFinishedCallback).onAnimationFinished(eq(adapter));
} finally {
- sWm.mOpeningApps.clear();
+ mDisplayContent.mOpeningApps.clear();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
index 53a1185b4655..cb5c1cd67092 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
@@ -74,7 +74,7 @@ public class TaskStackTests extends WindowTestsBase {
appWindowToken2.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
assertEquals(SCREEN_ORIENTATION_PORTRAIT, stack.getOrientation());
- sWm.mClosingApps.add(appWindowToken2);
+ mDisplayContent.mClosingApps.add(appWindowToken2);
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, stack.getOrientation());
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
index 3ac97027a893..54456fbd6f3b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
@@ -40,50 +40,50 @@ public class UnknownAppVisibilityControllerTest extends WindowTestsBase {
@Before
public void setUp() throws Exception {
super.setUp();
- sWm.mUnknownAppVisibilityController.clear();
+ mDisplayContent.mUnknownAppVisibilityController.clear();
}
@Test
public void testFlow() throws Exception {
final AppWindowToken token = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
- sWm.mUnknownAppVisibilityController.notifyLaunched(token);
- sWm.mUnknownAppVisibilityController.notifyAppResumedFinished(token);
- sWm.mUnknownAppVisibilityController.notifyRelayouted(token);
+ mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(token);
+ mDisplayContent.mUnknownAppVisibilityController.notifyAppResumedFinished(token);
+ mDisplayContent.mUnknownAppVisibilityController.notifyRelayouted(token);
// Make sure our handler processed the message.
Thread.sleep(100);
- assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
+ assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
}
@Test
public void testMultiple() throws Exception {
final AppWindowToken token1 = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
final AppWindowToken token2 = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
- sWm.mUnknownAppVisibilityController.notifyLaunched(token1);
- sWm.mUnknownAppVisibilityController.notifyAppResumedFinished(token1);
- sWm.mUnknownAppVisibilityController.notifyLaunched(token2);
- sWm.mUnknownAppVisibilityController.notifyRelayouted(token1);
- sWm.mUnknownAppVisibilityController.notifyAppResumedFinished(token2);
- sWm.mUnknownAppVisibilityController.notifyRelayouted(token2);
+ mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(token1);
+ mDisplayContent.mUnknownAppVisibilityController.notifyAppResumedFinished(token1);
+ mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(token2);
+ mDisplayContent.mUnknownAppVisibilityController.notifyRelayouted(token1);
+ mDisplayContent.mUnknownAppVisibilityController.notifyAppResumedFinished(token2);
+ mDisplayContent.mUnknownAppVisibilityController.notifyRelayouted(token2);
// Make sure our handler processed the message.
Thread.sleep(100);
- assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
+ assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
}
@Test
public void testClear() throws Exception {
final AppWindowToken token = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
- sWm.mUnknownAppVisibilityController.notifyLaunched(token);
- sWm.mUnknownAppVisibilityController.clear();;
- assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
+ mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(token);
+ mDisplayContent.mUnknownAppVisibilityController.clear();;
+ assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
}
@Test
public void testAppRemoved() throws Exception {
final AppWindowToken token = WindowTestUtils.createTestAppWindowToken(mDisplayContent);
- sWm.mUnknownAppVisibilityController.notifyLaunched(token);
- sWm.mUnknownAppVisibilityController.appRemovedOrHidden(token);
- assertTrue(sWm.mUnknownAppVisibilityController.allResolved());
+ mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(token);
+ mDisplayContent.mUnknownAppVisibilityController.appRemovedOrHidden(token);
+ assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
index 389eba52d88d..012c4be75fe5 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
@@ -33,6 +33,7 @@ import android.content.Context;
import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
+import android.view.Display;
import android.view.InputChannel;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
@@ -114,7 +115,7 @@ public class WindowManagerServiceRule implements TestRule {
runnable.run();
}
return null;
- }).when(atm).notifyKeyguardFlagsChanged(any());
+ }).when(atm).notifyKeyguardFlagsChanged(any(), anyInt());
InputManagerService ims = mock(InputManagerService.class);
// InputChannel is final and can't be mocked.
@@ -142,11 +143,11 @@ public class WindowManagerServiceRule implements TestRule {
mService.onInitReady();
+ final Display display = mService.mDisplayManager.getDisplay(DEFAULT_DISPLAY);
+ final DisplayWindowController dcw = new DisplayWindowController(display, mService);
// Display creation is driven by the ActivityManagerService via ActivityStackSupervisor.
// We emulate those steps here.
- mService.mRoot.createDisplayContent(
- mService.mDisplayManager.getDisplay(DEFAULT_DISPLAY),
- mock(DisplayWindowController.class));
+ mService.mRoot.createDisplayContent(display, dcw);
}
private void removeServices() {
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index d0a81b2ddfb2..dcfe55602e81 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -181,9 +181,12 @@ class WindowTestsBase {
displayContent.removeImmediately();
}
}
+ // Remove app transition & window freeze timeout callbacks to prevent unnecessary
+ // actions after test.
+ sWm.getDefaultDisplayContentLocked().mAppTransition
+ .removeAppTransitionTimeoutCallbacks();
+ sWm.mH.removeMessages(WindowManagerService.H.WINDOW_FREEZE_TIMEOUT);
sWm.mInputMethodTarget = null;
- sWm.mClosingApps.clear();
- sWm.mOpeningApps.clear();
}
// Wait until everything is really cleaned up.
@@ -354,6 +357,32 @@ class WindowTestsBase {
}
}
+ /**
+ * Creates a {@link DisplayContent} with given display state and adds it to the system.
+ *
+ * Unlike {@link #createNewDisplay()} that uses a mock {@link DisplayWindowController} to
+ * initialize {@link DisplayContent}, this method used real controller object when the test
+ * need to verify its related flows.
+ *
+ * @param displayState For initializing the state of the display. See
+ * {@link Display#getState()}.
+ */
+ DisplayContent createNewDisplayWithController(int displayState) {
+ // Leverage main display info & initialize it with display state for given displayId.
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.copyFrom(mDisplayInfo);
+ displayInfo.state = displayState;
+ final int displayId = sNextDisplayId++;
+ final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId,
+ displayInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
+ final DisplayWindowController dcw = new DisplayWindowController(display, sWm);
+ synchronized (sWm.mWindowMap) {
+ // Display creation is driven by DisplayWindowController via ActivityStackSupervisor.
+ // We skip those steps here.
+ return sWm.mRoot.createDisplayContent(display, dcw);
+ }
+ }
+
/** Creates a {@link com.android.server.wm.WindowTestUtils.TestWindowState} */
WindowTestUtils.TestWindowState createWindowState(WindowManager.LayoutParams attrs,
WindowToken token) {
diff --git a/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java b/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java
index 1222b59e92b9..69db38438609 100644
--- a/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java
+++ b/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java
@@ -152,7 +152,7 @@ public class TestHandler extends Handler {
@Override
public int compareTo(MsgInfo o) {
- return (int) (sendTime - o.sendTime);
+ return Long.compare(sendTime, o.sendTime);
}
@Override
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index f5c0603a2417..3266b8b92a19 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -288,7 +288,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false);
when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner);
- when(mPackageManager.getNameForUid(mUid)).thenReturn(PKG);
// write to a test file; the system file isn't readable from tests
mFile = new File(mContext.getCacheDir(), "test.xml");
@@ -1736,8 +1735,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
- public void testGetNotificationChannelFromPrivilegedListener_assistant_noAccess()
- throws Exception {
+ public void testGetNotificationChannelFromPrivilegedListener_assistant_noAccess() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(new ArrayList<>());
when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(false);
@@ -3461,12 +3459,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
ApplicationInfo info = new ApplicationInfo();
info.privateFlags = ApplicationInfo.PRIVATE_FLAG_INSTANT;
when(mPackageManager.getApplicationInfo(anyString(), anyInt(), eq(0))).thenReturn(info);
- when(mPackageManager.getNameForUid(anyInt())).thenReturn("any");
- assertTrue(mService.isCallerInstantApp(45770, 0));
+ assertTrue(mService.isCallerInstantApp("any", 45770, 0));
info.privateFlags = 0;
- assertFalse(mService.isCallerInstantApp(575370, 0));
+ assertFalse(mService.isCallerInstantApp("any", 575370, 0));
}
@Test
@@ -3475,9 +3472,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
info.privateFlags = ApplicationInfo.PRIVATE_FLAG_INSTANT;
when(mPackageManager.getApplicationInfo(anyString(), anyInt(), eq(10))).thenReturn(info);
when(mPackageManager.getApplicationInfo(anyString(), anyInt(), eq(0))).thenReturn(null);
- when(mPackageManager.getNameForUid(anyInt())).thenReturn("any");
- assertTrue(mService.isCallerInstantApp(68638450, 10));
+ assertTrue(mService.isCallerInstantApp("any", 68638450, 10));
}
@Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java
index beff0d11ef3e..95bfa44b5f26 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java
@@ -59,7 +59,7 @@ public class ZenModeExtractorTest extends UiServiceTestCase {
assertFalse(r.isIntercepted());
when(mZenModeHelper.shouldIntercept(any())).thenReturn(true);
- when(mZenModeHelper.getNotificationPolicy()).thenReturn(
+ when(mZenModeHelper.getConsolidatedNotificationPolicy()).thenReturn(
new NotificationManager.Policy(0,0,0));
extractor.process(r);
@@ -74,7 +74,7 @@ public class ZenModeExtractorTest extends UiServiceTestCase {
NotificationRecord r = generateRecord();
when(mZenModeHelper.shouldIntercept(any())).thenReturn(false);
- when(mZenModeHelper.getNotificationPolicy()).thenReturn(
+ when(mZenModeHelper.getConsolidatedNotificationPolicy()).thenReturn(
new NotificationManager.Policy(0,0,0));
extractor.process(r);
@@ -89,7 +89,7 @@ public class ZenModeExtractorTest extends UiServiceTestCase {
NotificationRecord r = generateRecord();
when(mZenModeHelper.shouldIntercept(any())).thenReturn(true);
- when(mZenModeHelper.getNotificationPolicy()).thenReturn(
+ when(mZenModeHelper.getConsolidatedNotificationPolicy()).thenReturn(
new NotificationManager.Policy(0,0,0, SUPPRESSED_EFFECT_PEEK
| SUPPRESSED_EFFECT_NOTIFICATION_LIST));
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
index d3354502f40b..6c125d1648f3 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeFilteringTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
import android.media.AudioAttributes;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenModeConfig;
@@ -121,11 +122,10 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
NotificationRecord r = getNotificationRecord();
when(r.sbn.getPackageName()).thenReturn("android");
when(r.sbn.getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
- ZenModeConfig config = mock(ZenModeConfig.class);
- config.suppressedVisualEffects = NotificationManager.Policy.getAllSuppressedVisualEffects()
- - SUPPRESSED_EFFECT_STATUS_BAR;
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects()
+ - SUPPRESSED_EFFECT_STATUS_BAR);
- assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config, r));
+ assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
}
@Test
@@ -133,10 +133,9 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
NotificationRecord r = getNotificationRecord();
when(r.sbn.getPackageName()).thenReturn("android");
when(r.sbn.getId()).thenReturn(SystemMessage.NOTE_ACCOUNT_CREDENTIAL_PERMISSION);
- ZenModeConfig config = mock(ZenModeConfig.class);
- config.suppressedVisualEffects = NotificationManager.Policy.getAllSuppressedVisualEffects();
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects());
- assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config, r));
+ assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
}
@Test
@@ -144,10 +143,9 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
NotificationRecord r = getNotificationRecord();
when(r.sbn.getPackageName()).thenReturn("android2");
when(r.sbn.getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
- ZenModeConfig config = mock(ZenModeConfig.class);
- config.suppressedVisualEffects = NotificationManager.Policy.getAllSuppressedVisualEffects();
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects());
- assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config, r));
+ assertTrue(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
}
@Test
@@ -155,21 +153,20 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
NotificationRecord r = getNotificationRecord();
when(r.sbn.getPackageName()).thenReturn("android");
when(r.sbn.getId()).thenReturn(SystemMessage.NOTE_ZEN_UPGRADE);
- ZenModeConfig config = mock(ZenModeConfig.class);
- config.suppressedVisualEffects = NotificationManager.Policy.getAllSuppressedVisualEffects();
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects());
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, config, r));
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_ALARMS, config, r));
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, config, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_IMPORTANT_INTERRUPTIONS, policy, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_ALARMS, policy, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, policy, r));
}
@Test
public void testSuppressAnything_yes_ZenModeOff() {
NotificationRecord r = getNotificationRecord();
when(r.sbn.getPackageName()).thenReturn("bananas");
- ZenModeConfig config = mock(ZenModeConfig.class);
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects());
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_OFF, config, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_OFF, policy, r));
}
@Test
@@ -177,11 +174,11 @@ public class ZenModeFilteringTest extends UiServiceTestCase {
NotificationRecord r = getNotificationRecord();
r.setCriticality(CriticalNotificationExtractor.CRITICAL);
when(r.sbn.getPackageName()).thenReturn("bananas");
- ZenModeConfig config = mock(ZenModeConfig.class);
+ Policy policy = new Policy(0, 0, 0, Policy.getAllSuppressedVisualEffects());
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, config, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, policy, r));
r.setCriticality(CriticalNotificationExtractor.CRITICAL_LOW);
- assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, config, r));
+ assertFalse(mZenModeFiltering.shouldIntercept(ZEN_MODE_NO_INTERRUPTIONS, policy, r));
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 13f3e5e7a3ad..b19cc86a3404 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -41,6 +41,7 @@ import static org.mockito.Mockito.when;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -165,7 +166,8 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testZenOff_NoMuteApplied() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_OFF;
- assertTrue(mZenModeHelperSpy.mConfig.allowAlarms);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS |
+ Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
doNothing().when(mZenModeHelperSpy).applyRestrictions(anyBoolean(), anyInt());
@@ -178,8 +180,9 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testZenOn_AllowAlarmsMedia_NoAlarmMediaMuteApplied() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- assertTrue(mZenModeHelperSpy.mConfig.allowAlarms);
- assertTrue(mZenModeHelperSpy.mConfig.allowMedia);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS |
+ Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0, 0);
+
mZenModeHelperSpy.applyRestrictions();
verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(false,
AudioAttributes.USAGE_ALARM);
@@ -190,12 +193,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testZenOn_DisallowAlarmsMedia_AlarmMediaMuteApplied() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- mZenModeHelperSpy.mConfig.allowAlarms = false;
- mZenModeHelperSpy.mConfig.allowMedia = false;
- mZenModeHelperSpy.mConfig.allowSystem = false;
- assertFalse(mZenModeHelperSpy.mConfig.allowAlarms);
- assertFalse(mZenModeHelperSpy.mConfig.allowMedia);
- assertFalse(mZenModeHelperSpy.mConfig.allowSystem);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(true,
AudioAttributes.USAGE_ALARM);
@@ -210,6 +208,8 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testTotalSilence() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_NO_INTERRUPTIONS;
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(Policy.PRIORITY_CATEGORY_ALARMS |
+ Policy.PRIORITY_CATEGORY_MEDIA, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
// Total silence will silence alarms, media and system noises (but not vibrations)
@@ -230,11 +230,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testAlarmsOnly_alarmMediaMuteNotApplied() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_ALARMS;
- mZenModeHelperSpy.mConfig.allowAlarms = false;
- mZenModeHelperSpy.mConfig.allowSystem = false;
- mZenModeHelperSpy.mConfig.allowMedia = false;
- assertFalse(mZenModeHelperSpy.mConfig.allowAlarms);
- assertFalse(mZenModeHelperSpy.mConfig.allowMedia);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
// Alarms only mode will not silence alarms
@@ -257,8 +253,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testAlarmsOnly_callsMuteApplied() {
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_ALARMS;
- mZenModeHelperSpy.mConfig.allowCalls = true;
- assertTrue(mZenModeHelperSpy.mConfig.allowCalls);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
// Alarms only mode will silence calls despite priority-mode config
@@ -272,21 +267,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
public void testAlarmsOnly_allZenConfigToggledCannotBypass_alarmMuteNotApplied() {
// Only audio attributes with SUPPRESIBLE_NEVER can bypass
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_ALARMS;
- mZenModeHelperSpy.mConfig.allowAlarms = false;
- mZenModeHelperSpy.mConfig.allowMedia = false;
- mZenModeHelperSpy.mConfig.allowSystem = false;
- mZenModeHelperSpy.mConfig.allowReminders = false;
- mZenModeHelperSpy.mConfig.allowCalls = false;
- mZenModeHelperSpy.mConfig.allowMessages = false;
- mZenModeHelperSpy.mConfig.allowEvents = false;
- mZenModeHelperSpy.mConfig.allowRepeatCallers= false;
- assertFalse(mZenModeHelperSpy.mConfig.allowAlarms);
- assertFalse(mZenModeHelperSpy.mConfig.allowMedia);
- assertFalse(mZenModeHelperSpy.mConfig.allowReminders);
- assertFalse(mZenModeHelperSpy.mConfig.allowCalls);
- assertFalse(mZenModeHelperSpy.mConfig.allowMessages);
- assertFalse(mZenModeHelperSpy.mConfig.allowEvents);
- assertFalse(mZenModeHelperSpy.mConfig.allowRepeatCallers);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(false,
@@ -298,21 +279,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
// Only audio attributes with SUPPRESIBLE_NEVER can bypass
// with special case USAGE_ASSISTANCE_SONIFICATION
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- mZenModeHelperSpy.mConfig.allowAlarms = false;
- mZenModeHelperSpy.mConfig.allowMedia = false;
- mZenModeHelperSpy.mConfig.allowSystem = false;
- mZenModeHelperSpy.mConfig.allowReminders = false;
- mZenModeHelperSpy.mConfig.allowCalls = false;
- mZenModeHelperSpy.mConfig.allowMessages = false;
- mZenModeHelperSpy.mConfig.allowEvents = false;
- mZenModeHelperSpy.mConfig.allowRepeatCallers= false;
- assertFalse(mZenModeHelperSpy.mConfig.allowAlarms);
- assertFalse(mZenModeHelperSpy.mConfig.allowMedia);
- assertFalse(mZenModeHelperSpy.mConfig.allowReminders);
- assertFalse(mZenModeHelperSpy.mConfig.allowCalls);
- assertFalse(mZenModeHelperSpy.mConfig.allowMessages);
- assertFalse(mZenModeHelperSpy.mConfig.allowEvents);
- assertFalse(mZenModeHelperSpy.mConfig.allowRepeatCallers);
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.applyRestrictions();
for (int usage : AudioAttributes.SDK_USAGES) {
@@ -338,6 +305,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
Settings.Secure.putInt(mContentResolver, Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 1);
Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_SETTINGS_UPDATED, 0);
mZenModeHelperSpy.mIsBootComplete = true;
+ mZenModeHelperSpy.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0);
mZenModeHelperSpy.setZenModeSetting(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
verify(mZenModeHelperSpy, times(1)).createZenUpgradeNotification();
@@ -548,6 +516,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
@Test
public void testSilentRingerSavedInZenOff_startsZenOff() {
AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
+ mZenModeHelperSpy.mConfig = new ZenModeConfig();
mZenModeHelperSpy.mAudioManager = mAudioManager;
// apply zen off multiple times - verify ringer is not set to normal
@@ -568,6 +537,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
mZenModeHelperSpy.mAudioManager = mAudioManager;
mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
+ mZenModeHelperSpy.mConfig = new ZenModeConfig();
// previously set silent ringer
ZenModeHelper.RingerModeDelegate ringerModeDelegate =
@@ -581,7 +551,6 @@ public class ZenModeHelperTest extends UiServiceTestCase {
// apply zen off multiple times - verify ringer is not set to normal
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- mZenModeHelperSpy.mConfig = null; // will evaluate config to zen mode off
for (int i = 0; i < 3; i++) {
// if zen doesn't change, zen should not reapply itself to the ringer
mZenModeHelperSpy.evaluateZenMode("test", true);
@@ -596,6 +565,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
AudioManagerInternal mAudioManager = mock(AudioManagerInternal.class);
mZenModeHelperSpy.mAudioManager = mAudioManager;
mZenModeHelperSpy.mZenMode = Global.ZEN_MODE_OFF;
+ mZenModeHelperSpy.mConfig = new ZenModeConfig();
// previously set silent ringer
ZenModeHelper.RingerModeDelegate ringerModeDelegate =
@@ -609,7 +579,6 @@ public class ZenModeHelperTest extends UiServiceTestCase {
// apply zen off multiple times - verify ringer is not set to normal
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mZenModeHelperSpy.mZenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- mZenModeHelperSpy.mConfig = null; // will evaluate config to zen mode off
for (int i = 0; i < 3; i++) {
// if zen doesn't change, zen should not reapply itself to the ringer
mZenModeHelperSpy.evaluateZenMode("test", true);
diff --git a/services/tests/wmtests/Android.mk b/services/tests/wmtests/Android.mk
index c095ae0dd2ff..dd656c30466e 100644
--- a/services/tests/wmtests/Android.mk
+++ b/services/tests/wmtests/Android.mk
@@ -11,12 +11,18 @@ LOCAL_MODULE_TAGS := tests
# Include all test java files.
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
- $(call all-java-files-under, ../servicestests/utils)
+ $(call all-java-files-under, ../servicestests/utils) \
LOCAL_STATIC_JAVA_LIBRARIES := \
+ frameworks-base-testutils \
+ services.core \
androidx.test.runner \
+ androidx.test.rules \
mockito-target-minus-junit4 \
platform-test-annotations \
+ truth-prebuilt \
+ testables \
+ ub-uiautomator \
LOCAL_JAVA_LIBRARIES := \
android.test.mock \
diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml
index 1fb947309028..bfc775dc01e7 100644
--- a/services/tests/wmtests/AndroidManifest.xml
+++ b/services/tests/wmtests/AndroidManifest.xml
@@ -22,7 +22,27 @@
android:minSdkVersion="1"
android:targetSdkVersion="28" />
- <application android:testOnly="true" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+ <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
+ <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
+ <uses-permission android:name="android.permission.MANAGE_USERS" />
+ <uses-permission android:name="android.permission.STORAGE_INTERNAL" />
+ <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
+ <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
+ <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
+ <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+ <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
+ <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
+
+ <application android:testOnly="true">
+ <activity android:name="com.android.server.am.TaskStackChangedListenerTest$ActivityA" />
+ <activity android:name="com.android.server.am.TaskStackChangedListenerTest$ActivityB" />
+ <activity android:name="com.android.server.am.TaskStackChangedListenerTest$ActivityRequestedOrientationChange" />
+ <activity android:name="com.android.server.am.TaskStackChangedListenerTest$ActivityTaskChangeCallbacks" />
+ <activity android:name="com.android.server.am.TaskStackChangedListenerTest$ActivityTaskDescriptionChange" />
+ <activity android:name="com.android.server.wm.ScreenDecorWindowTests$TestActivity" />
+ </application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityDisplayTests.java
index 0da574239666..e3b9e6f0c438 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityDisplayTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityDisplayTests.java
@@ -32,11 +32,9 @@ import static org.mockito.Mockito.doReturn;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityDisplay} class.
@@ -46,13 +44,10 @@ import org.junit.runner.RunWith;
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityDisplayTests extends ActivityTestsBase {
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
setupActivityTaskManagerService();
}
@@ -60,8 +55,7 @@ public class ActivityDisplayTests extends ActivityTestsBase {
public void testLastFocusedStackIsUpdatedWhenMovingStack() {
// Create a stack at bottom.
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
- final ActivityStack stack = display.createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, !ON_TOP);
+ final ActivityStack stack = new StackBuilder(mSupervisor).setOnTop(!ON_TOP).build();
final ActivityStack prevFocusedStack = display.getFocusedStack();
stack.moveToFront("moveStackToFront");
@@ -140,16 +134,14 @@ public class ActivityDisplayTests extends ActivityTestsBase {
*/
@Test
public void testTopRunningActivity() {
- // Create stack to hold focus.
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
- final ActivityStack emptyStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_STANDARD, true /* onTop */);
-
final KeyguardController keyguard = mSupervisor.getKeyguardController();
- final ActivityStack stack = mSupervisor.getDefaultDisplay().createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true)
- .setStack(stack).build();
+ final ActivityStack stack = new StackBuilder(mSupervisor).build();
+ final ActivityRecord activity = stack.getTopActivity();
+
+ // Create empty stack on top.
+ final ActivityStack emptyStack =
+ new StackBuilder(mSupervisor).setCreateActivity(false).build();
// Make sure the top running activity is not affected when keyguard is not locked.
assertTopRunningActivity(activity, display);
@@ -159,8 +151,8 @@ public class ActivityDisplayTests extends ActivityTestsBase {
assertEquals(activity, display.topRunningActivity());
assertNull(display.topRunningActivity(true /* considerKeyguardState */));
- // Change focus to stack with activity.
- stack.moveToFront("focusChangeToTestStack");
+ // Move stack with activity to top.
+ stack.moveToFront("testStackToFront");
assertEquals(stack, display.getFocusedStack());
assertEquals(activity, display.topRunningActivity());
assertNull(display.topRunningActivity(true /* considerKeyguardState */));
@@ -175,11 +167,10 @@ public class ActivityDisplayTests extends ActivityTestsBase {
// Ensure the show when locked activity is returned.
assertTopRunningActivity(showWhenLockedActivity, display);
- // Change focus back to empty stack.
- emptyStack.moveToFront("focusChangeToEmptyStack");
- assertEquals(emptyStack, display.getFocusedStack());
- // If there is no running activity in focused stack, the running activity in next focusable
- // stack should be returned.
+ // Move empty stack to front. The running activity in focusable stack which below the
+ // empty stack should be returned.
+ emptyStack.moveToFront("emptyStackToFront");
+ assertEquals(stack, display.getFocusedStack());
assertTopRunningActivity(showWhenLockedActivity, display);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/wmtests/src/com/android/server/am/ActivityManagerInternalTest.java
index 8c27e256456f..0e10836ae33d 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -23,30 +23,18 @@ import android.app.ActivityManagerInternal;
import android.os.SystemClock;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* Test class for {@link ActivityManagerInternal}.
*
- * To run the tests, use
- *
- * runtest -c com.android.server.am.ActivityManagerInternalTest frameworks-services
- *
- * or the following steps:
- *
- * Build: m FrameworksServicesTests
- * Install: adb install -r \
- * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
- * Run: adb shell am instrument -e class com.android.server.am.ActivityManagerInternalTest -w \
- * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
+ * Build/Install/Run:
+ * atest WmTests:ActivityManagerInternalTest
*/
-@RunWith(AndroidJUnit4.class)
public class ActivityManagerInternalTest {
private static final int TEST_UID1 = 111;
private static final int TEST_UID2 = 112;
@@ -59,6 +47,7 @@ public class ActivityManagerInternalTest {
private ActivityManagerService mAms;
private ActivityManagerInternal mAmi;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -147,18 +136,19 @@ public class ActivityManagerInternalTest {
private final Object mLock;
private Runnable mRunnable;
- boolean mNotified;
+ public boolean mNotified;
- public CustomThread(Object lock) {
+ CustomThread(Object lock) {
mLock = lock;
}
- public CustomThread(Object lock, Runnable runnable) {
+ CustomThread(Object lock, Runnable runnable) {
super(runnable);
mLock = lock;
mRunnable = runnable;
}
+ @SuppressWarnings("WaitNotInLoop")
@Override
public void run() {
if (mRunnable != null) {
@@ -168,7 +158,7 @@ public class ActivityManagerInternalTest {
try {
mLock.wait();
} catch (InterruptedException e) {
- Thread.currentThread().interrupted();
+ Thread.interrupted();
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/wmtests/src/com/android/server/am/ActivityManagerServiceTest.java
index 060c55d41bea..0ed076375cdc 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -67,14 +67,12 @@ import android.os.SystemClock;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.AppOpsService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -90,21 +88,11 @@ import java.util.function.Function;
/**
* Test class for {@link ActivityManagerService}.
*
- * To run the tests, use
- *
- * runtest -c com.android.server.am.ActivityManagerServiceTest frameworks-services
- *
- * or the following steps:
- *
- * Build: m FrameworksServicesTests
- * Install: adb install -r \
- * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
- * Run: adb shell am instrument -e class com.android.server.am.ActivityManagerServiceTest -w \
- * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
+ * Build/Install/Run:
+ * atest WmTests:ActivityManagerServiceTest
*/
@SmallTest
@FlakyTest(bugId = 113616538)
-@RunWith(AndroidJUnit4.class)
public class ActivityManagerServiceTest {
private static final String TAG = ActivityManagerServiceTest.class.getSimpleName();
@@ -149,6 +137,7 @@ public class ActivityManagerServiceTest {
mHandlerThread.quit();
}
+ @SuppressWarnings("GuardedBy")
@MediumTest
@Test
public void incrementProcStateSeqAndNotifyAppsLocked() throws Exception {
@@ -175,6 +164,7 @@ public class ActivityManagerServiceTest {
true); // expectNotify
// Explicitly setting the seq counter for more verification.
+ // @SuppressWarnings("GuardedBy")
mAms.mProcessList.mProcStateSeqCounter = 42;
// Uid state is not moving from background to foreground or vice versa.
@@ -267,6 +257,7 @@ public class ActivityManagerServiceTest {
return uidRec;
}
+ @SuppressWarnings("GuardedBy")
private void verifySeqCounterAndInteractions(UidRecord uidRec, int prevState, int curState,
int expectedGlobalCounter, int expectedCurProcStateSeq, int expectedBlockState,
boolean expectNotify) throws Exception {
@@ -277,6 +268,7 @@ public class ActivityManagerServiceTest {
uidRec.setCurProcState(curState);
mAms.incrementProcStateSeqAndNotifyAppsLocked();
+ // @SuppressWarnings("GuardedBy")
assertEquals(expectedGlobalCounter, mAms.mProcessList.mProcStateSeqCounter);
assertEquals(expectedCurProcStateSeq, uidRec.curProcStateSeq);
@@ -561,8 +553,8 @@ public class ActivityManagerServiceTest {
ActivityManager.PROCESS_STATE_SERVICE,
ActivityManager.PROCESS_STATE_RECEIVER
};
- final ArrayList<UidRecord.ChangeItem> pendingItemsForUids
- = new ArrayList<>(changesForPendingItems.length);
+ final ArrayList<UidRecord.ChangeItem> pendingItemsForUids =
+ new ArrayList<>(changesForPendingItems.length);
for (int i = 0; i < changesForPendingItems.length; ++i) {
final UidRecord.ChangeItem item = new UidRecord.ChangeItem();
item.uid = i;
@@ -621,7 +613,7 @@ public class ActivityManagerServiceTest {
}
mAms.mPendingUidChanges.addAll(pendingItemsForUids);
mAms.dispatchUidsChanged();
- assertEquals("validateUids should be empty, validateUids: " + mAms.mValidateUids,
+ assertEquals("validateUids should be empty, size=" + mAms.mValidateUids.size(),
0, mAms.mValidateUids.size());
}
@@ -775,7 +767,7 @@ public class ActivityManagerServiceTest {
mAms.mActiveUids.clear();
}
- private class TestHandler extends Handler {
+ private static class TestHandler extends Handler {
private static final long WAIT_FOR_MSG_TIMEOUT_MS = 4000; // 4 sec
private static final long WAIT_FOR_MSG_INTERVAL_MS = 400; // 0.4 sec
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java b/services/tests/wmtests/src/com/android/server/am/ActivityManagerTest.java
index 2dfb3751c021..1215ec401f5b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityManagerTest.java
@@ -27,33 +27,33 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
+import androidx.test.filters.FlakyTest;
+
import org.junit.Before;
import org.junit.Test;
import java.util.List;
-import androidx.test.filters.FlakyTest;
-
/**
* Tests for {@link ActivityManager}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.ActivityManagerTest
+ * atest WmTests:ActivityManagerTest
*/
-@Presubmit
@FlakyTest(detail = "Promote to presubmit if stable")
+@Presubmit
public class ActivityManagerTest {
- private IActivityManager service;
+ private IActivityManager mService;
@Before
public void setUp() throws Exception {
- service = ActivityManager.getService();
+ mService = ActivityManager.getService();
}
@Test
public void testTaskIdsForRunningUsers() throws RemoteException {
- int[] runningUserIds = service.getRunningUserIds();
+ int[] runningUserIds = mService.getRunningUserIds();
assertThat(runningUserIds).isNotEmpty();
for (int userId : runningUserIds) {
testTaskIdsForUser(userId);
@@ -61,7 +61,7 @@ public class ActivityManagerTest {
}
private void testTaskIdsForUser(int userId) throws RemoteException {
- List<?> recentTasks = service.getRecentTasks(100, 0, userId).getList();
+ List<?> recentTasks = mService.getRecentTasks(100, 0, userId).getList();
if (recentTasks != null) {
for (Object elem : recentTasks) {
assertThat(elem).isInstanceOf(RecentTaskInfo.class);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/am/ActivityOptionsTest.java
index d15bff4f6378..f250f55ed803 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityOptionsTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -22,23 +22,22 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import android.app.ActivityOptions;
import android.os.Bundle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
- * atest FrameworksServicesTests:ActivityOptionsTest
+ * Build/Install/Run:
+ * atest WmTests:ActivityOptionsTest
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityOptionsTest {
@Test
@@ -64,12 +63,12 @@ public class ActivityOptionsTest {
assertEquals(Integer.MAX_VALUE, restoredOpts.getLaunchDisplayId());
assertEquals(ACTIVITY_TYPE_STANDARD, restoredOpts.getLaunchActivityType());
assertEquals(WINDOWING_MODE_FULLSCREEN, restoredOpts.getLaunchWindowingMode());
- assertEquals(true, restoredOpts.getAvoidMoveToFront());
+ assertTrue(restoredOpts.getAvoidMoveToFront());
assertEquals(Integer.MAX_VALUE, restoredOpts.getLaunchTaskId());
- assertEquals(true, restoredOpts.getLockTaskMode());
+ assertTrue(restoredOpts.getLockTaskMode());
assertEquals(ROTATION_ANIMATION_ROTATE, restoredOpts.getRotationAnimationHint());
- assertEquals(true, restoredOpts.getTaskOverlay());
- assertEquals(true, restoredOpts.canTaskOverlayResume());
+ assertTrue(restoredOpts.getTaskOverlay());
+ assertTrue(restoredOpts.canTaskOverlayResume());
assertEquals(SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT,
restoredOpts.getSplitScreenCreateMode());
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityRecordTests.java
index ffc7fa26d9a1..72af1841e4d0 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityRecordTests.java
@@ -11,15 +11,11 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
-import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING;
@@ -37,11 +33,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActivityOptions;
@@ -52,60 +44,53 @@ import android.platform.test.annotations.Presubmit;
import android.util.MutableBoolean;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
/**
* Tests for the {@link ActivityRecord} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.ActivityRecordTests
+ * atest WmTests:ActivityRecordTests
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityRecordTests extends ActivityTestsBase {
private TestActivityStack mStack;
private TaskRecord mTask;
private ActivityRecord mActivity;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
setupActivityTaskManagerService();
- mStack = mSupervisor.getDefaultDisplay().createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
- mActivity = new ActivityBuilder(mService).setTask(mTask).build();
+ mStack = new StackBuilder(mSupervisor).build();
+ mTask = mStack.getChildAt(0);
+ mActivity = mTask.getTopActivity();
}
@Test
- public void testStackCleanupOnClearingTask() throws Exception {
+ public void testStackCleanupOnClearingTask() {
mActivity.setTask(null);
assertEquals(mStack.onActivityRemovedFromStackInvocationCount(), 1);
}
@Test
- public void testStackCleanupOnActivityRemoval() throws Exception {
+ public void testStackCleanupOnActivityRemoval() {
mTask.removeActivity(mActivity);
assertEquals(mStack.onActivityRemovedFromStackInvocationCount(), 1);
}
@Test
- public void testStackCleanupOnTaskRemoval() throws Exception {
+ public void testStackCleanupOnTaskRemoval() {
mStack.removeTask(mTask, null /*reason*/, REMOVE_TASK_MODE_MOVING);
// Stack should be gone on task removal.
assertNull(mService.mStackSupervisor.getStack(mStack.mStackId));
}
@Test
- public void testNoCleanupMovingActivityInSameStack() throws Exception {
+ public void testNoCleanupMovingActivityInSameStack() {
final TaskRecord newTask = new TaskBuilder(mService.mStackSupervisor).setStack(mStack)
.build();
mActivity.reparent(newTask, 0, null /*reason*/);
@@ -158,19 +143,19 @@ public class ActivityRecordTests extends ActivityTestsBase {
}
@Test
- public void testPositionLimitedAspectRatioNavBarBottom() throws Exception {
+ public void testPositionLimitedAspectRatioNavBarBottom() {
verifyPositionWithLimitedAspectRatio(NAV_BAR_BOTTOM, new Rect(0, 0, 1000, 2000), 1.5f,
new Rect(0, 0, 1000, 1500));
}
@Test
- public void testPositionLimitedAspectRatioNavBarLeft() throws Exception {
+ public void testPositionLimitedAspectRatioNavBarLeft() {
verifyPositionWithLimitedAspectRatio(NAV_BAR_LEFT, new Rect(0, 0, 2000, 1000), 1.5f,
new Rect(500, 0, 2000, 1000));
}
@Test
- public void testPositionLimitedAspectRatioNavBarRight() throws Exception {
+ public void testPositionLimitedAspectRatioNavBarRight() {
verifyPositionWithLimitedAspectRatio(NAV_BAR_RIGHT, new Rect(0, 0, 2000, 1000), 1.5f,
new Rect(0, 0, 1500, 1000));
}
@@ -187,7 +172,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
}
@Test
- public void testCanBeLaunchedOnDisplay() throws Exception {
+ public void testCanBeLaunchedOnDisplay() {
mService.mSupportsMultiWindow = true;
final ActivityRecord activity = new ActivityBuilder(mService).build();
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityStackSupervisorTests.java
index 2c993d32c20c..a5e8b5706af7 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -26,16 +26,24 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
+import static com.android.server.am.ActivityDisplay.POSITION_TOP;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE;
+
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.contains;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -50,11 +58,9 @@ import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
@@ -62,19 +68,15 @@ import java.util.ArrayList;
* Tests for the {@link ActivityStackSupervisor} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.ActivityStackSupervisorTests
+ * atest WmTests:ActivityStackSupervisorTests
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityStackSupervisorTests extends ActivityTestsBase {
private ActivityStack mFullscreenStack;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
setupActivityTaskManagerService();
mFullscreenStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
@@ -85,7 +87,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* should expect {@code null} to be returned in this case.
*/
@Test
- public void testRestoringInvalidTask() throws Exception {
+ public void testRestoringInvalidTask() {
((TestActivityDisplay) mSupervisor.getDefaultDisplay()).removeAllTasks();
TaskRecord task = mSupervisor.anyTaskForIdLocked(0 /*taskId*/,
MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE, null, false /* onTop */);
@@ -97,7 +99,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* activity stack when a new task is added.
*/
@Test
- public void testReplacingTaskInPinnedStack() throws Exception {
+ public void testReplacingTaskInPinnedStack() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true)
.setStack(mFullscreenStack).build();
final TaskRecord firstTask = firstActivity.getTask();
@@ -151,7 +153,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* Ensures that an activity is removed from the stopping activities list once it is resumed.
*/
@Test
- public void testStoppingActivityRemovedWhenResumed() throws Exception {
+ public void testStoppingActivityRemovedWhenResumed() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true)
.setStack(mFullscreenStack).build();
mSupervisor.mStoppingActivities.add(firstActivity);
@@ -164,8 +166,9 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
/**
* Ensures that waiting results are notified of launches.
*/
+ @SuppressWarnings("SynchronizeOnNonFinalField")
@Test
- public void testReportWaitingActivityLaunchedIfNeeded() throws Exception {
+ public void testReportWaitingActivityLaunchedIfNeeded() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true)
.setStack(mFullscreenStack).build();
@@ -176,23 +179,23 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
mSupervisor.mWaitingActivityLaunched.add(taskToFrontWait);
mSupervisor.reportWaitingActivityLaunchedIfNeeded(firstActivity, START_TASK_TO_FRONT);
- assertTrue(mSupervisor.mWaitingActivityLaunched.isEmpty());
+ assertThat(mSupervisor.mWaitingActivityLaunched).isEmpty();
assertEquals(taskToFrontWait.result, START_TASK_TO_FRONT);
- assertEquals(taskToFrontWait.who, null);
+ assertNull(taskToFrontWait.who);
final WaitResult deliverToTopWait = new WaitResult();
mSupervisor.mWaitingActivityLaunched.add(deliverToTopWait);
mSupervisor.reportWaitingActivityLaunchedIfNeeded(firstActivity,
START_DELIVERED_TO_TOP);
- assertTrue(mSupervisor.mWaitingActivityLaunched.isEmpty());
+ assertThat(mSupervisor.mWaitingActivityLaunched).isEmpty();
assertEquals(deliverToTopWait.result, START_DELIVERED_TO_TOP);
assertEquals(deliverToTopWait.who, firstActivity.realActivity);
}
}
@Test
- public void testApplySleepTokensLocked() throws Exception {
+ public void testApplySleepTokensLocked() {
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
final KeyguardController keyguard = mSupervisor.getKeyguardController();
final ActivityStack stack = mock(ActivityStack.class);
@@ -248,7 +251,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* Verifies that removal of activity with task and stack is done correctly.
*/
@Test
- public void testRemovingStackOnAppCrash() throws Exception {
+ public void testRemovingStackOnAppCrash() {
final ActivityDisplay defaultDisplay = mService.mStackSupervisor.getDefaultDisplay();
final int originalStackCount = defaultDisplay.getChildCount();
final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
@@ -267,7 +270,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
}
@Test
- public void testFocusability() throws Exception {
+ public void testFocusability() {
final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true)
@@ -311,7 +314,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* primary stack.
*/
@Test
- public void testSplitScreenPrimaryChosenWhenTopActivityLaunchedToSecondary() throws Exception {
+ public void testSplitScreenPrimaryChosenWhenTopActivityLaunchedToSecondary() {
// Create primary split-screen stack with a task and an activity.
final ActivityStack primaryStack = mService.mStackSupervisor.getDefaultDisplay()
.createStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
@@ -334,9 +337,9 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* {@link android.app.IActivityTaskManager#resizeDockedStack} as expect.
*/
@Test
- public void testResizeDockedStackForSplitScreenPrimary() throws Exception {
- final Rect TASK_SIZE = new Rect(0, 0, 600, 600);
- final Rect STACK_SIZE = new Rect(0, 0, 300, 300);
+ public void testResizeDockedStackForSplitScreenPrimary() {
+ final Rect taskSize = new Rect(0, 0, 600, 600);
+ final Rect stackSize = new Rect(0, 0, 300, 300);
// Create primary split-screen stack with a task.
final ActivityStack primaryStack = mService.mStackSupervisor.getDefaultDisplay()
@@ -345,29 +348,26 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
final TaskRecord task = new TaskBuilder(mSupervisor).setStack(primaryStack).build();
// Resize dock stack.
- mService.resizeDockedStack(STACK_SIZE, TASK_SIZE, null, null, null);
+ mService.resizeDockedStack(stackSize, taskSize, null, null, null);
// Verify dock stack & its task bounds if is equal as resized result.
- assertEquals(primaryStack.getBounds(), STACK_SIZE);
- assertEquals(task.getBounds(), TASK_SIZE);
+ assertEquals(primaryStack.getBounds(), stackSize);
+ assertEquals(task.getBounds(), taskSize);
}
/**
* Verify that home stack would be moved to front when the top activity is Recents.
*/
@Test
- public void testFindTaskToMoveToFrontWhenRecentsOnTop() throws Exception {
+ public void testFindTaskToMoveToFrontWhenRecentsOnTop() {
// Create stack/task on default display.
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
- final ActivityStack targetStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_STANDARD, false /* onTop */);
- final TaskRecord targetTask = new TaskBuilder(mSupervisor).setStack(targetStack).build();
+ final TestActivityStack targetStack = new StackBuilder(mSupervisor).setOnTop(false).build();
+ final TaskRecord targetTask = targetStack.getChildAt(0);
// Create Recents on top of the display.
- final ActivityStack stack = display.createStack(WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_RECENTS, true /* onTop */);
- final TaskRecord task = new TaskBuilder(mSupervisor).setStack(stack).build();
- new ActivityBuilder(mService).setTask(task).build();
+ final ActivityStack stack =
+ new StackBuilder(mSupervisor).setActivityType(ACTIVITY_TYPE_RECENTS).build();
final String reason = "findTaskToMoveToFront";
mSupervisor.findTaskToMoveToFront(targetTask, 0, ActivityOptions.makeBasic(), reason,
@@ -381,7 +381,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* Recents.
*/
@Test
- public void testFindTaskToMoveToFrontWhenRecentsOnOtherDisplay() throws Exception {
+ public void testFindTaskToMoveToFrontWhenRecentsOnOtherDisplay() {
// Create stack/task on default display.
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
final ActivityStack targetStack = display.createStack(WINDOWING_MODE_FULLSCREEN,
@@ -408,7 +408,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
* the stack is the top focused.
*/
@Test
- public void testResumeActivityWhenNonTopmostStackIsTopFocused() throws Exception {
+ public void testResumeActivityWhenNonTopmostStackIsTopFocused() {
// Create a stack at bottom.
final ActivityDisplay display = mSupervisor.getDefaultDisplay();
final ActivityStack targetStack = spy(display.createStack(WINDOWING_MODE_FULLSCREEN,
@@ -430,4 +430,32 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
verify(targetStack, times(1)).resumeTopActivityUncheckedLocked(
eq(activity), eq(null /* targetOptions */));
}
+
+
+ /**
+ * Tests that home activities can be started on the displays that supports system decorations.
+ */
+ @Test
+ public void testStartHomeOnAllDisplays() throws Exception {
+ // Create secondary displays.
+ final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
+ mSupervisor.addChild(secondDisplay, POSITION_TOP);
+ doReturn(true).when(secondDisplay).supportsSystemDecorations();
+
+ // Create mock tasks and other necessary mocks.
+ TaskBuilder taskBuilder = new TaskBuilder(mService.mStackSupervisor).setCreateStack(false);
+ final TaskRecord.TaskRecordFactory factory = mock(TaskRecord.TaskRecordFactory.class);
+ TaskRecord.setTaskRecordFactory(factory);
+ doAnswer(i -> taskBuilder.build()).when(factory)
+ .create(any(), anyInt(), any(), any(), any(), any());
+ doReturn(true).when(mService.mStackSupervisor)
+ .ensureVisibilityAndConfig(any(), anyInt(), anyBoolean(), anyBoolean());
+ doReturn(true).when(mSupervisor).canStartHomeOnDisplay(any(), anyInt());
+
+ mSupervisor.startHomeOnAllDisplays(0, "testStartHome");
+
+ assertTrue(mSupervisor.getDefaultDisplay().getTopStack().isActivityTypeHome());
+ assertNotNull(secondDisplay.getTopStack());
+ assertTrue(secondDisplay.getTopStack().isActivityTypeHome());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityStackTests.java
index 53f67afb629e..b61e05973248 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityStackTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -27,20 +27,22 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
-import static com.android.server.am.ActivityStack.ActivityState.FINISHING;
import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -52,31 +54,25 @@ import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityStack} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.ActivityStackTests
+ * atest WmTests:ActivityStackTests
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityStackTests extends ActivityTestsBase {
private ActivityDisplay mDefaultDisplay;
private ActivityStack mStack;
private TaskRecord mTask;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
setupActivityTaskManagerService();
mDefaultDisplay = mSupervisor.getDefaultDisplay();
mStack = spy(mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
@@ -85,14 +81,14 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testEmptyTaskCleanupOnRemove() throws Exception {
+ public void testEmptyTaskCleanupOnRemove() {
assertNotNull(mTask.getWindowContainerController());
mStack.removeTask(mTask, "testEmptyTaskCleanupOnRemove", REMOVE_TASK_MODE_DESTROYING);
assertNull(mTask.getWindowContainerController());
}
@Test
- public void testOccupiedTaskCleanupOnRemove() throws Exception {
+ public void testOccupiedTaskCleanupOnRemove() {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
assertNotNull(mTask.getWindowContainerController());
mStack.removeTask(mTask, "testOccupiedTaskCleanupOnRemove", REMOVE_TASK_MODE_DESTROYING);
@@ -100,13 +96,13 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testResumedActivity() throws Exception {
+ public void testResumedActivity() {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
- assertEquals(mStack.getResumedActivity(), null);
+ assertNull(mStack.getResumedActivity());
r.setState(RESUMED, "testResumedActivity");
- assertEquals(mStack.getResumedActivity(), r);
+ assertEquals(r, mStack.getResumedActivity());
r.setState(PAUSING, "testResumedActivity");
- assertEquals(mStack.getResumedActivity(), null);
+ assertNull(mStack.getResumedActivity());
}
@Test
@@ -114,7 +110,7 @@ public class ActivityStackTests extends ActivityTestsBase {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
// Ensure moving task between two stacks updates resumed activity
r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
- assertEquals(mStack.getResumedActivity(), r);
+ assertEquals(r, mStack.getResumedActivity());
final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
@@ -123,8 +119,8 @@ public class ActivityStackTests extends ActivityTestsBase {
false /* animate */, true /* deferResume*/,
"testResumedActivityFromTaskReparenting");
- assertEquals(mStack.getResumedActivity(), null);
- assertEquals(destStack.getResumedActivity(), r);
+ assertNull(mStack.getResumedActivity());
+ assertEquals(r, destStack.getResumedActivity());
}
@Test
@@ -132,7 +128,7 @@ public class ActivityStackTests extends ActivityTestsBase {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
// Ensure moving task between two stacks updates resumed activity
r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
- assertEquals(mStack.getResumedActivity(), r);
+ assertEquals(r, mStack.getResumedActivity());
final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
@@ -141,60 +137,60 @@ public class ActivityStackTests extends ActivityTestsBase {
mTask.removeActivity(r);
destTask.addActivityToTop(r);
- assertEquals(mStack.getResumedActivity(), null);
- assertEquals(destStack.getResumedActivity(), r);
+ assertNull(mStack.getResumedActivity());
+ assertEquals(r, destStack.getResumedActivity());
}
@Test
- public void testPrimarySplitScreenRestoresWhenMovedToBack() throws Exception {
+ public void testPrimarySplitScreenRestoresWhenMovedToBack() {
// Create primary splitscreen stack. This will create secondary stacks and places the
// existing fullscreen stack on the bottom.
final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
// Assert windowing mode.
- assertEquals(primarySplitScreen.getWindowingMode(), WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+ assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
// Move primary to back.
primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
null /* task */);
// Assert that stack is at the bottom.
- assertEquals(mDefaultDisplay.getIndexOf(primarySplitScreen), 0);
+ assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
// Ensure no longer in splitscreen.
- assertEquals(primarySplitScreen.getWindowingMode(), WINDOWING_MODE_FULLSCREEN);
+ assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
// Ensure that the override mode is restored to undefined
- assertEquals(primarySplitScreen.getOverrideWindowingMode(), WINDOWING_MODE_UNDEFINED);
+ assertEquals(WINDOWING_MODE_UNDEFINED, primarySplitScreen.getOverrideWindowingMode());
}
@Test
- public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() throws Exception {
+ public void testPrimarySplitScreenRestoresPreviousWhenMovedToBack() {
// This time, start with a fullscreen activitystack
final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
primarySplitScreen.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
// Assert windowing mode.
- assertEquals(primarySplitScreen.getWindowingMode(), WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
+ assertEquals(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, primarySplitScreen.getWindowingMode());
// Move primary to back.
primarySplitScreen.moveToBack("testPrimarySplitScreenToFullscreenWhenMovedToBack",
- null /* task */);
+ null /* task */);
// Assert that stack is at the bottom.
- assertEquals(mDefaultDisplay.getIndexOf(primarySplitScreen), 0);
+ assertEquals(0, mDefaultDisplay.getIndexOf(primarySplitScreen));
// Ensure that the override mode is restored to what it was (fullscreen)
- assertEquals(primarySplitScreen.getOverrideWindowingMode(), WINDOWING_MODE_FULLSCREEN);
+ assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getOverrideWindowingMode());
}
@Test
- public void testStackInheritsDisplayWindowingMode() throws Exception {
+ public void testStackInheritsDisplayWindowingMode() {
final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
assertEquals(WINDOWING_MODE_UNDEFINED, primarySplitScreen.getOverrideWindowingMode());
@@ -205,9 +201,9 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testStackOverridesDisplayWindowingMode() throws Exception {
+ public void testStackOverridesDisplayWindowingMode() {
final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
- WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
assertEquals(WINDOWING_MODE_FULLSCREEN, primarySplitScreen.getWindowingMode());
assertEquals(WINDOWING_MODE_UNDEFINED, primarySplitScreen.getOverrideWindowingMode());
@@ -221,7 +217,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testStopActivityWhenActivityDestroyed() throws Exception {
+ public void testStopActivityWhenActivityDestroyed() {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
r.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
mStack.moveToFront("testStopActivityWithDestroy");
@@ -231,7 +227,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testFindTaskWithOverlay() throws Exception {
+ public void testFindTaskWithOverlay() {
final ActivityRecord r = new ActivityBuilder(mService)
.setCreateTask(true)
.setStack(mStack)
@@ -247,13 +243,33 @@ public class ActivityStackTests extends ActivityTestsBase {
new ActivityStackSupervisor.FindTaskResult();
mStack.findTaskLocked(r, result);
- assertEquals(task.getTopActivity(false /* includeOverlays */), r);
- assertEquals(task.getTopActivity(true /* includeOverlays */), taskOverlay);
+ assertEquals(r, task.getTopActivity(false /* includeOverlays */));
+ assertEquals(taskOverlay, task.getTopActivity(true /* includeOverlays */));
assertNotNull(result.mRecord);
}
@Test
- public void testShouldBeVisible_Fullscreen() throws Exception {
+ public void testMoveStackToBackIncludingParent() {
+ final ActivityDisplay display = addNewActivityDisplayAt(ActivityDisplay.POSITION_TOP);
+ final ActivityStack stack1 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final ActivityStack stack2 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ // Do not move display to back because there is still another stack.
+ stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
+ verify(stack2.getWindowContainerController()).positionChildAtBottom(any(),
+ eq(false) /* includingParents */);
+
+ // Also move display to back because there is only one stack left.
+ display.removeChild(stack1);
+ stack2.moveToBack("testMoveStackToBackIncludingParent", stack2.topTask());
+ verify(stack2.getWindowContainerController()).positionChildAtBottom(any(),
+ eq(true) /* includingParents */);
+ }
+
+ @Test
+ public void testShouldBeVisible_Fullscreen() {
final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
@@ -278,14 +294,16 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testShouldBeVisible_SplitScreen() throws Exception {
+ public void testShouldBeVisible_SplitScreen() {
final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
// Home stack should always be fullscreen for this test.
homeStack.setSupportsSplitScreen(false);
- final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(mDefaultDisplay,
+ final TestActivityStack splitScreenPrimary =
+ createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(mDefaultDisplay,
+ final TestActivityStack splitScreenSecondary =
+ createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
// Home stack shouldn't be visible if both halves of split-screen are opaque.
@@ -301,7 +319,8 @@ public class ActivityStackTests extends ActivityTestsBase {
assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
- final TestActivityStack splitScreenSecondary2 = createStackForShouldBeVisibleTest(mDefaultDisplay,
+ final TestActivityStack splitScreenSecondary2 =
+ createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
// First split-screen secondary shouldn't be visible behind another opaque split-split
// secondary.
@@ -344,7 +363,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testShouldBeVisible_Finishing() throws Exception {
+ public void testShouldBeVisible_Finishing() {
final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
final TestActivityStack translucentStack = createStackForShouldBeVisibleTest(
@@ -361,14 +380,12 @@ public class ActivityStackTests extends ActivityTestsBase {
translucentStack.topRunningActivityLocked();
topRunningTranslucentActivity.finishing = true;
- // Home shouldn't be visible since its activity is marked as finishing and it isn't the top
- // of the stack list.
- assertFalse(homeStack.shouldBeVisible(null /* starting */));
+ // Home stack should be visible even there are no running activities.
+ assertTrue(homeStack.shouldBeVisible(null /* starting */));
// Home should be visible if we are starting an activity within it.
assertTrue(homeStack.shouldBeVisible(topRunningHomeActivity /* starting */));
- // The translucent stack should be visible since it is the top of the stack list even though
- // it has its activity marked as finishing.
- assertTrue(translucentStack.shouldBeVisible(null /* starting */));
+ // The translucent stack shouldn't be visible since its activity marked as finishing.
+ assertFalse(translucentStack.shouldBeVisible(null /* starting */));
}
@Test
@@ -385,9 +402,9 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure that we don't move the home stack if it is already behind the top fullscreen stack
int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack);
+ assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
- assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
+ assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
}
@Test
@@ -404,9 +421,9 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure that we don't move the home stack if it is already behind the top fullscreen stack
int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack);
+ assertEquals(fullscreenStack, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
- assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
+ assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
}
@Test
@@ -423,9 +440,9 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure we don't move the home stack if it is already on top
int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == null);
+ assertNull(mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
- assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
+ assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
}
@Test
@@ -449,13 +466,14 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
// pinned stack
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+ assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
+ assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
}
@Test
- public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
+ public void
+ testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
mDefaultDisplay.removeChild(mStack);
final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
@@ -473,9 +491,9 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure that we move the home stack behind the bottom most non-translucent fullscreen
// stack
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+ assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+ assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
}
@Test
@@ -498,7 +516,7 @@ public class ActivityStackTests extends ActivityTestsBase {
// Ensure we don't move the home stack behind itself
int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
mDefaultDisplay.moveStackBehindStack(homeStack, homeStack);
- assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
+ assertEquals(homeStackIndex, mDefaultDisplay.getIndexOf(homeStack));
}
@Test
@@ -521,13 +539,13 @@ public class ActivityStackTests extends ActivityTestsBase {
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack1);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+ assertEquals(fullscreenStack1, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
+ assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack4);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack4);
+ assertEquals(fullscreenStack4, mDefaultDisplay.getStackAbove(homeStack));
mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
+ assertEquals(fullscreenStack2, mDefaultDisplay.getStackAbove(homeStack));
}
@Test
@@ -536,7 +554,7 @@ public class ActivityStackTests extends ActivityTestsBase {
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- assertTrue(mDefaultDisplay.getStackAbove(homeStack) == pinnedStack);
+ assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(homeStack));
final TestActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest(
mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
@@ -544,13 +562,13 @@ public class ActivityStackTests extends ActivityTestsBase {
alwaysOnTopStack.setAlwaysOnTop(true);
assertTrue(alwaysOnTopStack.isAlwaysOnTop());
// Ensure (non-pinned) always on top stack is put below pinned stack.
- assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack) == pinnedStack);
+ assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack));
final TestActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest(
mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
true /* onTop */);
// Ensure non always on top stack is put below always on top stacks.
- assertTrue(mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack) == alwaysOnTopStack);
+ assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack));
final TestActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest(
mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
@@ -558,25 +576,25 @@ public class ActivityStackTests extends ActivityTestsBase {
alwaysOnTopStack2.setAlwaysOnTop(true);
assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
// Ensure newly created always on top stack is placed above other all always on top stacks.
- assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == pinnedStack);
+ assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
alwaysOnTopStack2.setAlwaysOnTop(false);
// Ensure, when always on top is turned off for a stack, the stack is put just below all
// other always on top stacks.
- assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == alwaysOnTopStack);
+ assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
alwaysOnTopStack2.setAlwaysOnTop(true);
// Ensure always on top state changes properly when windowing mode changes.
alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
assertFalse(alwaysOnTopStack2.isAlwaysOnTop());
- assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == alwaysOnTopStack);
+ assertEquals(alwaysOnTopStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FREEFORM);
assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
- assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == pinnedStack);
+ assertEquals(pinnedStack, mDefaultDisplay.getStackAbove(alwaysOnTopStack2));
}
@Test
- public void testSplitScreenMoveToFront() throws Exception {
+ public void testSplitScreenMoveToFront() {
final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
true /* onTop */);
@@ -601,6 +619,7 @@ public class ActivityStackTests extends ActivityTestsBase {
assertFalse(assistantStack.shouldBeVisible(null /* starting */));
}
+ @SuppressWarnings("TypeParameterUnusedInFormals")
private <T extends ActivityStack> T createStackForShouldBeVisibleTest(
ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
final T stack;
@@ -621,7 +640,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testFinishDisabledPackageActivities() throws Exception {
+ public void testFinishDisabledPackageActivities() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
@@ -630,17 +649,17 @@ public class ActivityStackTests extends ActivityTestsBase {
secondActivity.mTaskOverlay = true;
secondActivity.app = null;
- assertEquals(mTask.mActivities.size(), 2);
+ assertEquals(2, mTask.mActivities.size());
mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName, null,
true /* doit */, true /* evenPersistent */, UserHandle.USER_ALL);
- assertTrue(mTask.mActivities.isEmpty());
- assertTrue(mStack.getAllTasks().isEmpty());
+ assertThat(mTask.mActivities).isEmpty();
+ assertThat(mStack.getAllTasks()).isEmpty();
}
@Test
- public void testHandleAppDied() throws Exception {
+ public void testHandleAppDied() {
final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
@@ -653,12 +672,12 @@ public class ActivityStackTests extends ActivityTestsBase {
// second activity will be immediately removed as it has no state.
secondActivity.haveState = false;
- assertEquals(mTask.mActivities.size(), 2);
+ assertEquals(2, mTask.mActivities.size());
mStack.handleAppDiedLocked(secondActivity.app);
- assertTrue(mTask.mActivities.isEmpty());
- assertTrue(mStack.getAllTasks().isEmpty());
+ assertThat(mTask.mActivities).isEmpty();
+ assertThat(mStack.getAllTasks()).isEmpty();
}
@Test
@@ -672,9 +691,10 @@ public class ActivityStackTests extends ActivityTestsBase {
// There is still an activity1 in stack1 so the activity2 should be added to finishing list
// that will be destroyed until idle.
+ stack2.getTopActivity().visible = true;
final ActivityRecord activity2 = finishCurrentActivity(stack2);
- assertEquals(FINISHING, activity2.getState());
- assertTrue(mSupervisor.mFinishingActivities.contains(activity2));
+ assertEquals(STOPPING, activity2.getState());
+ assertThat(mSupervisor.mStoppingActivities).contains(activity2);
// The display becomes empty. Since there is no next activity to be idle, the activity
// should be destroyed immediately with updating configuration to restore original state.
@@ -695,7 +715,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testShouldSleepActivities() throws Exception {
+ public void testShouldSleepActivities() {
// When focused activity and keyguard is going away, we should not sleep regardless
// of the display state
verifyShouldSleepActivities(true /* focusedStack */, true /*keyguardGoingAway*/,
@@ -713,7 +733,7 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
- public void testStackOrderChangedOnRemoveStack() throws Exception {
+ public void testStackOrderChangedOnRemoveStack() {
StackOrderChangedListener listener = new StackOrderChangedListener();
mDefaultDisplay.registerStackOrderChangedListener(listener);
try {
@@ -721,11 +741,11 @@ public class ActivityStackTests extends ActivityTestsBase {
} finally {
mDefaultDisplay.unregisterStackOrderChangedListener(listener);
}
- assertTrue(listener.changed);
+ assertTrue(listener.mChanged);
}
@Test
- public void testStackOrderChangedOnAddPositionStack() throws Exception {
+ public void testStackOrderChangedOnAddPositionStack() {
mDefaultDisplay.removeChild(mStack);
StackOrderChangedListener listener = new StackOrderChangedListener();
@@ -735,11 +755,11 @@ public class ActivityStackTests extends ActivityTestsBase {
} finally {
mDefaultDisplay.unregisterStackOrderChangedListener(listener);
}
- assertTrue(listener.changed);
+ assertTrue(listener.mChanged);
}
@Test
- public void testStackOrderChangedOnPositionStack() throws Exception {
+ public void testStackOrderChangedOnPositionStack() {
StackOrderChangedListener listener = new StackOrderChangedListener();
try {
final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
@@ -750,7 +770,7 @@ public class ActivityStackTests extends ActivityTestsBase {
} finally {
mDefaultDisplay.unregisterStackOrderChangedListener(listener);
}
- assertTrue(listener.changed);
+ assertTrue(listener.mChanged);
}
private void verifyShouldSleepActivities(boolean focusedStack,
@@ -766,12 +786,13 @@ public class ActivityStackTests extends ActivityTestsBase {
assertEquals(expected, mStack.shouldSleepActivities());
}
- private class StackOrderChangedListener implements ActivityDisplay.OnStackOrderChangedListener {
- boolean changed = false;
+ private static class StackOrderChangedListener
+ implements ActivityDisplay.OnStackOrderChangedListener {
+ public boolean mChanged = false;
@Override
public void onStackOrderChanged() {
- changed = true;
+ mChanged = true;
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityStartControllerTests.java
index e1ebbcf8f653..80b72e39738a 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityStartControllerTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -32,13 +32,12 @@ import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.ActivityStackSupervisor.PendingActivityLaunch;
import com.android.server.am.ActivityStarter.Factory;
+import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.Random;
@@ -46,20 +45,17 @@ import java.util.Random;
* Tests for the {@link ActivityStartController} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:ActivityStartControllerTests
+ * atest WmTests:ActivityStartControllerTests
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityStartControllerTests extends ActivityTestsBase {
- private ActivityTaskManagerService mService;
private ActivityStartController mController;
private Factory mFactory;
private ActivityStarter mStarter;
- @Override
+ @Before
public void setUp() throws Exception {
- super.setUp();
mService = createActivityTaskManagerService();
mFactory = mock(Factory.class);
mController = new ActivityStartController(mService, mService.mStackSupervisor, mFactory);
@@ -100,7 +96,7 @@ public class ActivityStartControllerTests extends ActivityTestsBase {
* Ensures instances are recycled after execution.
*/
@Test
- public void testRecycling() throws Exception {
+ public void testRecycling() {
final Intent intent = new Intent();
final ActivityStarter optionStarter = new ActivityStarter(mController, mService,
mService.mStackSupervisor, mock(ActivityStartInterceptor.class));
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java b/services/tests/wmtests/src/com/android/server/am/ActivityStartInterceptorTest.java
index 270d394ead34..27e34037fa0d 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityStartInterceptorTest.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2017, The Android Open Source Project
+ * Copyright (C) 2017 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
+ * 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,
@@ -60,10 +60,10 @@ import org.mockito.MockitoAnnotations;
* Unit tests for {@link ActivityStartInterceptorTest}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.ActivityStartInterceptorTest
+ * atest WmTests:ActivityStartInterceptorTest
*/
-@Presubmit
@SmallTest
+@Presubmit
public class ActivityStartInterceptorTest {
private static final int TEST_USER_ID = 1;
private static final int TEST_REAL_CALLING_UID = 2;
@@ -133,8 +133,8 @@ public class ActivityStartInterceptorTest {
// Mock KeyguardManager
when(mContext.getSystemService(Context.KEYGUARD_SERVICE)).thenReturn(mKeyguardManager);
when(mKeyguardManager.createConfirmDeviceCredentialIntent(
- nullable(CharSequence.class), nullable(CharSequence.class), eq(TEST_USER_ID))).
- thenReturn(CONFIRM_CREDENTIALS_INTENT);
+ nullable(CharSequence.class), nullable(CharSequence.class), eq(TEST_USER_ID)))
+ .thenReturn(CONFIRM_CREDENTIALS_INTENT);
// Mock PackageManager
when(mService.getPackageManager()).thenReturn(mPackageManager);
@@ -221,8 +221,8 @@ public class ActivityStartInterceptorTest {
assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
// THEN the returned intent is the harmful app warning intent
- assertTrue(mInterceptor.mIntent.getComponent().getClassName().equals(
- HarmfulAppWarningActivity.class.getName()));
+ assertEquals(HarmfulAppWarningActivity.class.getName(),
+ mInterceptor.mIntent.getComponent().getClassName());
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/am/ActivityStarterTests.java
index fb11a04ece50..9aa98af5c81b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityStarterTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -40,8 +40,9 @@ import static com.android.server.am.ActivityDisplay.POSITION_BOTTOM;
import static com.android.server.am.ActivityDisplay.POSITION_TOP;
import static com.android.server.am.ActivityTaskManagerService.ANIMATE;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -74,23 +75,21 @@ import android.service.voice.IVoiceInteractionSession;
import android.view.Gravity;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
import com.android.server.am.TaskRecord.TaskRecordFactory;
+import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityStarter} class.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:ActivityStarterTests
+ * atest WmTests:ActivityStarterTests
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ActivityStarterTests extends ActivityTestsBase {
private ActivityStarter mStarter;
private ActivityStartController mController;
@@ -112,9 +111,8 @@ public class ActivityStarterTests extends ActivityTestsBase {
private static final int FAKE_REAL_CALLING_UID = 667;
private static final String FAKE_CALLING_PACKAGE = "com.whatever.dude";
- @Override
+ @Before
public void setUp() throws Exception {
- super.setUp();
setupActivityTaskManagerService();
mController = mock(ActivityStartController.class);
mActivityMetricsLogger = mock(ActivityMetricsLogger.class);
@@ -124,7 +122,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
}
@Test
- public void testUpdateLaunchBounds() throws Exception {
+ public void testUpdateLaunchBounds() {
// When in a non-resizeable stack, the task bounds should be updated.
final TaskRecord task = new TaskBuilder(mService.mStackSupervisor)
.setStack(mService.mStackSupervisor.getDefaultDisplay().createStack(
@@ -133,7 +131,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
final Rect bounds = new Rect(10, 10, 100, 100);
mStarter.updateBounds(task, bounds);
- assertEquals(task.getOverrideBounds(), bounds);
+ assertEquals(bounds, task.getOverrideBounds());
assertEquals(new Rect(), task.getStack().getOverrideBounds());
// When in a resizeable stack, the stack bounds should be updated as well.
@@ -141,7 +139,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
.setStack(mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */))
.build();
- assertTrue(task2.getStack() instanceof PinnedActivityStack);
+ assertThat((Object) task2.getStack()).isInstanceOf(PinnedActivityStack.class);
mStarter.updateBounds(task2, bounds);
verify(mService, times(1)).resizeStack(eq(task2.getStack().mStackId),
@@ -149,15 +147,15 @@ public class ActivityStarterTests extends ActivityTestsBase {
// In the case of no animation, the stack and task bounds should be set immediately.
if (!ANIMATE) {
- assertEquals(task2.getStack().getOverrideBounds(), bounds);
- assertEquals(task2.getOverrideBounds(), bounds);
+ assertEquals(bounds, task2.getStack().getOverrideBounds());
+ assertEquals(bounds, task2.getOverrideBounds());
} else {
- assertEquals(task2.getOverrideBounds(), new Rect());
+ assertEquals(new Rect(), task2.getOverrideBounds());
}
}
@Test
- public void testStartActivityPreconditions() throws Exception {
+ public void testStartActivityPreconditions() {
verifyStartActivityPreconditions(PRECONDITION_NO_CALLER_APP, START_PERMISSION_DENIED);
verifyStartActivityPreconditions(PRECONDITION_NO_INTENT_COMPONENT,
START_INTENT_NOT_RESOLVED);
@@ -211,7 +209,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
final WindowProcessController wpc =
containsConditions(preconditions, PRECONDITION_NO_CALLER_APP)
? null : new WindowProcessController(
- service, mock(ApplicationInfo.class),null, 0, -1, null, null);
+ service, mock(ApplicationInfo.class), null, 0, -1, null, null);
doReturn(wpc).when(service).getProcessController(anyObject());
final Intent intent = new Intent();
@@ -250,7 +248,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
anyInt(), anyInt(), anyInt(), anyInt(), any());
}
- if (containsConditions(preconditions,PRECONDITION_CANNOT_START_ANY_ACTIVITY)) {
+ if (containsConditions(preconditions, PRECONDITION_CANNOT_START_ANY_ACTIVITY)) {
doReturn(false).when(service.mStackSupervisor).checkStartAnyActivityPermission(
any(), any(), any(), anyInt(), anyInt(), anyInt(), any(),
anyBoolean(), anyBoolean(), any(), any(), any());
@@ -448,7 +446,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
final int result = starter.setReason("testSplitScreenDeliverToTop").execute();
// Ensure result is delivering intent to top.
- assertEquals(result, START_DELIVERED_TO_TOP);
+ assertEquals(START_DELIVERED_TO_TOP, result);
}
/**
@@ -480,7 +478,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
final int result = starter.setReason("testSplitScreenMoveToFront").execute();
// Ensure result is moving task to front.
- assertEquals(result, START_TASK_TO_FRONT);
+ assertEquals(START_TASK_TO_FRONT, result);
}
/**
@@ -506,7 +504,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
private void assertNoTasks(ActivityDisplay display) {
for (int i = display.getChildCount() - 1; i >= 0; --i) {
final ActivityStack stack = display.getChildAt(i);
- assertTrue(stack.getAllTasks().isEmpty());
+ assertThat(stack.getAllTasks()).isEmpty();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/am/ActivityTestsBase.java
index 094241e98a8d..dbe43011a51f 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/am/ActivityTestsBase.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -24,6 +24,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMAR
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
@@ -39,14 +41,6 @@ import static org.mockito.Mockito.spy;
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
-import android.content.pm.PackageManagerInternal;
-import com.android.server.uri.UriGrantsManagerInternal;
-import com.android.server.wm.ActivityTaskManagerInternal;
-import com.android.server.wm.DisplayWindowController;
-
-import org.junit.Rule;
-import org.mockito.invocation.InvocationOnMock;
-
import android.app.IApplicationThread;
import android.content.ComponentName;
import android.content.Context;
@@ -54,6 +48,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageManagerInternal;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
@@ -67,13 +62,14 @@ import android.testing.DexmakerShareClassLoaderRule;
import android.view.Display;
import android.view.DisplayInfo;
-import androidx.test.InstrumentationRegistry;
-
import com.android.internal.app.IVoiceInteractor;
import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.ServiceThread;
+import com.android.server.uri.UriGrantsManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.AppWindowContainerController;
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.RootWindowContainerController;
import com.android.server.wm.StackWindowController;
@@ -83,7 +79,9 @@ import com.android.server.wm.WindowTestUtils;
import org.junit.After;
import org.junit.Before;
-import org.mockito.MockitoAnnotations;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.mockito.invocation.InvocationOnMock;
import java.io.File;
import java.util.List;
@@ -91,16 +89,14 @@ import java.util.List;
/**
* A base class to handle common operations in activity related unit tests.
*/
-public class ActivityTestsBase {
- private static boolean sOneTimeSetupDone = false;
-
+class ActivityTestsBase {
private static int sNextDisplayId = DEFAULT_DISPLAY + 1;
@Rule
public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
new DexmakerShareClassLoaderRule();
- private final Context mContext = InstrumentationRegistry.getContext();
+ final Context mContext = getInstrumentation().getTargetContext();
final TestInjector mTestInjector = new TestInjector();
ActivityTaskManagerService mService;
@@ -112,22 +108,22 @@ public class ActivityTestsBase {
// Default base activity name
private static final String DEFAULT_COMPONENT_CLASS_NAME = ".BarActivity";
+ @BeforeClass
+ public static void setUpOnceBase() {
+ AttributeCache.init(getInstrumentation().getTargetContext());
+ }
+
@Before
- public void setUp() throws Exception {
- if (!sOneTimeSetupDone) {
- sOneTimeSetupDone = true;
- MockitoAnnotations.initMocks(this);
- AttributeCache.init(mContext);
- }
+ public void setUpBase() {
mTestInjector.setUp();
}
@After
- public void tearDown() {
+ public void tearDownBase() {
mTestInjector.tearDown();
}
- protected ActivityTaskManagerService createActivityTaskManagerService() {
+ ActivityTaskManagerService createActivityTaskManagerService() {
final TestActivityTaskManagerService atm =
spy(new TestActivityTaskManagerService(mContext));
setupActivityManagerService(atm);
@@ -172,6 +168,7 @@ public class ActivityTestsBase {
// Makes sure the supervisor is using with the spy object.
atm.mStackSupervisor.setService(atm);
doReturn(mock(IPackageManager.class)).when(am).getPackageManager();
+ doReturn(mock(IPackageManager.class)).when(atm).getPackageManager();
PackageManagerInternal mockPackageManager = mock(PackageManagerInternal.class);
doReturn(mockPackageManager).when(am).getPackageManagerInternalLocked();
doReturn(null).when(mockPackageManager).getDefaultHomeActivity(anyInt());
@@ -397,10 +394,10 @@ public class ActivityTestsBase {
}
private static class TestTaskRecord extends TaskRecord {
- TestTaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info,
- Intent _intent, IVoiceInteractionSession _voiceSession,
- IVoiceInteractor _voiceInteractor) {
- super(service, _taskId, info, _intent, _voiceSession, _voiceInteractor);
+ TestTaskRecord(ActivityTaskManagerService service, int taskId, ActivityInfo info,
+ Intent intent, IVoiceInteractionSession voiceSession,
+ IVoiceInteractor voiceInteractor) {
+ super(service, taskId, info, intent, voiceSession, voiceInteractor);
}
@Override
@@ -419,6 +416,10 @@ public class ActivityTestsBase {
private ActivityTaskManagerInternal mInternal;
private PackageManagerInternal mPmInternal;
+ // ActivityStackSupervisor may be created more than once while setting up AMS and ATMS.
+ // We keep the reference in order to prevent creating it twice.
+ private ActivityStackSupervisor mTestStackSupervisor;
+
TestActivityTaskManagerService(Context context) {
super(context);
mSupportsMultiWindow = true;
@@ -448,25 +449,28 @@ public class ActivityTestsBase {
}
@Override
- final protected ActivityStackSupervisor createStackSupervisor() {
- final ActivityStackSupervisor supervisor = spy(createTestSupervisor());
- final KeyguardController keyguardController = mock(KeyguardController.class);
-
- // Invoked during {@link ActivityStack} creation.
- doNothing().when(supervisor).updateUIDsPresentOnDisplay();
- // Always keep things awake.
- doReturn(true).when(supervisor).hasAwakeDisplay();
- // Called when moving activity to pinned stack.
- doNothing().when(supervisor).ensureActivitiesVisibleLocked(any(), anyInt(), anyBoolean());
- // Do not schedule idle timeouts
- doNothing().when(supervisor).scheduleIdleTimeoutLocked(any());
- // unit test version does not handle launch wake lock
- doNothing().when(supervisor).acquireLaunchWakelock();
- doReturn(keyguardController).when(supervisor).getKeyguardController();
-
- supervisor.initialize();
-
- return supervisor;
+ protected final ActivityStackSupervisor createStackSupervisor() {
+ if (mTestStackSupervisor == null) {
+ final ActivityStackSupervisor supervisor = spy(createTestSupervisor());
+ final KeyguardController keyguardController = mock(KeyguardController.class);
+
+ // Invoked during {@link ActivityStack} creation.
+ doNothing().when(supervisor).updateUIDsPresentOnDisplay();
+ // Always keep things awake.
+ doReturn(true).when(supervisor).hasAwakeDisplay();
+ // Called when moving activity to pinned stack.
+ doNothing().when(supervisor).ensureActivitiesVisibleLocked(any(), anyInt(),
+ anyBoolean());
+ // Do not schedule idle timeouts
+ doNothing().when(supervisor).scheduleIdleTimeoutLocked(any());
+ // unit test version does not handle launch wake lock
+ doNothing().when(supervisor).acquireLaunchWakelock();
+ doReturn(keyguardController).when(supervisor).getKeyguardController();
+
+ supervisor.initialize();
+ mTestStackSupervisor = supervisor;
+ }
+ return mTestStackSupervisor;
}
protected ActivityStackSupervisor createTestSupervisor() {
@@ -480,10 +484,13 @@ public class ActivityTestsBase {
return mInternal;
}
+ @Override
PackageManagerInternal getPackageManagerInternalLocked() {
if (mPmInternal == null) {
mPmInternal = mock(PackageManagerInternal.class);
- doReturn(false).when(mPmInternal).isPermissionsReviewRequired(anyString(), anyInt());
+ doReturn(false)
+ .when(mPmInternal)
+ .isPermissionsReviewRequired(anyString(), anyInt());
}
return mPmInternal;
}
@@ -494,7 +501,7 @@ public class ActivityTestsBase {
@Override
public Context getContext() {
- return InstrumentationRegistry.getContext();
+ return getInstrumentation().getTargetContext();
}
@Override
@@ -605,26 +612,13 @@ public class ActivityTestsBase {
mSupervisor = supervisor;
}
+ @SuppressWarnings("TypeParameterUnusedInFormals")
@Override
<T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
int stackId, boolean onTop) {
- if (windowingMode == WINDOWING_MODE_PINNED) {
- return (T) new PinnedActivityStack(this, stackId, mSupervisor, onTop) {
- @Override
- Rect getDefaultPictureInPictureBounds(float aspectRatio) {
- return new Rect(50, 50, 100, 100);
- }
-
- @Override
- PinnedStackWindowController createStackWindowController(int displayId,
- boolean onTop, Rect outBounds) {
- return mock(PinnedStackWindowController.class);
- }
- };
- } else {
- return (T) new TestActivityStack(
- this, stackId, mSupervisor, windowingMode, activityType, onTop);
- }
+ return new StackBuilder(mSupervisor).setDisplay(this)
+ .setWindowingMode(windowingMode).setActivityType(activityType)
+ .setStackId(stackId).setOnTop(onTop).setCreateActivity(false).build();
}
@Override
@@ -677,8 +671,19 @@ public class ActivityTestsBase {
private int mSupportsSplitScreen = SUPPORTS_SPLIT_SCREEN_UNSET;
TestActivityStack(ActivityDisplay display, int stackId, ActivityStackSupervisor supervisor,
- int windowingMode, int activityType, boolean onTop) {
+ int windowingMode, int activityType, boolean onTop, boolean createActivity) {
super(display, stackId, supervisor, windowingMode, activityType, onTop);
+ if (createActivity) {
+ new ActivityBuilder(mService).setCreateTask(true).setStack(this).build();
+ if (onTop) {
+ // We move the task to front again in order to regain focus after activity
+ // added to the stack. Or {@link ActivityDisplay#mPreferredTopFocusableStack}
+ // could be other stacks (e.g. home stack).
+ moveToFront("createActivityStack");
+ } else {
+ moveToBack("createActivityStack", null);
+ }
+ }
}
@Override
@@ -750,4 +755,72 @@ public class ActivityTestsBase {
ActivityOptions options) {
}
}
+
+ protected static class StackBuilder {
+ private final ActivityStackSupervisor mSupervisor;
+ private ActivityDisplay mDisplay;
+ private int mStackId = -1;
+ private int mWindowingMode = WINDOWING_MODE_FULLSCREEN;
+ private int mActivityType = ACTIVITY_TYPE_STANDARD;
+ private boolean mOnTop = true;
+ private boolean mCreateActivity = true;
+
+ StackBuilder(ActivityStackSupervisor supervisor) {
+ mSupervisor = supervisor;
+ mDisplay = mSupervisor.getDefaultDisplay();
+ }
+
+ StackBuilder setWindowingMode(int windowingMode) {
+ mWindowingMode = windowingMode;
+ return this;
+ }
+
+ StackBuilder setActivityType(int activityType) {
+ mActivityType = activityType;
+ return this;
+ }
+
+ StackBuilder setStackId(int stackId) {
+ mStackId = stackId;
+ return this;
+ }
+
+ StackBuilder setDisplay(ActivityDisplay display) {
+ mDisplay = display;
+ return this;
+ }
+
+ StackBuilder setOnTop(boolean onTop) {
+ mOnTop = onTop;
+ return this;
+ }
+
+ StackBuilder setCreateActivity(boolean createActivity) {
+ mCreateActivity = createActivity;
+ return this;
+ }
+
+ @SuppressWarnings("TypeParameterUnusedInFormals")
+ <T extends ActivityStack> T build() {
+ final int stackId = mStackId >= 0 ? mStackId : mDisplay.getNextStackId();
+ if (mWindowingMode == WINDOWING_MODE_PINNED) {
+ return (T) new PinnedActivityStack(mDisplay, stackId, mSupervisor, mOnTop) {
+ @Override
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
+ return new Rect(50, 50, 100, 100);
+ }
+
+ @Override
+ PinnedStackWindowController createStackWindowController(int displayId,
+ boolean onTop, Rect outBounds) {
+ return mock(PinnedStackWindowController.class);
+ }
+ };
+ } else {
+ return (T) new TestActivityStack(mDisplay, stackId, mSupervisor, mWindowingMode,
+ mActivityType, mOnTop, mCreateActivity);
+ }
+ }
+
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/wmtests/src/com/android/server/am/AppErrorDialogTest.java
index 3a7a24d2e103..e70f069e8027 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/AppErrorDialogTest.java
@@ -16,27 +16,26 @@
package com.android.server.am;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import android.content.Context;
import android.os.Handler;
-import androidx.test.InstrumentationRegistry;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.AppOpsService;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.io.File;
/**
- * runtest -c com.android.server.am.AppErrorDialogTest frameworks-services
+ * Build/Install/Run:
+ * atest WmTests:AppErrorDialogTest
*/
-@RunWith(AndroidJUnit4.class)
@SmallTest
@FlakyTest(bugId = 113616538)
public class AppErrorDialogTest {
@@ -46,7 +45,7 @@ public class AppErrorDialogTest {
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
+ mContext = getInstrumentation().getTargetContext();
mService = new ActivityManagerService(new ActivityManagerService.Injector() {
@Override
public AppOpsService getAppOpsService(File file, Handler handler) {
@@ -67,7 +66,7 @@ public class AppErrorDialogTest {
@Test
@UiThreadTest
- public void testCreateWorks() throws Exception {
+ public void testCreateWorks() {
AppErrorDialog.Data data = new AppErrorDialog.Data();
data.proc = new ProcessRecord(null, mContext.getApplicationInfo(), "name", 12345);
data.result = new AppErrorResult();
diff --git a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java b/services/tests/wmtests/src/com/android/server/am/AssistDataRequesterTest.java
index 1b823ff8c6b4..4dc0857a12b6 100644
--- a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/AssistDataRequesterTest.java
@@ -22,6 +22,9 @@ import static android.app.AppOpsManager.OP_ASSIST_SCREENSHOT;
import static android.app.AppOpsManager.OP_ASSIST_STRUCTURE;
import static android.graphics.Bitmap.Config.ARGB_8888;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -45,16 +48,13 @@ import android.os.Looper;
import android.util.Log;
import android.view.IWindowManager;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.AssistDataRequester.AssistDataRequesterCallbacks;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
@@ -65,11 +65,11 @@ import java.util.concurrent.TimeUnit;
* Note: Currently, we only support fetching the screenshot for the current application, so the
* screenshot checks are hardcoded accordingly.
*
- * runtest --path frameworks/base/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
+ * Build/Install/Run:
+ * atest WmTests:AssistDataRequesterTest
*/
@MediumTest
@FlakyTest(bugId = 113616538)
-@RunWith(AndroidJUnit4.class)
public class AssistDataRequesterTest extends ActivityTestsBase {
private static final String TAG = AssistDataRequesterTest.class.getSimpleName();
@@ -105,14 +105,11 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
private CountDownLatch mGate;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
mAm = mock(IActivityManager.class);
mAtm = mock(IActivityTaskManager.class);
mWm = mock(IWindowManager.class);
mAppOpsManager = mock(AppOpsManager.class);
- mContext = InstrumentationRegistry.getContext();
mHandler = new Handler(Looper.getMainLooper());
mCallbacksLock = new Object();
mCallbacks = new Callbacks();
@@ -190,35 +187,35 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
setupMocks(CURRENT_ACTIVITY_ASSIST_ALLOWED, CALLER_ASSIST_STRUCTURE_ALLOWED,
CALLER_ASSIST_SCREENSHOT_ALLOWED);
- mCallbacks.canHandleReceivedData = false;
+ mCallbacks.mCanHandleReceivedData = false;
mDataRequester.requestAssistData(createActivityList(5), FETCH_DATA, FETCH_SCREENSHOTS,
ALLOW_FETCH_DATA, ALLOW_FETCH_SCREENSHOTS, TEST_UID, TEST_PACKAGE);
- assertTrue(mDataRequester.getPendingDataCount() == 5);
- assertTrue(mDataRequester.getPendingScreenshotCount() == 1);
+ assertEquals(5, mDataRequester.getPendingDataCount());
+ assertEquals(1, mDataRequester.getPendingScreenshotCount());
mGate.countDown();
waitForIdle(mHandler);
// Callbacks still not ready to receive, but all pending data is received
- assertTrue(mDataRequester.getPendingDataCount() == 0);
- assertTrue(mDataRequester.getPendingScreenshotCount() == 0);
- assertTrue(mCallbacks.receivedData.isEmpty());
- assertTrue(mCallbacks.receivedScreenshots.isEmpty());
- assertFalse(mCallbacks.requestCompleted);
+ assertEquals(0, mDataRequester.getPendingDataCount());
+ assertEquals(0, mDataRequester.getPendingScreenshotCount());
+ assertThat(mCallbacks.mReceivedData).isEmpty();
+ assertThat(mCallbacks.mReceivedScreenshots).isEmpty();
+ assertFalse(mCallbacks.mRequestCompleted);
- mCallbacks.canHandleReceivedData = true;
+ mCallbacks.mCanHandleReceivedData = true;
mDataRequester.processPendingAssistData();
// Since we are posting the callback for the request-complete, flush the handler as well
mGate.countDown();
waitForIdle(mHandler);
- assertTrue(mCallbacks.receivedData.size() == 5);
- assertTrue(mCallbacks.receivedScreenshots.size() == 1);
- assertTrue(mCallbacks.requestCompleted);
+ assertEquals(5, mCallbacks.mReceivedData.size());
+ assertEquals(1, mCallbacks.mReceivedScreenshots.size());
+ assertTrue(mCallbacks.mRequestCompleted);
// Clear the state and ensure that we only process pending data once
mCallbacks.reset();
mDataRequester.processPendingAssistData();
- assertTrue(mCallbacks.receivedData.isEmpty());
- assertTrue(mCallbacks.receivedScreenshots.isEmpty());
+ assertThat(mCallbacks.mReceivedData).isEmpty();
+ assertThat(mCallbacks.mReceivedScreenshots).isEmpty();
}
@Test
@@ -281,13 +278,13 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
setupMocks(CURRENT_ACTIVITY_ASSIST_ALLOWED, !CALLER_ASSIST_STRUCTURE_ALLOWED,
!CALLER_ASSIST_SCREENSHOT_ALLOWED);
- mCallbacks.canHandleReceivedData = false;
+ mCallbacks.mCanHandleReceivedData = false;
mDataRequester.requestAssistData(createActivityList(5), FETCH_DATA, FETCH_SCREENSHOTS,
ALLOW_FETCH_DATA, ALLOW_FETCH_SCREENSHOTS, TEST_UID, TEST_PACKAGE);
mGate.countDown();
waitForIdle(mHandler);
- assertTrue(mCallbacks.receivedData.isEmpty());
- assertTrue(mCallbacks.receivedScreenshots.isEmpty());
+ assertThat(mCallbacks.mReceivedData).isEmpty();
+ assertThat(mCallbacks.mReceivedScreenshots).isEmpty();
}
@Test
@@ -302,22 +299,22 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
private void assertReceivedDataCount(int numPendingData, int numReceivedData,
int numPendingScreenshots, int numReceivedScreenshots) throws Exception {
- assertTrue("Expected " + numPendingData + " pending data, got "
+ assertEquals("Expected " + numPendingData + " pending data, got "
+ mDataRequester.getPendingDataCount(),
- mDataRequester.getPendingDataCount() == numPendingData);
- assertTrue("Expected " + numPendingScreenshots + " pending screenshots, got "
+ numPendingData, mDataRequester.getPendingDataCount());
+ assertEquals("Expected " + numPendingScreenshots + " pending screenshots, got "
+ mDataRequester.getPendingScreenshotCount(),
- mDataRequester.getPendingScreenshotCount() == numPendingScreenshots);
- assertFalse("Expected request NOT completed", mCallbacks.requestCompleted);
+ numPendingScreenshots, mDataRequester.getPendingScreenshotCount());
+ assertFalse("Expected request NOT completed", mCallbacks.mRequestCompleted);
mGate.countDown();
waitForIdle(mHandler);
- assertTrue("Expected " + numReceivedData + " data, received "
- + mCallbacks.receivedData.size(),
- mCallbacks.receivedData.size() == numReceivedData);
- assertTrue("Expected " + numReceivedScreenshots + " screenshots, received "
- + mCallbacks.receivedScreenshots.size(),
- mCallbacks.receivedScreenshots.size() == numReceivedScreenshots);
- assertTrue("Expected request completed", mCallbacks.requestCompleted);
+ assertEquals("Expected " + numReceivedData + " data, received "
+ + mCallbacks.mReceivedData.size(),
+ numReceivedData, mCallbacks.mReceivedData.size());
+ assertEquals("Expected " + numReceivedScreenshots + " screenshots, received "
+ + mCallbacks.mReceivedScreenshots.size(),
+ numReceivedScreenshots, mCallbacks.mReceivedScreenshots.size());
+ assertTrue("Expected request completed", mCallbacks.mRequestCompleted);
}
private List<IBinder> createActivityList(int size) {
@@ -339,30 +336,30 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
private class Callbacks implements AssistDataRequesterCallbacks {
- boolean canHandleReceivedData = true;
- boolean requestCompleted = false;
- ArrayList<Bundle> receivedData = new ArrayList<>();
- ArrayList<Bitmap> receivedScreenshots = new ArrayList<>();
+ public boolean mCanHandleReceivedData = true;
+ public boolean mRequestCompleted = false;
+ public final ArrayList<Bundle> mReceivedData = new ArrayList<>();
+ public final ArrayList<Bitmap> mReceivedScreenshots = new ArrayList<>();
void reset() {
- canHandleReceivedData = true;
- receivedData.clear();
- receivedScreenshots.clear();
+ mCanHandleReceivedData = true;
+ mReceivedData.clear();
+ mReceivedScreenshots.clear();
}
@Override
public boolean canHandleReceivedAssistDataLocked() {
- return canHandleReceivedData;
+ return mCanHandleReceivedData;
}
@Override
public void onAssistDataReceivedLocked(Bundle data, int activityIndex, int activityCount) {
- receivedData.add(data);
+ mReceivedData.add(data);
}
@Override
public void onAssistScreenshotReceivedLocked(Bitmap screenshot) {
- receivedScreenshots.add(screenshot);
+ mReceivedScreenshots.add(screenshot);
}
@Override
@@ -370,7 +367,7 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
mHandler.post(() -> {
try {
mGate.await(10, TimeUnit.SECONDS);
- requestCompleted = true;
+ mRequestCompleted = true;
} catch (InterruptedException e) {
Log.e(TAG, "Failed to wait", e);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java b/services/tests/wmtests/src/com/android/server/am/BroadcastRecordTest.java
index 75f7c4c2cdff..c39d84abdca7 100644
--- a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/BroadcastRecordTest.java
@@ -27,10 +27,8 @@ import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Collections;
@@ -40,11 +38,10 @@ import java.util.List;
* Test class for {@link BroadcastRecord}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.BroadcastRecordTest
+ * atest WmTests:BroadcastRecordTest
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class BroadcastRecordTest {
@Test
diff --git a/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java b/services/tests/wmtests/src/com/android/server/am/ClientLifecycleManagerTests.java
index b4ad183db386..3346ab746eb6 100644
--- a/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/ClientLifecycleManagerTests.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.android.server.am;
import static org.mockito.Mockito.mock;
@@ -11,12 +27,13 @@ import android.os.Binder;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:ClientLifecycleManagerTests
+ */
@SmallTest
@Presubmit
public class ClientLifecycleManagerTests {
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/wmtests/src/com/android/server/am/CoreSettingsObserverTest.java
index 719e0edc20b7..14463e39e4d8 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -11,15 +11,18 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.server.am.ActivityManagerService.Injector;
+import static com.google.common.truth.Truth.assertWithMessage;
+
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -28,9 +31,7 @@ import android.os.Handler;
import android.provider.Settings;
import android.test.mock.MockContentResolver;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.AppOpsService;
@@ -39,7 +40,6 @@ import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -48,20 +48,10 @@ import java.io.File;
/**
* Test class for {@link CoreSettingsObserver}.
*
- * To run the tests, use
- *
- * runtest -c com.android.server.am.CoreSettingsObserverTest frameworks-services
- *
- * or the following steps:
- *
- * Build: m FrameworksServicesTests
- * Install: adb install -r \
- * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
- * Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \
- * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
+ * Build/Install/Run:
+ * atest WmTests:CoreSettingsObserverTest
*/
@SmallTest
-@RunWith(AndroidJUnit4.class)
public class CoreSettingsObserverTest {
private static final String TEST_SETTING_SECURE_INT = "secureInt";
private static final String TEST_SETTING_GLOBAL_FLOAT = "globalFloat";
@@ -94,7 +84,7 @@ public class CoreSettingsObserverTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
- final Context originalContext = InstrumentationRegistry.getContext();
+ final Context originalContext = getInstrumentation().getTargetContext();
when(mContext.getApplicationInfo()).thenReturn(originalContext.getApplicationInfo());
mContentResolver = new MockContentResolver(mContext);
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
@@ -124,12 +114,12 @@ public class CoreSettingsObserverTest {
public void testPopulateSettings_settingNotSet() {
final Bundle settingsBundle = getPopulatedBundle();
- assertFalse("Bundle should not contain " + TEST_SETTING_SECURE_INT,
- settingsBundle.containsKey(TEST_SETTING_SECURE_INT));
- assertFalse("Bundle should not contain " + TEST_SETTING_GLOBAL_FLOAT,
- settingsBundle.containsKey(TEST_SETTING_GLOBAL_FLOAT));
- assertFalse("Bundle should not contain " + TEST_SETTING_SYSTEM_STRING,
- settingsBundle.containsKey(TEST_SETTING_SYSTEM_STRING));
+ assertWithMessage("Bundle should not contain " + TEST_SETTING_SECURE_INT)
+ .that(settingsBundle.keySet()).doesNotContain(TEST_SETTING_SECURE_INT);
+ assertWithMessage("Bundle should not contain " + TEST_SETTING_GLOBAL_FLOAT)
+ .that(settingsBundle.keySet()).doesNotContain(TEST_SETTING_GLOBAL_FLOAT);
+ assertWithMessage("Bundle should not contain " + TEST_SETTING_SYSTEM_STRING)
+ .that(settingsBundle.keySet()).doesNotContain(TEST_SETTING_SYSTEM_STRING);
}
@Test
@@ -150,8 +140,8 @@ public class CoreSettingsObserverTest {
Settings.Global.putString(mContentResolver, TEST_SETTING_GLOBAL_FLOAT, null);
settingsBundle = getPopulatedBundle();
- assertFalse("Bundle should not contain " + TEST_SETTING_GLOBAL_FLOAT,
- settingsBundle.containsKey(TEST_SETTING_GLOBAL_FLOAT));
+ assertWithMessage("Bundle should not contain " + TEST_SETTING_GLOBAL_FLOAT)
+ .that(settingsBundle.keySet()).doesNotContain(TEST_SETTING_GLOBAL_FLOAT);
assertEquals("Unexpected value of " + TEST_SETTING_SECURE_INT,
TEST_INT, settingsBundle.getInt(TEST_SETTING_SECURE_INT));
assertEquals("Unexpected value of " + TEST_SETTING_SYSTEM_STRING,
@@ -170,6 +160,7 @@ public class CoreSettingsObserverTest {
return mContext;
}
+ @Override
public AppOpsService getAppOpsService(File file, Handler handler) {
return null;
}
diff --git a/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java b/services/tests/wmtests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
index 765aaad45efb..0d11af1e835e 100644
--- a/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
@@ -11,34 +11,37 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
import android.content.ContentResolver;
import android.provider.Settings;
import android.test.mock.MockContentResolver;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.Preconditions;
import com.android.internal.util.test.FakeSettingsProvider;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.HashMap;
import java.util.Map;
/**
* Tests for {@link GlobalSettingsToPropertiesMapper}
+ *
+ * Build/Install/Run:
+ * atest WmTests:GlobalSettingsToPropertiesMapperTest
*/
-@RunWith(AndroidJUnit4.class)
@SmallTest
public class GlobalSettingsToPropertiesMapperTest {
private static final String[][] TEST_MAPPING = new String[][] {
@@ -51,7 +54,7 @@ public class GlobalSettingsToPropertiesMapperTest {
@Before
public void setup() {
// Use FakeSettingsProvider to not affect global state
- mMockContentResolver = new MockContentResolver(InstrumentationRegistry.getContext());
+ mMockContentResolver = new MockContentResolver(getInstrumentation().getTargetContext());
mMockContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
mTestMapper = new TestMapper(mMockContentResolver);
}
@@ -63,21 +66,21 @@ public class GlobalSettingsToPropertiesMapperTest {
mTestMapper.updatePropertiesFromGlobalSettings();
String propValue = mTestMapper.systemPropertiesGet("TestProperty");
- Assert.assertEquals("testValue", propValue);
+ assertEquals("testValue", propValue);
Settings.Global.putString(mMockContentResolver,
Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS, "testValue2");
mTestMapper.updatePropertyFromSetting(Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS,
"TestProperty");
propValue = mTestMapper.systemPropertiesGet("TestProperty");
- Assert.assertEquals("testValue2", propValue);
+ assertEquals("testValue2", propValue);
Settings.Global.putString(mMockContentResolver,
Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS, null);
mTestMapper.updatePropertyFromSetting(Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS,
"TestProperty");
propValue = mTestMapper.systemPropertiesGet("TestProperty");
- Assert.assertEquals("", propValue);
+ assertEquals("", propValue);
}
@Test
@@ -85,7 +88,7 @@ public class GlobalSettingsToPropertiesMapperTest {
// Test that empty property will not not be set if setting is not set
mTestMapper.updatePropertiesFromGlobalSettings();
String propValue = mTestMapper.systemPropertiesGet("TestProperty");
- Assert.assertNull("Property should not be set if setting is null", propValue);
+ assertNull("Property should not be set if setting is null", propValue);
}
private static class TestMapper extends GlobalSettingsToPropertiesMapper {
@@ -108,6 +111,5 @@ public class GlobalSettingsToPropertiesMapperTest {
mProps.put(key, value);
}
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/am/LaunchParamsControllerTests.java
index 2fb10e13ab0b..cb5d29337c1e 100644
--- a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/LaunchParamsControllerTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -41,32 +41,26 @@ import android.content.pm.ActivityInfo.WindowLayout;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.LaunchParamsController.LaunchParams;
import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Tests for exercising {@link LaunchParamsController}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:LaunchParamsControllerTests
+ * atest WmTests:LaunchParamsControllerTests
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class LaunchParamsControllerTests extends ActivityTestsBase {
- private ActivityTaskManagerService mService;
private LaunchParamsController mController;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
mService = createActivityTaskManagerService();
mController = new LaunchParamsController(mService);
}
@@ -181,8 +175,7 @@ public class LaunchParamsControllerTests extends ActivityTestsBase {
mController.registerModifier(positioner1);
mController.registerModifier(positioner2);
- final LaunchParams
- result = new LaunchParams();
+ final LaunchParams result = new LaunchParams();
mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
null /*options*/, result);
@@ -253,19 +246,18 @@ public class LaunchParamsControllerTests extends ActivityTestsBase {
mController.registerModifier(positioner);
final int beforeWindowMode = task.getStack().getWindowingMode();
- assertNotEquals(beforeWindowMode, windowingMode);
+ assertNotEquals(windowingMode, beforeWindowMode);
mController.layoutTask(task, null /* windowLayout */);
final int afterWindowMode = task.getStack().getWindowingMode();
- assertEquals(afterWindowMode, windowingMode);
+ assertEquals(windowingMode, afterWindowMode);
}
- public static class InstrumentedPositioner implements
- LaunchParamsModifier {
+ public static class InstrumentedPositioner implements LaunchParamsModifier {
- final private int mReturnVal;
- final private LaunchParams mParams;
+ private final int mReturnVal;
+ private final LaunchParams mParams;
InstrumentedPositioner(int returnVal, LaunchParams params) {
mReturnVal = returnVal;
diff --git a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/am/LockTaskControllerTest.java
index 863a0d8d34a4..b3ac427cee1f 100644
--- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/LockTaskControllerTest.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2017, The Android Open Source Project
+ * Copyright (C) 2017 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
+ * 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,
@@ -32,12 +32,25 @@ import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATI
import static android.os.Process.SYSTEM_UID;
import static android.telecom.TelecomManager.EMERGENCY_DIALER_COMPONENT;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.server.am.LockTaskController.STATUS_BAR_MASK_LOCKED;
import static com.android.server.am.LockTaskController.STATUS_BAR_MASK_PINNED;
-import static org.junit.Assert.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.StatusBarManager;
import android.app.admin.DevicePolicyManager;
@@ -56,7 +69,6 @@ import android.telecom.TelecomManager;
import android.testing.DexmakerShareClassLoaderRule;
import android.util.Pair;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.IStatusBarService;
@@ -77,10 +89,10 @@ import org.mockito.verification.VerificationMode;
* Unit tests for {@link LockTaskController}.
*
* Build/Install/Run:
- * bit FrameworksServicesTests:com.android.server.am.LockTaskControllerTest
+ * atest WmTests:LockTaskControllerTest
*/
-@Presubmit
@SmallTest
+@Presubmit
public class LockTaskControllerTest {
private static final String TEST_PACKAGE_NAME = "com.test.package";
private static final String TEST_PACKAGE_NAME_2 = "com.test.package2";
@@ -109,7 +121,7 @@ public class LockTaskControllerTest {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = InstrumentationRegistry.getTargetContext();
+ mContext = getInstrumentation().getTargetContext();
mLockToAppSetting = Settings.Secure.getString(mContext.getContentResolver(),
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED);
@@ -183,7 +195,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testStartLockTaskMode_pinningRequest() throws Exception {
+ public void testStartLockTaskMode_pinningRequest() {
// GIVEN a task record that is not whitelisted, i.e. with pinned auth
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_PINNABLE);
@@ -214,7 +226,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testLockTaskViolation() throws Exception {
+ public void testLockTaskViolation() {
// GIVEN one task record with whitelisted auth that is in lock task mode
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED);
mLockTaskController.startLockTaskMode(tr, false, TEST_UID);
@@ -240,7 +252,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testLockTaskViolation_emergencyCall() throws Exception {
+ public void testLockTaskViolation_emergencyCall() {
// GIVEN one task record with whitelisted auth that is in lock task mode
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED);
mLockTaskController.startLockTaskMode(tr, false, TEST_UID);
@@ -289,7 +301,7 @@ public class LockTaskControllerTest {
}
@Test(expected = SecurityException.class)
- public void testStopLockTaskMode_differentCaller() throws Exception {
+ public void testStopLockTaskMode_differentCaller() {
// GIVEN one task record with whitelisted auth that is in lock task mode
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED);
mLockTaskController.startLockTaskMode(tr, false, TEST_UID);
@@ -301,7 +313,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testStopLockTaskMode_systemCaller() throws Exception {
+ public void testStopLockTaskMode_systemCaller() {
// GIVEN one task record with whitelisted auth that is in lock task mode
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED);
mLockTaskController.startLockTaskMode(tr, false, TEST_UID);
@@ -404,7 +416,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testUpdateLockTaskPackages() throws Exception {
+ public void testUpdateLockTaskPackages() {
String[] whitelist1 = {TEST_PACKAGE_NAME, TEST_PACKAGE_NAME_2};
String[] whitelist2 = {TEST_PACKAGE_NAME};
@@ -541,7 +553,7 @@ public class LockTaskControllerTest {
}
@Test
- public void testUpdateLockTaskFeatures_keyguard() throws Exception {
+ public void testUpdateLockTaskFeatures_keyguard() {
// GIVEN a locked task
TaskRecord tr = getTaskRecord(TaskRecord.LOCK_TASK_AUTH_WHITELISTED);
mLockTaskController.startLockTaskMode(tr, false, TEST_UID);
diff --git a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java b/services/tests/wmtests/src/com/android/server/am/MemoryStatUtilTest.java
index 72c5b105cfef..75e75c3e4860 100644
--- a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/MemoryStatUtilTest.java
@@ -29,14 +29,15 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.Collections;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:MemoryStatUtilTest
+ */
@SmallTest
public class MemoryStatUtilTest {
private static final String MEMORY_STAT_CONTENTS = String.join(
@@ -130,51 +131,51 @@ public class MemoryStatUtilTest {
"0");
private static final String PROC_STATUS_CONTENTS = "Name:\tandroid.youtube\n"
- + "State:\tS (sleeping)\n"
- + "Tgid:\t12088\n"
- + "Pid:\t12088\n"
- + "PPid:\t723\n"
- + "TracerPid:\t0\n"
- + "Uid:\t10083\t10083\t10083\t10083\n"
- + "Gid:\t10083\t10083\t10083\t10083\n"
- + "Ngid:\t0\n"
- + "FDSize:\t128\n"
- + "Groups:\t3003 9997 20083 50083 \n"
- + "VmPeak:\t 4546844 kB\n"
- + "VmSize:\t 4542636 kB\n"
- + "VmLck:\t 0 kB\n"
- + "VmPin:\t 0 kB\n"
- + "VmHWM:\t 137668 kB\n" // RSS high watermark
- + "VmRSS:\t 126776 kB\n"
- + "RssAnon:\t 37860 kB\n"
- + "RssFile:\t 88764 kB\n"
- + "RssShmem:\t 152 kB\n"
- + "VmData:\t 4125112 kB\n"
- + "VmStk:\t 8192 kB\n"
- + "VmExe:\t 24 kB\n"
- + "VmLib:\t 102432 kB\n"
- + "VmPTE:\t 1300 kB\n"
- + "VmPMD:\t 36 kB\n"
- + "VmSwap:\t 0 kB\n"
- + "Threads:\t95\n"
- + "SigQ:\t0/13641\n"
- + "SigPnd:\t0000000000000000\n"
- + "ShdPnd:\t0000000000000000\n"
- + "SigBlk:\t0000000000001204\n"
- + "SigIgn:\t0000000000000001\n"
- + "SigCgt:\t00000006400084f8\n"
- + "CapInh:\t0000000000000000\n"
- + "CapPrm:\t0000000000000000\n"
- + "CapEff:\t0000000000000000\n"
- + "CapBnd:\t0000000000000000\n"
- + "CapAmb:\t0000000000000000\n"
- + "Seccomp:\t2\n"
- + "Cpus_allowed:\tff\n"
- + "Cpus_allowed_list:\t0-7\n"
- + "Mems_allowed:\t1\n"
- + "Mems_allowed_list:\t0\n"
- + "voluntary_ctxt_switches:\t903\n"
- + "nonvoluntary_ctxt_switches:\t104\n";
+ + "State:\tS (sleeping)\n"
+ + "Tgid:\t12088\n"
+ + "Pid:\t12088\n"
+ + "PPid:\t723\n"
+ + "TracerPid:\t0\n"
+ + "Uid:\t10083\t10083\t10083\t10083\n"
+ + "Gid:\t10083\t10083\t10083\t10083\n"
+ + "Ngid:\t0\n"
+ + "FDSize:\t128\n"
+ + "Groups:\t3003 9997 20083 50083 \n"
+ + "VmPeak:\t 4546844 kB\n"
+ + "VmSize:\t 4542636 kB\n"
+ + "VmLck:\t 0 kB\n"
+ + "VmPin:\t 0 kB\n"
+ + "VmHWM:\t 137668 kB\n" // RSS high watermark
+ + "VmRSS:\t 126776 kB\n"
+ + "RssAnon:\t 37860 kB\n"
+ + "RssFile:\t 88764 kB\n"
+ + "RssShmem:\t 152 kB\n"
+ + "VmData:\t 4125112 kB\n"
+ + "VmStk:\t 8192 kB\n"
+ + "VmExe:\t 24 kB\n"
+ + "VmLib:\t 102432 kB\n"
+ + "VmPTE:\t 1300 kB\n"
+ + "VmPMD:\t 36 kB\n"
+ + "VmSwap:\t 0 kB\n"
+ + "Threads:\t95\n"
+ + "SigQ:\t0/13641\n"
+ + "SigPnd:\t0000000000000000\n"
+ + "ShdPnd:\t0000000000000000\n"
+ + "SigBlk:\t0000000000001204\n"
+ + "SigIgn:\t0000000000000001\n"
+ + "SigCgt:\t00000006400084f8\n"
+ + "CapInh:\t0000000000000000\n"
+ + "CapPrm:\t0000000000000000\n"
+ + "CapEff:\t0000000000000000\n"
+ + "CapBnd:\t0000000000000000\n"
+ + "CapAmb:\t0000000000000000\n"
+ + "Seccomp:\t2\n"
+ + "Cpus_allowed:\tff\n"
+ + "Cpus_allowed_list:\t0-7\n"
+ + "Mems_allowed:\t1\n"
+ + "Mems_allowed_list:\t0\n"
+ + "voluntary_ctxt_switches:\t903\n"
+ + "nonvoluntary_ctxt_switches:\t104\n";
@Test
public void testParseMemoryStatFromMemcg_parsesCorrectValues() {
diff --git a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java b/services/tests/wmtests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
index 4beebc4dd2f9..484558c15413 100644
--- a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -26,35 +26,31 @@ import android.view.RemoteAnimationAdapter;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.testutils.OffsettableClock;
import com.android.server.testutils.TestHandler;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
- * atest PendingRemoteAnimationRegistryTest
+ * Build/Install/Run:
+ * atest WmTests:PendingRemoteAnimationRegistryTest
*/
@SmallTest
-@Presubmit
@FlakyTest
-@RunWith(AndroidJUnit4.class)
+@Presubmit
public class PendingRemoteAnimationRegistryTest extends ActivityTestsBase {
@Mock RemoteAnimationAdapter mAdapter;
private PendingRemoteAnimationRegistry mRegistry;
private final OffsettableClock mClock = new OffsettableClock.Stopped();
private TestHandler mHandler;
- private ActivityTaskManagerService mService;
@Before
public void setUp() throws Exception {
- super.setUp();
MockitoAnnotations.initMocks(this);
mService = createActivityTaskManagerService();
mService.mH.runWithScissors(() -> {
diff --git a/services/tests/servicestests/src/com/android/server/am/PersisterQueueTests.java b/services/tests/wmtests/src/com/android/server/am/PersisterQueueTests.java
index d7794b04adca..fe9cebea3604 100644
--- a/services/tests/servicestests/src/com/android/server/am/PersisterQueueTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/PersisterQueueTests.java
@@ -12,11 +12,12 @@
* 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.am;
+import static com.google.common.truth.Truth.assertWithMessage;
+
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertSame;
@@ -27,10 +28,12 @@ import static org.junit.Assert.assertTrue;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.MediumTest;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
@@ -39,17 +42,13 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
-import androidx.test.filters.FlakyTest;
-import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
-
/**
- * atest PersisterQueueTests
+ * Build/Install/Run:
+ * atest WmTests:PersisterQueueTests
*/
-@RunWith(AndroidJUnit4.class)
@MediumTest
-@Presubmit
@FlakyTest(detail = "Confirm stable in post-submit before removing")
+@Presubmit
public class PersisterQueueTests implements PersisterQueue.Listener {
private static final long INTER_WRITE_DELAY_MS = 50;
private static final long PRE_TASK_DELAY_MS = 300;
@@ -63,7 +62,8 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
private volatile CountDownLatch mLatch;
private List<Boolean> mProbablyDoneResults;
- private PersisterQueue mTarget;
+ private final PersisterQueue mTarget =
+ new PersisterQueue(INTER_WRITE_DELAY_MS, PRE_TASK_DELAY_MS);
@Before
public void setUp() throws Exception {
@@ -71,7 +71,6 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
mProbablyDoneResults = new ArrayList<>();
mSetUpLatch = new CountDownLatch(1);
- mTarget = new PersisterQueue(INTER_WRITE_DELAY_MS, PRE_TASK_DELAY_MS);
mTarget.addListener(this);
mTarget.startPersisting();
@@ -82,10 +81,11 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
@After
public void tearDown() throws Exception {
mTarget.stopPersisting();
+ mTarget.removeListener(this);
}
@Test
- public void testCallCallbackOnStartUp() throws Exception {
+ public void testCallCallbackOnStartUp() {
// The onPreProcessItem() must be called on start up.
assertEquals(1, mProbablyDoneResults.size());
// The last one must be called with probably done being true.
@@ -197,7 +197,7 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
}
@Test
- public void testFindLastItemNotReturnDifferentType() throws Exception {
+ public void testFindLastItemNotReturnDifferentType() {
synchronized (mTarget) {
mTarget.addItem(new TestItem(), false);
assertNull(mTarget.findLastItem(TEST_ITEM_PREDICATE, MatchingTestItem.class));
@@ -205,7 +205,7 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
}
@Test
- public void testFindLastItemNotReturnMismatchItem() throws Exception {
+ public void testFindLastItemNotReturnMismatchItem() {
synchronized (mTarget) {
mTarget.addItem(new MatchingTestItem(false), false);
assertNull(mTarget.findLastItem(TEST_ITEM_PREDICATE, MatchingTestItem.class));
@@ -213,7 +213,7 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
}
@Test
- public void testFindLastItemReturnMatchedItem() throws Exception {
+ public void testFindLastItemReturnMatchedItem() {
synchronized (mTarget) {
final MatchingTestItem item = new MatchingTestItem(true);
mTarget.addItem(item, false);
@@ -267,8 +267,8 @@ public class PersisterQueueTests implements PersisterQueue.Listener {
assertEquals("Flush should wait until all items are processed before return.",
2, mItemCount.get());
final long processTime = SystemClock.uptimeMillis() - dispatchTime;
- assertTrue("Flush should trigger immediate flush without delays. processTime: "
- + processTime, processTime < TIMEOUT_ALLOWANCE);
+ assertWithMessage("Flush should trigger immediate flush without delays. processTime: "
+ + processTime).that(processTime).isLessThan(TIMEOUT_ALLOWANCE);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/am/RecentTasksTest.java
index 27e8c632c1bd..e15f6cfdd2b0 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/RecentTasksTest.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
@@ -30,6 +29,10 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.view.Display.DEFAULT_DISPLAY;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -38,6 +41,8 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import static java.lang.Integer.MAX_VALUE;
+
import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityTaskManager;
@@ -55,47 +60,39 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.util.MutableLong;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.RecentTasks.Callbacks;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static java.lang.Integer.MAX_VALUE;
import java.io.File;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
/**
- * atest FrameworksServicesTests:RecentTasksTest
+ * Build/Install/Run:
+ * atest WmTests:RecentTasksTest
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class RecentTasksTest extends ActivityTestsBase {
private static final int TEST_USER_0_ID = 0;
private static final int TEST_USER_1_ID = 10;
private static final int TEST_QUIET_USER_ID = 20;
private static final UserInfo DEFAULT_USER_INFO = new UserInfo();
private static final UserInfo QUIET_USER_INFO = new UserInfo();
- private static int LAST_TASK_ID = 1;
- private static int LAST_STACK_ID = 1;
- private static int INVALID_STACK_ID = 999;
+ private static int sLastTaskId = 1;
+ private static int sLastStackId = 1;
+ private static final int INVALID_STACK_ID = 999;
- private Context mContext = InstrumentationRegistry.getContext();
- private TestActivityTaskManagerService mService;
+ private TestActivityTaskManagerService mTestService;
private ActivityDisplay mDisplay;
private ActivityDisplay mOtherDisplay;
private ActivityStack mStack;
@@ -110,19 +107,16 @@ public class RecentTasksTest extends ActivityTestsBase {
private CallbacksRecorder mCallbacksRecorder;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
mTaskPersister = new TestTaskPersister(mContext.getFilesDir());
- mService = spy(new MyTestActivityTaskManagerService(mContext));
+ mTestService = spy(new MyTestActivityTaskManagerService(mContext));
final TestActivityManagerService am = spy(new MyTestActivityManagerService());
- setupActivityManagerService(am, mService);
- mRecentTasks = (TestRecentTasks) mService.getRecentTasks();
+ setupActivityManagerService(am, mTestService);
+ mRecentTasks = (TestRecentTasks) mTestService.getRecentTasks();
mRecentTasks.loadParametersFromResources(mContext.getResources());
- mHomeStack = mService.mStackSupervisor.getDefaultDisplay().getOrCreateStack(
+ mHomeStack = mTestService.mStackSupervisor.getDefaultDisplay().getOrCreateStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
- mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+ mStack = mTestService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
mCallbacksRecorder = new CallbacksRecorder();
mRecentTasks.registerCallback(mCallbacksRecorder);
@@ -141,50 +135,50 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testCallbacks() throws Exception {
+ public void testCallbacks() {
// Add some tasks
mRecentTasks.add(mTasks.get(0));
mRecentTasks.add(mTasks.get(1));
- assertTrue(mCallbacksRecorder.added.contains(mTasks.get(0))
- && mCallbacksRecorder.added.contains(mTasks.get(1)));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).contains(mTasks.get(0));
+ assertThat(mCallbacksRecorder.mAdded).contains(mTasks.get(1));
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
mCallbacksRecorder.clear();
// Remove some tasks
mRecentTasks.remove(mTasks.get(0));
mRecentTasks.remove(mTasks.get(1));
- assertTrue(mCallbacksRecorder.added.isEmpty());
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.contains(mTasks.get(0)));
- assertTrue(mCallbacksRecorder.removed.contains(mTasks.get(1)));
+ assertThat(mCallbacksRecorder.mAdded).isEmpty();
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).contains(mTasks.get(0));
+ assertThat(mCallbacksRecorder.mRemoved).contains(mTasks.get(1));
mCallbacksRecorder.clear();
// Remove the callback, ensure we don't get any calls
mRecentTasks.unregisterCallback(mCallbacksRecorder);
mRecentTasks.add(mTasks.get(0));
mRecentTasks.remove(mTasks.get(0));
- assertTrue(mCallbacksRecorder.added.isEmpty());
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).isEmpty();
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testAddTasksNoMultiple_expectNoTrim() throws Exception {
+ public void testAddTasksNoMultiple_expectNoTrim() {
// Add same non-multiple-task document tasks will remove the task (to re-add it) but not
// trim it
TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
TaskRecord documentTask2 = createDocumentTask(".DocumentTask1");
mRecentTasks.add(documentTask1);
mRecentTasks.add(documentTask2);
- assertTrue(mCallbacksRecorder.added.contains(documentTask1));
- assertTrue(mCallbacksRecorder.added.contains(documentTask2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.contains(documentTask1));
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask1);
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).contains(documentTask1);
}
@Test
- public void testAddTasksMaxTaskRecents_expectNoTrim() throws Exception {
+ public void testAddTasksMaxTaskRecents_expectNoTrim() {
// Add a task hitting max-recents for that app will remove the task (to add the next one)
// but not trim it
TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
@@ -193,27 +187,27 @@ public class RecentTasksTest extends ActivityTestsBase {
documentTask2.maxRecents = 1;
mRecentTasks.add(documentTask1);
mRecentTasks.add(documentTask2);
- assertTrue(mCallbacksRecorder.added.contains(documentTask1));
- assertTrue(mCallbacksRecorder.added.contains(documentTask2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.contains(documentTask1));
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask1);
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).contains(documentTask1);
}
@Test
- public void testAddTasksSameTask_expectNoTrim() throws Exception {
+ public void testAddTasksSameTask_expectNoTrim() {
// Add a task that is already in the task list does not trigger any callbacks, it just
// moves in the list
TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
mRecentTasks.add(documentTask1);
mRecentTasks.add(documentTask1);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(documentTask1));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask1);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testAddTasksMultipleDocumentTasks_expectNoTrim() throws Exception {
+ public void testAddTasksMultipleDocumentTasks_expectNoTrim() {
// Add same multiple-task document tasks does not trim the first tasks
TaskRecord documentTask1 = createDocumentTask(".DocumentTask1",
FLAG_ACTIVITY_MULTIPLE_TASK);
@@ -221,15 +215,15 @@ public class RecentTasksTest extends ActivityTestsBase {
FLAG_ACTIVITY_MULTIPLE_TASK);
mRecentTasks.add(documentTask1);
mRecentTasks.add(documentTask2);
- assertTrue(mCallbacksRecorder.added.size() == 2);
- assertTrue(mCallbacksRecorder.added.contains(documentTask1));
- assertTrue(mCallbacksRecorder.added.contains(documentTask2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(2);
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask1);
+ assertThat(mCallbacksRecorder.mAdded).contains(documentTask2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testAddTasksMultipleTasks_expectRemovedNoTrim() throws Exception {
+ public void testAddTasksMultipleTasks_expectRemovedNoTrim() {
// Add multiple same-affinity non-document tasks, ensure that it removes the other task,
// but that it does not trim it
TaskRecord task1 = createTaskBuilder(".Task1")
@@ -239,21 +233,21 @@ public class RecentTasksTest extends ActivityTestsBase {
.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
.build();
mRecentTasks.add(task1);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(task1));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task1);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
mCallbacksRecorder.clear();
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.size() == 1);
- assertTrue(mCallbacksRecorder.removed.contains(task1));
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).hasSize(1);
+ assertThat(mCallbacksRecorder.mRemoved).contains(task1);
}
@Test
- public void testAddTasksDifferentStacks_expectNoRemove() throws Exception {
+ public void testAddTasksDifferentStacks_expectNoRemove() {
// Adding the same task with different activity types should not trigger removal of the
// other task
TaskRecord task1 = createTaskBuilder(".Task1")
@@ -264,15 +258,15 @@ public class RecentTasksTest extends ActivityTestsBase {
.setStack(mStack).build();
mRecentTasks.add(task1);
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 2);
- assertTrue(mCallbacksRecorder.added.contains(task1));
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(2);
+ assertThat(mCallbacksRecorder.mAdded).contains(task1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testAddTaskCompatibleActivityType_expectRemove() throws Exception {
+ public void testAddTaskCompatibleActivityType_expectRemove() {
// Test with undefined activity type since the type is not persisted by the task persister
// and we want to ensure that a new task will match a restored task
TaskRecord task1 = createTaskBuilder(".Task1")
@@ -280,7 +274,7 @@ public class RecentTasksTest extends ActivityTestsBase {
.setStack(mStack)
.build();
setTaskActivityType(task1, ACTIVITY_TYPE_UNDEFINED);
- assertTrue(task1.getActivityType() == ACTIVITY_TYPE_UNDEFINED);
+ assertThat(task1.getActivityType()).isEqualTo(ACTIVITY_TYPE_UNDEFINED);
mRecentTasks.add(task1);
mCallbacksRecorder.clear();
@@ -288,24 +282,24 @@ public class RecentTasksTest extends ActivityTestsBase {
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
- assertTrue(task2.getActivityType() == ACTIVITY_TYPE_STANDARD);
+ assertEquals(ACTIVITY_TYPE_STANDARD, task2.getActivityType());
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.size() == 1);
- assertTrue(mCallbacksRecorder.removed.contains(task1));
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).hasSize(1);
+ assertThat(mCallbacksRecorder.mRemoved).contains(task1);
}
@Test
- public void testAddTaskCompatibleActivityTypeDifferentUser_expectNoRemove() throws Exception {
+ public void testAddTaskCompatibleActivityTypeDifferentUser_expectNoRemove() {
TaskRecord task1 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.setUserId(TEST_USER_0_ID)
.build();
setTaskActivityType(task1, ACTIVITY_TYPE_UNDEFINED);
- assertTrue(task1.getActivityType() == ACTIVITY_TYPE_UNDEFINED);
+ assertEquals(ACTIVITY_TYPE_UNDEFINED, task1.getActivityType());
mRecentTasks.add(task1);
mCallbacksRecorder.clear();
@@ -314,22 +308,22 @@ public class RecentTasksTest extends ActivityTestsBase {
.setStack(mStack)
.setUserId(TEST_USER_1_ID)
.build();
- assertTrue(task2.getActivityType() == ACTIVITY_TYPE_STANDARD);
+ assertEquals(ACTIVITY_TYPE_STANDARD, task2.getActivityType());
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testAddTaskCompatibleWindowingMode_expectRemove() throws Exception {
+ public void testAddTaskCompatibleWindowingMode_expectRemove() {
TaskRecord task1 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
setTaskWindowingMode(task1, WINDOWING_MODE_UNDEFINED);
- assertTrue(task1.getWindowingMode() == WINDOWING_MODE_UNDEFINED);
+ assertEquals(WINDOWING_MODE_UNDEFINED, task1.getWindowingMode());
mRecentTasks.add(task1);
mCallbacksRecorder.clear();
@@ -338,24 +332,24 @@ public class RecentTasksTest extends ActivityTestsBase {
.setStack(mStack)
.build();
setTaskWindowingMode(task2, WINDOWING_MODE_FULLSCREEN);
- assertTrue(task2.getWindowingMode() == WINDOWING_MODE_FULLSCREEN);
+ assertEquals(WINDOWING_MODE_FULLSCREEN, task2.getWindowingMode());
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 1);
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.size() == 1);
- assertTrue(mCallbacksRecorder.removed.contains(task1));
+ assertThat(mCallbacksRecorder.mAdded).hasSize(1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).hasSize(1);
+ assertThat(mCallbacksRecorder.mRemoved).contains(task1);
}
@Test
- public void testAddTaskIncompatibleWindowingMode_expectNoRemove() throws Exception {
+ public void testAddTaskIncompatibleWindowingMode_expectNoRemove() {
TaskRecord task1 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
setTaskWindowingMode(task1, WINDOWING_MODE_FULLSCREEN);
- assertTrue(task1.getWindowingMode() == WINDOWING_MODE_FULLSCREEN);
+ assertEquals(WINDOWING_MODE_FULLSCREEN, task1.getWindowingMode());
mRecentTasks.add(task1);
TaskRecord task2 = createTaskBuilder(".Task1")
@@ -363,41 +357,41 @@ public class RecentTasksTest extends ActivityTestsBase {
.setStack(mStack)
.build();
setTaskWindowingMode(task2, WINDOWING_MODE_PINNED);
- assertTrue(task2.getWindowingMode() == WINDOWING_MODE_PINNED);
+ assertEquals(WINDOWING_MODE_PINNED, task2.getWindowingMode());
mRecentTasks.add(task2);
- assertTrue(mCallbacksRecorder.added.size() == 2);
- assertTrue(mCallbacksRecorder.added.contains(task1));
- assertTrue(mCallbacksRecorder.added.contains(task2));
- assertTrue(mCallbacksRecorder.trimmed.isEmpty());
- assertTrue(mCallbacksRecorder.removed.isEmpty());
+ assertThat(mCallbacksRecorder.mAdded).hasSize(2);
+ assertThat(mCallbacksRecorder.mAdded).contains(task1);
+ assertThat(mCallbacksRecorder.mAdded).contains(task2);
+ assertThat(mCallbacksRecorder.mTrimmed).isEmpty();
+ assertThat(mCallbacksRecorder.mRemoved).isEmpty();
}
@Test
- public void testUsersTasks() throws Exception {
+ public void testUsersTasks() {
mRecentTasks.setOnlyTestVisibleRange();
// Setup some tasks for the users
- mTaskPersister.userTaskIdsOverride = new SparseBooleanArray();
- mTaskPersister.userTaskIdsOverride.put(1, true);
- mTaskPersister.userTaskIdsOverride.put(2, true);
- mTaskPersister.userTasksOverride = new ArrayList<>();
- mTaskPersister.userTasksOverride.add(createTaskBuilder(".UserTask1").build());
- mTaskPersister.userTasksOverride.add(createTaskBuilder(".UserTask2").build());
+ mTaskPersister.mUserTaskIdsOverride = new SparseBooleanArray();
+ mTaskPersister.mUserTaskIdsOverride.put(1, true);
+ mTaskPersister.mUserTaskIdsOverride.put(2, true);
+ mTaskPersister.mUserTasksOverride = new ArrayList<>();
+ mTaskPersister.mUserTasksOverride.add(createTaskBuilder(".UserTask1").build());
+ mTaskPersister.mUserTasksOverride.add(createTaskBuilder(".UserTask2").build());
// Assert no user tasks are initially loaded
- assertTrue(mRecentTasks.usersWithRecentsLoadedLocked().length == 0);
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).hasLength(0);
// Load user 0 tasks
mRecentTasks.loadUserRecentsLocked(TEST_USER_0_ID);
- assertTrue(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_0_ID));
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList().contains(TEST_USER_0_ID);
assertTrue(mRecentTasks.containsTaskId(1, TEST_USER_0_ID));
assertTrue(mRecentTasks.containsTaskId(2, TEST_USER_0_ID));
// Load user 1 tasks
mRecentTasks.loadUserRecentsLocked(TEST_USER_1_ID);
- assertTrue(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_0_ID));
- assertTrue(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_1_ID));
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList().contains(TEST_USER_0_ID);
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList().contains(TEST_USER_1_ID);
assertTrue(mRecentTasks.containsTaskId(1, TEST_USER_0_ID));
assertTrue(mRecentTasks.containsTaskId(2, TEST_USER_0_ID));
assertTrue(mRecentTasks.containsTaskId(1, TEST_USER_1_ID));
@@ -405,19 +399,22 @@ public class RecentTasksTest extends ActivityTestsBase {
// Unload user 1 tasks
mRecentTasks.unloadUserDataFromMemoryLocked(TEST_USER_1_ID);
- assertTrue(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_0_ID));
- assertFalse(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_1_ID));
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList().contains(TEST_USER_0_ID);
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList()
+ .doesNotContain(TEST_USER_1_ID);
assertTrue(mRecentTasks.containsTaskId(1, TEST_USER_0_ID));
assertTrue(mRecentTasks.containsTaskId(2, TEST_USER_0_ID));
// Unload user 0 tasks
mRecentTasks.unloadUserDataFromMemoryLocked(TEST_USER_0_ID);
- assertFalse(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_0_ID));
- assertFalse(arrayContainsUser(mRecentTasks.usersWithRecentsLoadedLocked(), TEST_USER_1_ID));
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList()
+ .doesNotContain(TEST_USER_0_ID);
+ assertThat(mRecentTasks.usersWithRecentsLoadedLocked()).asList()
+ .doesNotContain(TEST_USER_1_ID);
}
@Test
- public void testOrderedIteration() throws Exception {
+ public void testOrderedIteration() {
mRecentTasks.setOnlyTestVisibleRange();
TaskRecord task1 = createTaskBuilder(".Task1").build();
task1.lastActiveTime = new Random().nextInt();
@@ -436,13 +433,13 @@ public class RecentTasksTest extends ActivityTestsBase {
final ArrayList<TaskRecord> tasks = mRecentTasks.getRawTasks();
for (int i = 0; i < tasks.size(); i++) {
final TaskRecord task = tasks.get(i);
- assertTrue(task.lastActiveTime >= prevLastActiveTime.value);
+ assertThat(prevLastActiveTime.value).isLessThan(task.lastActiveTime);
prevLastActiveTime.value = task.lastActiveTime;
}
}
@Test
- public void testTrimToGlobalMaxNumRecents() throws Exception {
+ public void testTrimToGlobalMaxNumRecents() {
mRecentTasks.setOnlyTestVisibleRange();
// Limit the global maximum number of recent tasks to a fixed size
@@ -458,7 +455,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testTrimQuietProfileTasks() throws Exception {
+ public void testTrimQuietProfileTasks() {
mRecentTasks.setOnlyTestVisibleRange();
TaskRecord qt1 = createTaskBuilder(".QuietTask1").setUserId(TEST_QUIET_USER_ID).build();
TaskRecord qt2 = createTaskBuilder(".QuietTask2").setUserId(TEST_QUIET_USER_ID).build();
@@ -473,7 +470,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testSessionDuration() throws Exception {
+ public void testSessionDuration() {
mRecentTasks.setOnlyTestVisibleRange();
mRecentTasks.setParameters(-1 /* min */, -1 /* max */, 50 /* ms */);
@@ -493,7 +490,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testVisibleTasks_excludedFromRecents() throws Exception {
+ public void testVisibleTasks_excludedFromRecents() {
mRecentTasks.setOnlyTestVisibleRange();
mRecentTasks.setParameters(-1 /* min */, 4 /* max */, -1 /* ms */);
@@ -515,7 +512,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testVisibleTasks_minNum() throws Exception {
+ public void testVisibleTasks_minNum() {
mRecentTasks.setOnlyTestVisibleRange();
mRecentTasks.setParameters(5 /* min */, -1 /* max */, 25 /* ms */);
@@ -536,7 +533,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testVisibleTasks_maxNum() throws Exception {
+ public void testVisibleTasks_maxNum() {
mRecentTasks.setOnlyTestVisibleRange();
mRecentTasks.setParameters(-1 /* min */, 3 /* max */, -1 /* ms */);
@@ -551,11 +548,11 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testBackStackTasks_expectNoTrim() throws Exception {
+ public void testBackStackTasks_expectNoTrim() {
mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */);
final MyTestActivityStackSupervisor supervisor =
- (MyTestActivityStackSupervisor) mService.mStackSupervisor;
+ (MyTestActivityStackSupervisor) mTestService.mStackSupervisor;
final ActivityStack homeStack = mDisplay.getHomeStack();
final ActivityStack aboveHomeStack = new MyTestActivityStack(mDisplay, supervisor);
@@ -570,11 +567,11 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testBehindHomeStackTasks_expectTaskTrimmed() throws Exception {
+ public void testBehindHomeStackTasks_expectTaskTrimmed() {
mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */);
final MyTestActivityStackSupervisor supervisor =
- (MyTestActivityStackSupervisor) mService.mStackSupervisor;
+ (MyTestActivityStackSupervisor) mTestService.mStackSupervisor;
final ActivityStack behindHomeStack = new MyTestActivityStack(mDisplay, supervisor);
final ActivityStack homeStack = mDisplay.getHomeStack();
final ActivityStack aboveHomeStack = new MyTestActivityStack(mDisplay, supervisor);
@@ -592,11 +589,11 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testOtherDisplayTasks_expectNoTrim() throws Exception {
+ public void testOtherDisplayTasks_expectNoTrim() {
mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */);
final MyTestActivityStackSupervisor supervisor =
- (MyTestActivityStackSupervisor) mService.mStackSupervisor;
+ (MyTestActivityStackSupervisor) mTestService.mStackSupervisor;
final ActivityStack homeStack = mDisplay.getHomeStack();
final ActivityStack otherDisplayStack = new MyTestActivityStack(mOtherDisplay, supervisor);
@@ -611,7 +608,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testRemovePackageByName() throws Exception {
+ public void testRemovePackageByName() {
// Add a number of tasks with the same package name
mRecentTasks.add(createTaskBuilder("com.android.pkg1", ".Task1").build());
mRecentTasks.add(createTaskBuilder("com.android.pkg2", ".Task2").build());
@@ -628,7 +625,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
- public void testRemoveAllVisibleTasks() throws Exception {
+ public void testRemoveAllVisibleTasks() {
mRecentTasks.setParameters(-1 /* min */, 3 /* max */, 100 /* ms */);
// Create some set of tasks, some of which are visible and some are not
@@ -665,88 +662,124 @@ public class RecentTasksTest extends ActivityTestsBase {
}
@Test
+ public void testNotRestoreRecentTaskApis() {
+ final TaskRecord task = createTaskBuilder(".Task").build();
+ final int taskId = task.taskId;
+ mRecentTasks.add(task);
+ // Only keep the task in RecentTasks.
+ task.removeWindowContainer();
+ mStack.remove();
+
+ // The following APIs should not restore task from recents to the active list.
+ assertNotRestoreTask(() -> mTestService.setFocusedTask(taskId));
+ assertNotRestoreTask(() -> mTestService.startSystemLockTaskMode(taskId));
+ assertNotRestoreTask(() -> mTestService.cancelTaskWindowTransition(taskId));
+ assertNotRestoreTask(
+ () -> mTestService.resizeTask(taskId, null /* bounds */, 0 /* resizeMode */));
+ assertNotRestoreTask(
+ () -> mTestService.setTaskWindowingMode(taskId, WINDOWING_MODE_FULLSCREEN,
+ false/* toTop */));
+ assertNotRestoreTask(
+ () -> mTestService.setTaskWindowingModeSplitScreenPrimary(taskId,
+ SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT,
+ false /* toTop */, false /* animate */, null /* initialBounds */,
+ true /* showRecents */));
+ }
+
+ private void assertNotRestoreTask(Runnable action) {
+ // Verify stack count doesn't change because task with fullscreen mode and standard type
+ // would have its own stack.
+ final int orignalStackCount = mDisplay.getChildCount();
+ action.run();
+ assertEquals(orignalStackCount, mDisplay.getChildCount());
+ }
+
+ @Test
public void testNotRecentsComponent_denyApiAccess() throws Exception {
- doReturn(PackageManager.PERMISSION_DENIED).when(mService)
+ doReturn(PackageManager.PERMISSION_DENIED).when(mTestService)
.checkGetTasksPermission(anyString(), anyInt(), anyInt());
// Expect the following methods to fail due to recents component not being set
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.DENY_THROW_SECURITY_EXCEPTION);
- testRecentTasksApis(false /* expectNoSecurityException */);
+ doTestRecentTasksApis(false /* expectNoSecurityException */);
// Don't throw for the following tests
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.DENY);
testGetTasksApis(false /* expectNoSecurityException */);
}
@Test
- public void testRecentsComponent_allowApiAccessWithoutPermissions() throws Exception {
- doReturn(PackageManager.PERMISSION_DENIED).when(mService)
+ public void testRecentsComponent_allowApiAccessWithoutPermissions() {
+ doReturn(PackageManager.PERMISSION_DENIED).when(mTestService)
.checkGetTasksPermission(anyString(), anyInt(), anyInt());
// Set the recents component and ensure that the following calls do not fail
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT);
- testRecentTasksApis(true /* expectNoSecurityException */);
+ doTestRecentTasksApis(true /* expectNoSecurityException */);
testGetTasksApis(true /* expectNoSecurityException */);
}
- private void testRecentTasksApis(boolean expectCallable) {
- assertSecurityException(expectCallable, () -> mService.removeStack(INVALID_STACK_ID));
+ private void doTestRecentTasksApis(boolean expectCallable) {
+ assertSecurityException(expectCallable, () -> mTestService.removeStack(INVALID_STACK_ID));
assertSecurityException(expectCallable,
- () -> mService.removeStacksInWindowingModes(new int[] {WINDOWING_MODE_UNDEFINED}));
+ () -> mTestService.removeStacksInWindowingModes(
+ new int[]{WINDOWING_MODE_UNDEFINED}));
assertSecurityException(expectCallable,
- () -> mService.removeStacksWithActivityTypes(new int[] {ACTIVITY_TYPE_UNDEFINED}));
- assertSecurityException(expectCallable, () -> mService.removeTask(0));
+ () -> mTestService.removeStacksWithActivityTypes(
+ new int[]{ACTIVITY_TYPE_UNDEFINED}));
+ assertSecurityException(expectCallable, () -> mTestService.removeTask(0));
assertSecurityException(expectCallable,
- () -> mService.setTaskWindowingMode(0, WINDOWING_MODE_UNDEFINED, true));
+ () -> mTestService.setTaskWindowingMode(0, WINDOWING_MODE_UNDEFINED, true));
assertSecurityException(expectCallable,
- () -> mService.moveTaskToStack(0, INVALID_STACK_ID, true));
+ () -> mTestService.moveTaskToStack(0, INVALID_STACK_ID, true));
assertSecurityException(expectCallable,
- () -> mService.setTaskWindowingModeSplitScreenPrimary(0,
+ () -> mTestService.setTaskWindowingModeSplitScreenPrimary(0,
SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, true, true, new Rect(), true));
- assertSecurityException(expectCallable, () -> mService.dismissSplitScreenMode(true));
- assertSecurityException(expectCallable, () -> mService.dismissPip(true, 0));
+ assertSecurityException(expectCallable, () -> mTestService.dismissSplitScreenMode(true));
+ assertSecurityException(expectCallable, () -> mTestService.dismissPip(true, 0));
assertSecurityException(expectCallable,
- () -> mService.moveTopActivityToPinnedStack(INVALID_STACK_ID, new Rect()));
+ () -> mTestService.moveTopActivityToPinnedStack(INVALID_STACK_ID, new Rect()));
assertSecurityException(expectCallable,
- () -> mService.resizeStack(INVALID_STACK_ID, new Rect(), true, true, true, 0));
+ () -> mTestService.resizeStack(INVALID_STACK_ID, new Rect(), true, true, true, 0));
assertSecurityException(expectCallable,
- () -> mService.resizeDockedStack(new Rect(), new Rect(), new Rect(), new Rect(),
+ () -> mTestService.resizeDockedStack(new Rect(), new Rect(), new Rect(), new Rect(),
new Rect()));
assertSecurityException(expectCallable,
- () -> mService.resizePinnedStack(new Rect(), new Rect()));
- assertSecurityException(expectCallable, () -> mService.getAllStackInfos());
+ () -> mTestService.resizePinnedStack(new Rect(), new Rect()));
+ assertSecurityException(expectCallable, () -> mTestService.getAllStackInfos());
assertSecurityException(expectCallable,
- () -> mService.getStackInfo(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_UNDEFINED));
+ () -> mTestService.getStackInfo(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_UNDEFINED));
assertSecurityException(expectCallable, () -> {
try {
- mService.getFocusedStackInfo();
+ mTestService.getFocusedStackInfo();
} catch (RemoteException e) {
// Ignore
}
});
assertSecurityException(expectCallable,
- () -> mService.moveTasksToFullscreenStack(INVALID_STACK_ID, true));
+ () -> mTestService.moveTasksToFullscreenStack(INVALID_STACK_ID, true));
assertSecurityException(expectCallable,
- () -> mService.startActivityFromRecents(0, new Bundle()));
- assertSecurityException(expectCallable,() -> mService.getTaskSnapshot(0, true));
- assertSecurityException(expectCallable,() -> mService.registerTaskStackListener(null));
- assertSecurityException(expectCallable,() -> mService.unregisterTaskStackListener(null));
- assertSecurityException(expectCallable, () -> mService.getTaskDescription(0));
- assertSecurityException(expectCallable, () -> mService.cancelTaskWindowTransition(0));
- assertSecurityException(expectCallable, () -> mService.startRecentsActivity(null, null,
+ () -> mTestService.startActivityFromRecents(0, new Bundle()));
+ assertSecurityException(expectCallable, () -> mTestService.getTaskSnapshot(0, true));
+ assertSecurityException(expectCallable, () -> mTestService.registerTaskStackListener(null));
+ assertSecurityException(expectCallable,
+ () -> mTestService.unregisterTaskStackListener(null));
+ assertSecurityException(expectCallable, () -> mTestService.getTaskDescription(0));
+ assertSecurityException(expectCallable, () -> mTestService.cancelTaskWindowTransition(0));
+ assertSecurityException(expectCallable, () -> mTestService.startRecentsActivity(null, null,
null));
- assertSecurityException(expectCallable, () -> mService.cancelRecentsAnimation(true));
- assertSecurityException(expectCallable, () -> mService.stopAppSwitches());
- assertSecurityException(expectCallable, () -> mService.resumeAppSwitches());
+ assertSecurityException(expectCallable, () -> mTestService.cancelRecentsAnimation(true));
+ assertSecurityException(expectCallable, () -> mTestService.stopAppSwitches());
+ assertSecurityException(expectCallable, () -> mTestService.resumeAppSwitches());
}
private void testGetTasksApis(boolean expectCallable) {
- mService.getRecentTasks(MAX_VALUE, 0, TEST_USER_0_ID);
- mService.getTasks(MAX_VALUE);
+ mTestService.getRecentTasks(MAX_VALUE, 0, TEST_USER_0_ID);
+ mTestService.getTasks(MAX_VALUE);
if (expectCallable) {
- assertTrue(mRecentTasks.lastAllowed);
- assertTrue(mRunningTasks.lastAllowed);
+ assertTrue(mRecentTasks.mLastAllowed);
+ assertTrue(mRunningTasks.mLastAllowed);
} else {
- assertFalse(mRecentTasks.lastAllowed);
- assertFalse(mRunningTasks.lastAllowed);
+ assertFalse(mRecentTasks.mLastAllowed);
+ assertFalse(mRunningTasks.mLastAllowed);
}
}
@@ -755,10 +788,10 @@ public class RecentTasksTest extends ActivityTestsBase {
}
private TaskBuilder createTaskBuilder(String packageName, String className) {
- return new TaskBuilder(mService.mStackSupervisor)
+ return new TaskBuilder(mTestService.mStackSupervisor)
.setComponent(new ComponentName(packageName, className))
.setStack(mStack)
- .setTaskId(LAST_TASK_ID++)
+ .setTaskId(sLastTaskId++)
.setUserId(TEST_USER_0_ID);
}
@@ -791,25 +824,20 @@ public class RecentTasksTest extends ActivityTestsBase {
return task;
}
- private boolean arrayContainsUser(int[] userIds, int targetUserId) {
- Arrays.sort(userIds);
- return Arrays.binarySearch(userIds, targetUserId) >= 0;
- }
-
private void assertNoTasksTrimmed() {
assertTrimmed();
}
private void assertTrimmed(TaskRecord... tasks) {
- final ArrayList<TaskRecord> trimmed = mCallbacksRecorder.trimmed;
- final ArrayList<TaskRecord> removed = mCallbacksRecorder.removed;
- assertTrue("Expected " + tasks.length + " trimmed tasks, got " + trimmed.size(),
- trimmed.size() == tasks.length);
- assertTrue("Expected " + tasks.length + " removed tasks, got " + removed.size(),
- removed.size() == tasks.length);
+ final ArrayList<TaskRecord> trimmed = mCallbacksRecorder.mTrimmed;
+ final ArrayList<TaskRecord> removed = mCallbacksRecorder.mRemoved;
+ assertWithMessage("Expected " + tasks.length + " trimmed tasks, got " + trimmed.size())
+ .that(trimmed).hasSize(tasks.length);
+ assertWithMessage("Expected " + tasks.length + " removed tasks, got " + removed.size())
+ .that(removed).hasSize(tasks.length);
for (TaskRecord task : tasks) {
- assertTrue("Expected trimmed task: " + task, trimmed.contains(task));
- assertTrue("Expected removed task: " + task, removed.contains(task));
+ assertWithMessage("Expected trimmed task: " + task).that(trimmed).contains(task);
+ assertWithMessage("Expected removed task: " + task).that(removed).contains(task);
}
}
@@ -820,8 +848,7 @@ public class RecentTasksTest extends ActivityTestsBase {
} catch (SecurityException se) {
noSecurityException = false;
} catch (Exception e) {
- // We only care about SecurityExceptions, fall through here
- e.printStackTrace();
+ // We only care about SecurityExceptions, fall through here.
}
if (noSecurityException != expectCallable) {
fail("Expected callable: " + expectCallable + " but got no security exception: "
@@ -858,7 +885,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
private class MyTestActivityStackSupervisor extends TestActivityStackSupervisor {
- public MyTestActivityStackSupervisor(ActivityTaskManagerService service, Looper looper) {
+ MyTestActivityStackSupervisor(ActivityTaskManagerService service, Looper looper) {
super(service, looper);
}
@@ -878,12 +905,12 @@ public class RecentTasksTest extends ActivityTestsBase {
}
}
- private class MyTestActivityStack extends TestActivityStack {
+ private static class MyTestActivityStack extends TestActivityStack {
private ActivityDisplay mDisplay = null;
MyTestActivityStack(ActivityDisplay display, ActivityStackSupervisor supervisor) {
- super(display, LAST_STACK_ID++, supervisor, WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_STANDARD, true);
+ super(display, sLastStackId++, supervisor, WINDOWING_MODE_FULLSCREEN,
+ ACTIVITY_TYPE_STANDARD, true /* onTop */, false /* createActivity */);
mDisplay = display;
}
@@ -897,33 +924,33 @@ public class RecentTasksTest extends ActivityTestsBase {
}
private static class CallbacksRecorder implements Callbacks {
- ArrayList<TaskRecord> added = new ArrayList<>();
- ArrayList<TaskRecord> trimmed = new ArrayList<>();
- ArrayList<TaskRecord> removed = new ArrayList<>();
+ public final ArrayList<TaskRecord> mAdded = new ArrayList<>();
+ public final ArrayList<TaskRecord> mTrimmed = new ArrayList<>();
+ public final ArrayList<TaskRecord> mRemoved = new ArrayList<>();
void clear() {
- added.clear();
- trimmed.clear();
- removed.clear();
+ mAdded.clear();
+ mTrimmed.clear();
+ mRemoved.clear();
}
@Override
public void onRecentTaskAdded(TaskRecord task) {
- added.add(task);
+ mAdded.add(task);
}
@Override
public void onRecentTaskRemoved(TaskRecord task, boolean wasTrimmed, boolean killProcess) {
if (wasTrimmed) {
- trimmed.add(task);
+ mTrimmed.add(task);
}
- removed.add(task);
+ mRemoved.add(task);
}
}
private static class TestTaskPersister extends TaskPersister {
- SparseBooleanArray userTaskIdsOverride;
- ArrayList<TaskRecord> userTasksOverride;
+ public SparseBooleanArray mUserTaskIdsOverride;
+ public ArrayList<TaskRecord> mUserTasksOverride;
TestTaskPersister(File workingDir) {
super(workingDir);
@@ -931,16 +958,16 @@ public class RecentTasksTest extends ActivityTestsBase {
@Override
SparseBooleanArray loadPersistedTaskIdsForUser(int userId) {
- if (userTaskIdsOverride != null) {
- return userTaskIdsOverride;
+ if (mUserTaskIdsOverride != null) {
+ return mUserTaskIdsOverride;
}
return super.loadPersistedTaskIdsForUser(userId);
}
@Override
List<TaskRecord> restoreTasksForUserLocked(int userId, SparseBooleanArray preaddedTasks) {
- if (userTasksOverride != null) {
- return userTasksOverride;
+ if (mUserTasksOverride != null) {
+ return mUserTasksOverride;
}
return super.restoreTasksForUserLocked(userId, preaddedTasks);
}
@@ -955,7 +982,7 @@ public class RecentTasksTest extends ActivityTestsBase {
private boolean mIsTrimmableOverride;
private int mIsCallerRecentsPolicy;
- boolean lastAllowed;
+ public boolean mLastAllowed;
TestRecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) {
super(service, taskPersister);
@@ -1020,7 +1047,7 @@ public class RecentTasksTest extends ActivityTestsBase {
ParceledListSlice<RecentTaskInfo> getRecentTasks(int maxNum, int flags,
boolean getTasksAllowed,
boolean getDetailedTasks, int userId, int callingUid) {
- lastAllowed = getTasksAllowed;
+ mLastAllowed = getTasksAllowed;
return super.getRecentTasks(maxNum, flags, getTasksAllowed, getDetailedTasks, userId,
callingUid);
}
@@ -1032,13 +1059,13 @@ public class RecentTasksTest extends ActivityTestsBase {
}
private static class TestRunningTasks extends RunningTasks {
- boolean lastAllowed;
+ public boolean mLastAllowed;
@Override
void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
int callingUid, boolean allowed) {
- lastAllowed = allowed;
+ mLastAllowed = allowed;
super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
callingUid, allowed);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/am/RecentsAnimationTest.java
index f15b5f7f04b0..36d5c5f7abcd 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/RecentsAnimationTest.java
@@ -38,63 +38,60 @@ import android.view.IRecentsAnimationRunner;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
- * atest FrameworksServicesTests:RecentsAnimationTest
+ * Build/Install/Run:
+ * atest WmTests:RecentsAnimationTest
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class RecentsAnimationTest extends ActivityTestsBase {
private Context mContext = InstrumentationRegistry.getContext();
- private TestActivityTaskManagerService mService;
+ private TestActivityTaskManagerService mTestService;
private ComponentName mRecentsComponent;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
mRecentsComponent = new ComponentName(mContext.getPackageName(), "RecentsActivity");
- mService = spy(new MyTestActivityTaskManagerService(mContext));
- setupActivityManagerService(mService);
+ mTestService = spy(new MyTestActivityTaskManagerService(mContext));
+ setupActivityManagerService(mTestService);
}
@Test
- public void testCancelAnimationOnStackOrderChange() throws Exception {
- ActivityStack fullscreenStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- ActivityStack recentsStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+ public void testCancelAnimationOnStackOrderChange() {
+ ActivityStack fullscreenStack =
+ mTestService.mStackSupervisor.getDefaultDisplay().createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ ActivityStack recentsStack = mTestService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_RECENTS, true /* onTop */);
- ActivityRecord recentsActivity = new ActivityBuilder(mService)
+ ActivityRecord recentsActivity = new ActivityBuilder(mTestService)
.setComponent(mRecentsComponent)
.setCreateTask(true)
.setStack(recentsStack)
.build();
- ActivityStack fullscreenStack2 = mService.mStackSupervisor.getDefaultDisplay().createStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- ActivityRecord fsActivity = new ActivityBuilder(mService)
+ ActivityStack fullscreenStack2 =
+ mTestService.mStackSupervisor.getDefaultDisplay().createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ ActivityRecord fsActivity = new ActivityBuilder(mTestService)
.setComponent(new ComponentName(mContext.getPackageName(), "App1"))
.setCreateTask(true)
.setStack(fullscreenStack2)
.build();
- doReturn(true).when(mService.mWindowManager).canStartRecentsAnimation();
+ doReturn(true).when(mTestService.mWindowManager).canStartRecentsAnimation();
// Start the recents animation
Intent recentsIntent = new Intent();
recentsIntent.setComponent(mRecentsComponent);
- mService.startRecentsActivity(recentsIntent, null, mock(IRecentsAnimationRunner.class));
+ mTestService.startRecentsActivity(recentsIntent, null, mock(IRecentsAnimationRunner.class));
fullscreenStack.moveToFront("Activity start");
// Ensure that the recents animation was canceled
- verify(mService.mWindowManager, times(1)).cancelRecentsAnimationSynchronously(
+ verify(mTestService.mWindowManager, times(1)).cancelRecentsAnimationSynchronously(
eq(REORDER_KEEP_IN_PLACE), any());
}
diff --git a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/am/RunningTasksTest.java
index aa3046fb694c..656cbf0afe07 100644
--- a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/RunningTasksTest.java
@@ -16,55 +16,45 @@
package com.android.server.am;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.server.am.ActivityDisplay.POSITION_BOTTOM;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
-import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.util.SparseArray;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
/**
- * atest FrameworksServicesTests:RunningTasksTest
+ * Build/Install/Run:
+ * atest WmTests:RunningTasksTest
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class RunningTasksTest extends ActivityTestsBase {
- private Context mContext = InstrumentationRegistry.getContext();
-
private RunningTasks mRunningTasks;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
setupActivityTaskManagerService();
mRunningTasks = new RunningTasks();
}
@Test
- public void testCollectTasksByLastActiveTime() throws Exception {
+ public void testCollectTasksByLastActiveTime() {
// Create a number of stacks with tasks (of incrementing active time)
final ArrayList<ActivityDisplay> displays = new ArrayList<>();
final ActivityDisplay display = TestActivityDisplay.create(mSupervisor, DEFAULT_DISPLAY);
@@ -72,8 +62,8 @@ public class RunningTasksTest extends ActivityTestsBase {
final int numStacks = 2;
for (int stackIndex = 0; stackIndex < numStacks; stackIndex++) {
- final ActivityStack stack = new TestActivityStack(display, stackIndex, mSupervisor,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true);
+ final ActivityStack stack =
+ new StackBuilder(mSupervisor).setCreateActivity(false).build();
display.addChild(stack, POSITION_BOTTOM);
}
@@ -89,9 +79,9 @@ public class RunningTasksTest extends ActivityTestsBase {
ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED,
displays, -1 /* callingUid */, true /* allowed */);
- assertTrue(tasks.size() == numFetchTasks);
+ assertThat(tasks).hasSize(numFetchTasks);
for (int i = 0; i < numFetchTasks; i++) {
- assertTrue(tasks.get(i).id == (numTasks - i - 1));
+ assertEquals(numTasks - i - 1, tasks.get(i).id);
}
// Ensure that requesting more than the total number of tasks only returns the subset
@@ -99,9 +89,9 @@ public class RunningTasksTest extends ActivityTestsBase {
tasks.clear();
mRunningTasks.getTasks(100, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED,
displays, -1 /* callingUid */, true /* allowed */);
- assertTrue(tasks.size() == numTasks);
+ assertThat(tasks).hasSize(numTasks);
for (int i = 0; i < numTasks; i++) {
- assertTrue(tasks.get(i).id == (numTasks - i - 1));
+ assertEquals(numTasks - i - 1, tasks.get(i).id);
}
}
@@ -122,4 +112,4 @@ public class RunningTasksTest extends ActivityTestsBase {
.build();
return task;
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/am/SafeActivityOptionsTest.java
index 8e4e7e6b63c3..100e0ddd970d 100644
--- a/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/SafeActivityOptionsTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -23,15 +23,16 @@ import android.platform.test.annotations.Presubmit;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
+/**
+ * Build/Install/Run:
+ * atest WmTests:SafeActivityOptionsTest
+ */
@MediumTest
-@Presubmit
@FlakyTest
-@RunWith(AndroidJUnit4.class)
+@Presubmit
public class SafeActivityOptionsTest {
@Test
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
index 169204fe374a..d5beac3845ac 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
@@ -22,8 +22,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LOCKED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.util.DisplayMetrics.DENSITY_DEFAULT;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -32,7 +30,6 @@ import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.
import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@@ -46,15 +43,13 @@ import android.os.Build;
import android.platform.test.annotations.Presubmit;
import android.view.Gravity;
-import androidx.test.filters.SmallTest;
import androidx.test.filters.FlakyTest;
-import androidx.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
import com.android.server.am.LaunchParamsController.LaunchParams;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.Locale;
@@ -62,12 +57,11 @@ import java.util.Locale;
* Tests for default task bounds.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:TaskLaunchParamsModifierTests
+ * atest WmTests:TaskLaunchParamsModifierTests
*/
@SmallTest
-@Presubmit
-@RunWith(AndroidJUnit4.class)
@FlakyTest(detail = "Confirm stable in post-submit before removing")
+@Presubmit
public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
private ActivityRecord mActivity;
@@ -78,10 +72,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
private LaunchParams mResult;
@Before
- @Override
public void setUp() throws Exception {
- super.setUp();
-
setupActivityTaskManagerService();
mService.mSupportsFreeformWindowManagement = true;
when(mSupervisor.canUseActivityOptionsLaunchBounds(any())).thenCallRealMethod();
@@ -167,6 +158,18 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
assertEquals(fullscreenDisplay.mDisplayId, mResult.mPreferredDisplayId);
}
+ @Test
+ public void testUsesTaskDisplayIdIfSet() {
+ final TestActivityDisplay freeformDisplay = createNewActivityDisplay(
+ WINDOWING_MODE_FREEFORM);
+ ActivityRecord source = createSourceActivity(freeformDisplay);
+
+ assertEquals(RESULT_CONTINUE, mTarget.onCalculate(source.getTask(), null /* layout */,
+ null /* activity */, null /* source */, null /* options */, mCurrent, mResult));
+
+ assertEquals(freeformDisplay.mDisplayId, mResult.mPreferredDisplayId);
+ }
+
// =====================================
// Launch Windowing Mode Related Tests
// =====================================
@@ -1015,8 +1018,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null,
mActivity, /* source */ null, options, mCurrent, mResult));
- assertEquals(new Rect(0, 0, 1680,
- 953), mResult.mBounds);
+ assertEquals(new Rect(0, 0, 1680, 953), mResult.mBounds);
}
private TestActivityDisplay createNewActivityDisplay(int windowingMode) {
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java b/services/tests/wmtests/src/com/android/server/am/TaskPersisterTest.java
index 48bfe1d963af..9da336ff24d6 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/TaskPersisterTest.java
@@ -16,54 +16,56 @@
package com.android.server.am;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static androidx.test.InstrumentationRegistry.getTargetContext;
-
+import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.util.SparseBooleanArray;
+import androidx.test.filters.FlakyTest;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import androidx.test.filters.FlakyTest;
-
/**
* Tests for {@link TaskPersister}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:TaskPersisterTest
+ * atest WmTests:TaskPersisterTest
*/
-@Presubmit
@FlakyTest(detail = "Promote to presubmit if stable")
+@Presubmit
public class TaskPersisterTest {
private static final String TEST_USER_NAME = "AM-Test-User";
private TaskPersister mTaskPersister;
- private int testUserId;
+ private int mTestUserId;
private UserManager mUserManager;
@Before
public void setUp() throws Exception {
- mUserManager = UserManager.get(getTargetContext());
- mTaskPersister = new TaskPersister(getTargetContext().getFilesDir());
+ final Context context = getInstrumentation().getTargetContext();
+ mUserManager = UserManager.get(context);
+ mTaskPersister = new TaskPersister(context.getFilesDir());
// In ARC, the maximum number of supported users is one, which is different from the ones of
// most phones (more than 4). This prevents TaskPersisterTest from creating another user for
// test. However, since guest users can be added as much as possible, we create guest user
// in the test.
- testUserId = createUser(TEST_USER_NAME, UserInfo.FLAG_GUEST);
+ mTestUserId = createUser(TEST_USER_NAME, UserInfo.FLAG_GUEST);
}
@After
public void tearDown() throws Exception {
- mTaskPersister.unloadUserDataFromMemory(testUserId);
- removeUser(testUserId);
+ mTaskPersister.unloadUserDataFromMemory(mTestUserId);
+ removeUser(mTestUserId);
}
private int getRandomTaskIdForUser(int userId) {
@@ -76,11 +78,11 @@ public class TaskPersisterTest {
public void testTaskIdsPersistence() {
SparseBooleanArray taskIdsOnFile = new SparseBooleanArray();
for (int i = 0; i < 100; i++) {
- taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true);
+ taskIdsOnFile.put(getRandomTaskIdForUser(mTestUserId), true);
}
- mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, testUserId);
+ mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, mTestUserId);
SparseBooleanArray newTaskIdsOnFile = mTaskPersister
- .loadPersistedTaskIdsForUser(testUserId);
+ .loadPersistedTaskIdsForUser(mTestUserId);
assertEquals("TaskIds written differ from TaskIds read back from file",
taskIdsOnFile, newTaskIdsOnFile);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/am/TaskRecordTests.java
index 27766d3d8d6c..240a1d102aef 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/am/TaskRecordTests.java
@@ -12,7 +12,6 @@
* 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.am;
@@ -35,14 +34,12 @@ import android.service.voice.IVoiceInteractionSession;
import android.util.Xml;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.internal.app.IVoiceInteractor;
import com.android.server.am.TaskRecord.TaskRecordFactory;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -60,18 +57,16 @@ import java.util.ArrayList;
* Tests for exercising {@link TaskRecord}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.TaskRecordTests
+ * atest WmTests:TaskRecordTests
*/
@MediumTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class TaskRecordTests extends ActivityTestsBase {
private static final String TASK_TAG = "task";
@Before
public void setUp() throws Exception {
- super.setUp();
TaskRecord.setTaskRecordFactory(null);
setupActivityTaskManagerService();
}
@@ -124,7 +119,7 @@ public class TaskRecordTests extends ActivityTestsBase {
private File serializeToFile(TaskRecord r) throws IOException, XmlPullParserException {
final File tmpFile = File.createTempFile(r.taskId + "_task_", "xml");
- try (final OutputStream os = new FileOutputStream(tmpFile)) {
+ try (OutputStream os = new FileOutputStream(tmpFile)) {
final XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(os, "UTF-8");
serializer.startDocument(null, true);
@@ -138,7 +133,7 @@ public class TaskRecordTests extends ActivityTestsBase {
}
private TaskRecord restoreFromFile(File file) throws IOException, XmlPullParserException {
- try (final Reader reader = new BufferedReader(new FileReader(file))) {
+ try (Reader reader = new BufferedReader(new FileReader(file))) {
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(reader);
assertEquals(XmlPullParser.START_TAG, parser.next());
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java b/services/tests/wmtests/src/com/android/server/am/TaskStackChangedListenerTest.java
index 3f7c7148381e..6888da664146 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/TaskStackChangedListenerTest.java
@@ -11,12 +11,12 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
-import static androidx.test.InstrumentationRegistry.getInstrumentation;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -38,23 +38,22 @@ import android.os.RemoteException;
import android.support.test.uiautomator.UiDevice;
import android.text.TextUtils;
-import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.test.runner.AndroidJUnit4;
import com.android.internal.annotations.GuardedBy;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+/**
+ * Build/Install/Run:
+ * atest WmTests:TaskStackChangedListenerTest
+ */
@MediumTest
-@RunWith(AndroidJUnit4.class)
public class TaskStackChangedListenerTest {
private IActivityManager mService;
@@ -87,13 +86,13 @@ public class TaskStackChangedListenerTest {
}
});
- Context ctx = InstrumentationRegistry.getContext();
- ctx.startActivity(new Intent(ctx, ActivityA.class));
+ Context context = getInstrumentation().getContext();
+ context.startActivity(new Intent(context, ActivityA.class));
UiDevice.getInstance(getInstrumentation()).waitForIdle();
synchronized (sLock) {
- Assert.assertTrue(sTaskStackChangedCalled);
+ assertTrue(sTaskStackChangedCalled);
}
- Assert.assertTrue(sActivityBResumed);
+ assertTrue(sActivityBResumed);
}
@Test
@@ -101,17 +100,17 @@ public class TaskStackChangedListenerTest {
final Object[] params = new Object[2];
final CountDownLatch latch = new CountDownLatch(1);
registerTaskStackChangedListener(new TaskStackListener() {
- int taskId = -1;
+ int mTaskId = -1;
@Override
public void onTaskCreated(int taskId, ComponentName componentName)
throws RemoteException {
- this.taskId = taskId;
+ mTaskId = taskId;
}
@Override
public void onTaskDescriptionChanged(int taskId, TaskDescription td)
throws RemoteException {
- if (this.taskId == taskId && !TextUtils.isEmpty(td.getLabel())) {
+ if (mTaskId == taskId && !TextUtils.isEmpty(td.getLabel())) {
params[0] = taskId;
params[1] = td;
latch.countDown();
@@ -204,7 +203,7 @@ public class TaskStackChangedListenerTest {
activity.finishAndRemoveTask();
waitForCallback(taskRemovalStartedLatch);
// onTaskRemovalStarted happens before the activity's window is removed.
- assertFalse(activity.onDetachedFromWindowCalled);
+ assertFalse(activity.mOnDetachedFromWindowCalled);
assertEquals(id, params[0]);
// Test for onTaskRemoved.
@@ -212,19 +211,18 @@ public class TaskStackChangedListenerTest {
waitForCallback(taskRemovedLatch);
assertEquals(id, params[0]);
waitForCallback(onDetachedFromWindowLatch);
- assertTrue(activity.onDetachedFromWindowCalled);
+ assertTrue(activity.mOnDetachedFromWindowCalled);
}
/**
* Starts the provided activity and returns the started instance.
*/
private TestActivity startTestActivity(Class<?> activityClass) throws InterruptedException {
- final Context context = InstrumentationRegistry.getContext();
- final ActivityMonitor monitor =
- new ActivityMonitor(activityClass.getName(), null, false);
- InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
+ final ActivityMonitor monitor = new ActivityMonitor(activityClass.getName(), null, false);
+ getInstrumentation().addMonitor(monitor);
+ final Context context = getInstrumentation().getContext();
context.startActivity(new Intent(context, activityClass));
- final TestActivity activity = (TestActivity)monitor.waitForActivityWithTimeout(1000);
+ final TestActivity activity = (TestActivity) monitor.waitForActivityWithTimeout(1000);
if (activity == null) {
throw new RuntimeException("Timed out waiting for Activity");
}
@@ -239,11 +237,12 @@ public class TaskStackChangedListenerTest {
private void waitForCallback(CountDownLatch latch) {
try {
- final boolean result = latch.await(2, TimeUnit.SECONDS);
+ final boolean result = latch.await(2, TimeUnit.SECONDS);
if (!result) {
throw new RuntimeException("Timed out waiting for task stack change notification");
}
- }catch (InterruptedException e) {}
+ } catch (InterruptedException e) {
+ }
}
public static class TestActivity extends Activity {
@@ -271,6 +270,7 @@ public class TaskStackChangedListenerTest {
* If isResumed is {@code true}, sleep the thread until the activity is resumed.
* if {@code false}, sleep the thread until the activity is paused.
*/
+ @SuppressWarnings("WaitNotInLoop")
public void waitForResumeStateChange(boolean isResumed) throws InterruptedException {
synchronized (this) {
if (mIsResumed == isResumed) {
@@ -278,7 +278,7 @@ public class TaskStackChangedListenerTest {
}
wait(5000);
}
- assertTrue("The activity resume state change timed out", mIsResumed == isResumed);
+ assertEquals("The activity resume state change timed out", isResumed, mIsResumed);
}
}
@@ -330,17 +330,17 @@ public class TaskStackChangedListenerTest {
}
public static class ActivityTaskChangeCallbacks extends TestActivity {
- boolean onDetachedFromWindowCalled = false;
- CountDownLatch onDetachedFromWindowCountDownLatch;
+ public boolean mOnDetachedFromWindowCalled = false;
+ private CountDownLatch mOnDetachedFromWindowCountDownLatch;
@Override
public void onDetachedFromWindow() {
- onDetachedFromWindowCalled = true;
- onDetachedFromWindowCountDownLatch.countDown();
+ mOnDetachedFromWindowCalled = true;
+ mOnDetachedFromWindowCountDownLatch.countDown();
}
void setDetachedFromWindowLatch(CountDownLatch countDownLatch) {
- onDetachedFromWindowCountDownLatch = countDownLatch;
+ mOnDetachedFromWindowCountDownLatch = countDownLatch;
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/wmtests/src/com/android/server/am/UserControllerTest.java
index 75e1d0d800db..e55c4f7031a8 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/am/UserControllerTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.am;
@@ -19,6 +19,8 @@ package com.android.server.am;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
import static com.android.server.am.UserController.CONTINUE_USER_SWITCH_MSG;
import static com.android.server.am.UserController.REPORT_LOCKED_BOOT_COMPLETE_MSG;
import static com.android.server.am.UserController.REPORT_USER_SWITCH_COMPLETE_MSG;
@@ -49,8 +51,6 @@ import static org.mockito.Mockito.validateMockitoUsage;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static androidx.test.InstrumentationRegistry.getTargetContext;
-
import android.app.IUserSwitchObserver;
import android.content.Context;
import android.content.IIntentReceiver;
@@ -68,6 +68,8 @@ import android.os.UserManagerInternal;
import android.platform.test.annotations.Presubmit;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+
import com.android.server.pm.UserManagerService;
import com.android.server.wm.WindowManagerService;
@@ -81,20 +83,18 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
-import androidx.test.filters.SmallTest;
-
/**
* Tests for {@link UserController}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.am.UserControllerTest
+ * atest WmTests:UserControllerTest
*/
-@Presubmit
@SmallTest
+@Presubmit
public class UserControllerTest {
private static final int TEST_USER_ID = 10;
private static final int NONEXIST_USER_ID = 2;
- private static String TAG = UserControllerTest.class.getSimpleName();
+ private static final String TAG = UserControllerTest.class.getSimpleName();
private UserController mUserController;
private TestInjector mInjector;
@@ -121,7 +121,7 @@ public class UserControllerTest {
@Before
public void setUp() throws Exception {
runWithDexmakerShareClassLoader(() -> {
- mInjector = spy(new TestInjector(getTargetContext()));
+ mInjector = spy(new TestInjector(getInstrumentation().getTargetContext()));
doNothing().when(mInjector).clearAllLockedTasks(anyString());
doNothing().when(mInjector).startHomeActivity(anyInt(), anyString());
doReturn(false).when(mInjector).stackSupervisorSwitchUser(anyInt(), any());
@@ -133,7 +133,7 @@ public class UserControllerTest {
@After
public void tearDown() throws Exception {
- mInjector.handlerThread.quit();
+ mInjector.mHandlerThread.quit();
validateMockitoUsage();
}
@@ -169,8 +169,8 @@ public class UserControllerTest {
private void startUserAssertions(
List<String> expectedActions, Set<Integer> expectedMessageCodes) {
- assertEquals(expectedActions, getActions(mInjector.sentIntents));
- Set<Integer> actualCodes = mInjector.handler.getMessageCodes();
+ assertEquals(expectedActions, getActions(mInjector.mSentIntents));
+ Set<Integer> actualCodes = mInjector.mHandler.getMessageCodes();
assertEquals("Unexpected message sent", expectedMessageCodes, actualCodes);
}
@@ -180,7 +180,7 @@ public class UserControllerTest {
private void startForegroundUserAssertions() {
startUserAssertions(START_FOREGROUND_USER_ACTIONS, START_FOREGROUND_USER_MESSAGE_CODES);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
assertNotNull(userState);
@@ -211,19 +211,19 @@ public class UserControllerTest {
mUserController.registerUserSwitchObserver(observer, "mock");
// Start user -- this will update state of mUserController
mUserController.startUser(TEST_USER_ID, true);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
int oldUserId = reportMsg.arg1;
int newUserId = reportMsg.arg2;
// Call dispatchUserSwitch and verify that observer was called only once
- mInjector.handler.clearAllRecordedMessages();
+ mInjector.mHandler.clearAllRecordedMessages();
mUserController.dispatchUserSwitch(userState, oldUserId, newUserId);
verify(observer, times(1)).onUserSwitching(eq(TEST_USER_ID), any());
Set<Integer> expectedCodes = Collections.singleton(CONTINUE_USER_SWITCH_MSG);
- Set<Integer> actualCodes = mInjector.handler.getMessageCodes();
+ Set<Integer> actualCodes = mInjector.mHandler.getMessageCodes();
assertEquals("Unexpected message sent", expectedCodes, actualCodes);
- Message conMsg = mInjector.handler.getMessageForCode(CONTINUE_USER_SWITCH_MSG);
+ Message conMsg = mInjector.mHandler.getMessageForCode(CONTINUE_USER_SWITCH_MSG);
assertNotNull(conMsg);
userState = (UserState) conMsg.obj;
assertNotNull(userState);
@@ -241,17 +241,17 @@ public class UserControllerTest {
mUserController.registerUserSwitchObserver(observer, "mock");
// Start user -- this will update state of mUserController
mUserController.startUser(TEST_USER_ID, true);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
int oldUserId = reportMsg.arg1;
int newUserId = reportMsg.arg2;
// Call dispatchUserSwitch and verify that observer was called only once
- mInjector.handler.clearAllRecordedMessages();
+ mInjector.mHandler.clearAllRecordedMessages();
mUserController.dispatchUserSwitch(userState, oldUserId, newUserId);
verify(observer, times(1)).onUserSwitching(eq(TEST_USER_ID), any());
// Verify that CONTINUE_USER_SWITCH_MSG is not sent (triggers timeout)
- Set<Integer> actualCodes = mInjector.handler.getMessageCodes();
+ Set<Integer> actualCodes = mInjector.mHandler.getMessageCodes();
assertWithMessage("No messages should be sent").that(actualCodes).isEmpty();
}
@@ -259,12 +259,12 @@ public class UserControllerTest {
public void testContinueUserSwitch() {
// Start user -- this will update state of mUserController
mUserController.startUser(TEST_USER_ID, true);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
int oldUserId = reportMsg.arg1;
int newUserId = reportMsg.arg2;
- mInjector.handler.clearAllRecordedMessages();
+ mInjector.mHandler.clearAllRecordedMessages();
// Verify that continueUserSwitch worked as expected
mUserController.continueUserSwitch(userState, oldUserId, newUserId);
verify(mInjector.getWindowManager(), times(1)).stopFreezingScreen();
@@ -276,12 +276,12 @@ public class UserControllerTest {
mUserController.mUserSwitchUiEnabled = false;
// Start user -- this will update state of mUserController
mUserController.startUser(TEST_USER_ID, true);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
int oldUserId = reportMsg.arg1;
int newUserId = reportMsg.arg2;
- mInjector.handler.clearAllRecordedMessages();
+ mInjector.mHandler.clearAllRecordedMessages();
// Verify that continueUserSwitch worked as expected
mUserController.continueUserSwitch(userState, oldUserId, newUserId);
verify(mInjector.getWindowManager(), never()).stopFreezingScreen();
@@ -290,9 +290,9 @@ public class UserControllerTest {
private void continueUserSwitchAssertions() {
Set<Integer> expectedCodes = Collections.singleton(REPORT_USER_SWITCH_COMPLETE_MSG);
- Set<Integer> actualCodes = mInjector.handler.getMessageCodes();
+ Set<Integer> actualCodes = mInjector.mHandler.getMessageCodes();
assertEquals("Unexpected message sent", expectedCodes, actualCodes);
- Message msg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_COMPLETE_MSG);
+ Message msg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_COMPLETE_MSG);
assertNotNull(msg);
assertEquals("Unexpected userId", TEST_USER_ID, msg.arg1);
}
@@ -305,10 +305,10 @@ public class UserControllerTest {
mUserController.registerUserSwitchObserver(observer, "mock");
// Start user -- this will update state of mUserController
mUserController.startUser(TEST_USER_ID, true);
- Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
+ Message reportMsg = mInjector.mHandler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
int newUserId = reportMsg.arg2;
- mInjector.handler.clearAllRecordedMessages();
+ mInjector.mHandler.clearAllRecordedMessages();
// Mockito can't reset only interactions, so just verify that this hasn't been
// called with 'false' until after dispatchUserSwitchComplete.
verify(mInjector.getWindowManager(), never()).setSwitchingUser(false);
@@ -321,7 +321,7 @@ public class UserControllerTest {
private void setUpUser(int userId, int flags) {
UserInfo userInfo = new UserInfo(userId, "User" + userId, flags);
- when(mInjector.userManagerMock.getUserInfo(eq(userId))).thenReturn(userInfo);
+ when(mInjector.mUserManagerMock.getUserInfo(eq(userId))).thenReturn(userInfo);
}
private static List<String> getActions(List<Intent> intents) {
@@ -334,45 +334,46 @@ public class UserControllerTest {
// Should be public to allow mocking
private static class TestInjector extends UserController.Injector {
- TestHandler handler;
- TestHandler uiHandler;
- HandlerThread handlerThread;
- UserManagerService userManagerMock;
- UserManagerInternal userManagerInternalMock;
- WindowManagerService windowManagerMock;
- private Context mCtx;
- List<Intent> sentIntents = new ArrayList<>();
+ public final TestHandler mHandler;
+ public final HandlerThread mHandlerThread;
+ public final UserManagerService mUserManagerMock;
+ public final List<Intent> mSentIntents = new ArrayList<>();
+
+ private final TestHandler mUiHandler;
+ private final UserManagerInternal mUserManagerInternalMock;
+ private final WindowManagerService mWindowManagerMock;
+ private final Context mCtx;
TestInjector(Context ctx) {
super(null);
mCtx = ctx;
- handlerThread = new HandlerThread(TAG);
- handlerThread.start();
- handler = new TestHandler(handlerThread.getLooper());
- uiHandler = new TestHandler(handlerThread.getLooper());
- userManagerMock = mock(UserManagerService.class);
- userManagerInternalMock = mock(UserManagerInternal.class);
- windowManagerMock = mock(WindowManagerService.class);
+ mHandlerThread = new HandlerThread(TAG);
+ mHandlerThread.start();
+ mHandler = new TestHandler(mHandlerThread.getLooper());
+ mUiHandler = new TestHandler(mHandlerThread.getLooper());
+ mUserManagerMock = mock(UserManagerService.class);
+ mUserManagerInternalMock = mock(UserManagerInternal.class);
+ mWindowManagerMock = mock(WindowManagerService.class);
}
@Override
protected Handler getHandler(Handler.Callback callback) {
- return handler;
+ return mHandler;
}
@Override
protected Handler getUiHandler(Handler.Callback callback) {
- return uiHandler;
+ return mUiHandler;
}
@Override
protected UserManagerService getUserManager() {
- return userManagerMock;
+ return mUserManagerMock;
}
@Override
UserManagerInternal getUserManagerInternal() {
- return userManagerInternalMock;
+ return mUserManagerInternalMock;
}
@Override
@@ -388,7 +389,7 @@ public class UserControllerTest {
@Override
WindowManagerService getWindowManager() {
- return windowManagerMock;
+ return mWindowManagerMock;
}
@Override
@@ -402,7 +403,7 @@ public class UserControllerTest {
String[] requiredPermissions, int appOp, Bundle bOptions, boolean ordered,
boolean sticky, int callingPid, int callingUid, int userId) {
Log.i(TAG, "broadcastIntentLocked " + intent);
- sentIntents.add(intent);
+ mSentIntents.add(intent);
return 0;
}
diff --git a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java b/services/tests/wmtests/src/com/android/server/policy/FakeWindowState.java
index d34f951ffd61..d4f2b061d570 100644
--- a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
+++ b/services/tests/wmtests/src/com/android/server/policy/FakeWindowState.java
@@ -16,17 +16,13 @@
package com.android.server.policy;
-import android.annotation.Nullable;
-import android.graphics.Point;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
-import android.view.DisplayCutout;
import android.view.IApplicationToken;
import android.view.WindowManager;
import com.android.server.wm.WindowFrames;
-import com.android.server.wm.utils.WmDisplayCutout;
public class FakeWindowState implements WindowManagerPolicy.WindowState {
@@ -243,10 +239,12 @@ public class FakeWindowState implements WindowManagerPolicy.WindowState {
}
@Override
- public boolean canReceiveKeys() { return false; }
+ public boolean canReceiveKeys() {
+ return false;
+ }
@Override
- public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId){
+ public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId) {
throw new UnsupportedOperationException("not implemented");
}
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
index cce6ba718400..f024fe77aaf7 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
@@ -29,15 +29,16 @@ import android.view.Display;
import android.view.DisplayInfo;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:PhoneWindowManagerInsetsTest
+ */
@SmallTest
@Presubmit
public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
@@ -52,7 +53,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void portrait() throws Exception {
+ public void portrait() {
DisplayInfo di = displayInfoForRotation(ROTATION_0, false /* withCutout */);
verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
@@ -61,7 +62,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void portrait_withCutout() throws Exception {
+ public void portrait_withCutout() {
DisplayInfo di = displayInfoForRotation(ROTATION_0, true /* withCutout */);
verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
@@ -70,7 +71,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void landscape() throws Exception {
+ public void landscape() {
DisplayInfo di = displayInfoForRotation(ROTATION_90, false /* withCutout */);
verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
@@ -79,7 +80,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void landscape_withCutout() throws Exception {
+ public void landscape_withCutout() {
DisplayInfo di = displayInfoForRotation(ROTATION_90, true /* withCutout */);
verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
@@ -88,7 +89,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void seascape() throws Exception {
+ public void seascape() {
DisplayInfo di = displayInfoForRotation(ROTATION_270, false /* withCutout */);
verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0);
@@ -97,7 +98,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void seascape_withCutout() throws Exception {
+ public void seascape_withCutout() {
DisplayInfo di = displayInfoForRotation(ROTATION_270, true /* withCutout */);
verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0);
@@ -106,7 +107,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void upsideDown() throws Exception {
+ public void upsideDown() {
DisplayInfo di = displayInfoForRotation(ROTATION_180, false /* withCutout */);
verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
@@ -115,7 +116,7 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
}
@Test
- public void upsideDown_withCutout() throws Exception {
+ public void upsideDown_withCutout() {
DisplayInfo di = displayInfoForRotation(ROTATION_180, true /* withCutout */);
verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT + DISPLAY_CUTOUT_HEIGHT);
@@ -181,4 +182,4 @@ public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
return mPolicy.getConfigDisplayHeight(di.logicalWidth, di.logicalHeight, di.rotation,
0 /* ui */, Display.DEFAULT_DISPLAY, di.displayCutout);
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
index fee761dd92d3..e8f767a873d3 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
@@ -43,13 +43,14 @@ import android.view.DisplayCutout;
import android.view.WindowManager;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:PhoneWindowManagerLayoutTest
+ */
@SmallTest
@Presubmit
public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
@@ -69,7 +70,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
}
@Test
- public void layoutWindowLw_appDrawsBars() throws Exception {
+ public void layoutWindowLw_appDrawsBars() {
mAppWindow.attrs.flags |= FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
mPolicy.addWindow(mAppWindow);
@@ -84,7 +85,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
}
@Test
- public void layoutWindowLw_appWontDrawBars() throws Exception {
+ public void layoutWindowLw_appWontDrawBars() {
mAppWindow.attrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
mPolicy.addWindow(mAppWindow);
@@ -99,7 +100,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
}
@Test
- public void layoutWindowLw_appWontDrawBars_forceStatus() throws Exception {
+ public void layoutWindowLw_appWontDrawBars_forceStatus() {
mAppWindow.attrs.flags &= ~FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
mAppWindow.attrs.privateFlags |= PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
mPolicy.addWindow(mAppWindow);
@@ -391,4 +392,4 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
assertThat(outOutsets, is(new Rect()));
assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper()));
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTest.java
index d92d7e03ef3b..6c44d655459e 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTest.java
@@ -47,12 +47,13 @@ import android.platform.test.annotations.Presubmit;
import android.view.WindowManager;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:PhoneWindowManagerTest
+ */
@SmallTest
@Presubmit
public class PhoneWindowManagerTest {
@@ -95,7 +96,7 @@ public class PhoneWindowManagerTest {
@Test
- public void testChooseNavigationColorWindowLw() throws Exception {
+ public void testChooseNavigationColorWindowLw() {
final FakeWindowState opaque = createOpaqueFullscreen(false);
final FakeWindowState dimmingImTarget = createDimmingDialogWindow(true);
@@ -147,14 +148,14 @@ public class PhoneWindowManagerTest {
}
@Test
- public void testUpdateLightNavigationBarLw() throws Exception {
+ public void testUpdateLightNavigationBarLw() {
final FakeWindowState opaqueDarkNavBar = createOpaqueFullscreen(false);
final FakeWindowState opaqueLightNavBar = createOpaqueFullscreen(true);
final FakeWindowState dimming = createDimmingDialogWindow(false);
- final FakeWindowState imeDrawDarkNavBar = createInputMethodWindow(true,true, false);
- final FakeWindowState imeDrawLightNavBar = createInputMethodWindow(true,true, true);
+ final FakeWindowState imeDrawDarkNavBar = createInputMethodWindow(true, true, false);
+ final FakeWindowState imeDrawLightNavBar = createInputMethodWindow(true, true, true);
assertEquals(SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,
PhoneWindowManager.updateLightNavigationBarLw(
@@ -204,7 +205,7 @@ public class PhoneWindowManagerTest {
}
@Test
- public void testIsDockSideAllowedDockTop() throws Exception {
+ public void testIsDockSideAllowedDockTop() {
// Docked top is always allowed
assertTrue(PhoneWindowManager.isDockSideAllowed(DOCKED_TOP, DOCKED_LEFT, NAV_BAR_BOTTOM,
true /* navigationBarCanMove */));
@@ -213,14 +214,14 @@ public class PhoneWindowManagerTest {
}
@Test
- public void testIsDockSideAllowedDockBottom() throws Exception {
+ public void testIsDockSideAllowedDockBottom() {
// Cannot dock bottom
assertFalse(PhoneWindowManager.isDockSideAllowed(DOCKED_BOTTOM, DOCKED_LEFT, NAV_BAR_BOTTOM,
true /* navigationBarCanMove */));
}
@Test
- public void testIsDockSideAllowedNavigationBarMovable() throws Exception {
+ public void testIsDockSideAllowedNavigationBarMovable() {
assertFalse(PhoneWindowManager.isDockSideAllowed(DOCKED_LEFT, DOCKED_LEFT, NAV_BAR_BOTTOM,
true /* navigationBarCanMove */));
assertFalse(PhoneWindowManager.isDockSideAllowed(DOCKED_LEFT, DOCKED_LEFT, NAV_BAR_LEFT,
@@ -236,7 +237,7 @@ public class PhoneWindowManagerTest {
}
@Test
- public void testIsDockSideAllowedNavigationBarNotMovable() throws Exception {
+ public void testIsDockSideAllowedNavigationBarNotMovable() {
// Navigation bar is not movable such as tablets
assertTrue(PhoneWindowManager.isDockSideAllowed(DOCKED_LEFT, DOCKED_LEFT, NAV_BAR_BOTTOM,
false /* navigationBarCanMove */));
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
index e16f118cd63b..fc8fe2377bf0 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
+++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
@@ -64,7 +64,7 @@ import com.android.server.wm.utils.WmDisplayCutout;
import org.junit.Before;
-public class PhoneWindowManagerTestBase {
+class PhoneWindowManagerTestBase {
static final int DISPLAY_WIDTH = 500;
static final int DISPLAY_HEIGHT = 1000;
@@ -82,7 +82,7 @@ public class PhoneWindowManagerTestBase {
private int mRotation = ROTATION_0;
@Before
- public void setUpBase() throws Exception {
+ public void setUpBase() {
mContext = new TestContextWrapper(InstrumentationRegistry.getTargetContext());
mContext.getResourceMocker().addOverride(
com.android.internal.R.dimen.status_bar_height_portrait, STATUS_BAR_HEIGHT);
@@ -207,7 +207,7 @@ public class PhoneWindowManagerTestBase {
static class TestContextWrapper extends ContextWrapper {
private final TestableResources mResourceMocker;
- public TestContextWrapper(Context targetContext) {
+ TestContextWrapper(Context targetContext) {
super(targetContext);
mResourceMocker = new TestableResources(targetContext.getResources());
}
@@ -234,7 +234,7 @@ public class PhoneWindowManagerTestBase {
static class TestablePhoneWindowManager extends PhoneWindowManager {
- public TestablePhoneWindowManager() {
+ TestablePhoneWindowManager() {
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java
index 2b8214d162c9..82a200bc207f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java
@@ -11,13 +11,12 @@
* 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
+ * limitations under the License.
*/
package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -36,10 +35,8 @@ import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
@@ -48,15 +45,14 @@ import java.util.List;
* Test class for {@link ConfigurationContainer}.
*
* Build/Install/Run:
- * bit FrameworksServicesTests:com.android.server.wm.ConfigurationContainerTests
+ * atest WmTests:ConfigurationContainerTests
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ConfigurationContainerTests {
@Test
- public void testConfigurationInit() throws Exception {
+ public void testConfigurationInit() {
// Check root container initial config.
final TestConfigurationContainer root = new TestConfigurationContainer();
assertEquals(EMPTY, root.getOverrideConfiguration());
@@ -93,7 +89,7 @@ public class ConfigurationContainerTests {
}
@Test
- public void testConfigurationChangeOnAddRemove() throws Exception {
+ public void testConfigurationChangeOnAddRemove() {
// Init root's config.
final TestConfigurationContainer root = new TestConfigurationContainer();
final Configuration rootOverrideConfig = new Configuration();
@@ -135,7 +131,7 @@ public class ConfigurationContainerTests {
}
@Test
- public void testConfigurationChangePropagation() throws Exception {
+ public void testConfigurationChangePropagation() {
// Builds 3-level vertical hierarchy with one configuration container on each level.
// In addition to different overrides on each level, everyone in hierarchy will have one
// common overridden value - orientation;
@@ -212,7 +208,7 @@ public class ConfigurationContainerTests {
}
@Test
- public void testSetWindowingMode() throws Exception {
+ public void testSetWindowingMode() {
final TestConfigurationContainer root = new TestConfigurationContainer();
root.setWindowingMode(WINDOWING_MODE_UNDEFINED);
final TestConfigurationContainer child = root.addChild();
@@ -226,7 +222,7 @@ public class ConfigurationContainerTests {
}
@Test
- public void testSetActivityType() throws Exception {
+ public void testSetActivityType() {
final TestConfigurationContainer root = new TestConfigurationContainer();
root.setActivityType(ACTIVITY_TYPE_UNDEFINED);
final TestConfigurationContainer child = root.addChild();
@@ -272,7 +268,7 @@ public class ConfigurationContainerTests {
}
@Test
- public void testRegisterConfigurationChangeListener() throws Exception {
+ public void testRegisterConfigurationChangeListener() {
final TestConfigurationContainer container = new TestConfigurationContainer();
final TestConfigurationChangeListener listener = new TestConfigurationChangeListener();
final Configuration config = new Configuration();
@@ -328,10 +324,11 @@ public class ConfigurationContainerTests {
}
}
- private class TestConfigurationChangeListener implements ConfigurationContainerListener {
+ private static class TestConfigurationChangeListener implements ConfigurationContainerListener {
final Configuration mOverrideConfiguration = new Configuration();
+ @Override
public void onOverrideConfigurationChanged(Configuration overrideConfiguration) {
mOverrideConfiguration.setTo(overrideConfiguration);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
index ae40f7e7d235..36eccd1892a7 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.wm;
@@ -33,6 +33,8 @@ import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertEquals;
import android.app.Activity;
@@ -46,6 +48,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.ImageReader;
import android.os.Handler;
+import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
import android.view.Display;
@@ -57,13 +60,10 @@ import android.widget.TextView;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.function.BooleanSupplier;
@@ -72,13 +72,12 @@ import java.util.function.BooleanSupplier;
* Tests for the {@link android.view.WindowManager.LayoutParams#PRIVATE_FLAG_IS_SCREEN_DECOR} flag.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests
+ * atest WmTests:ScreenDecorWindowTests
*/
// TODO: Add test for FLAG_FULLSCREEN which hides the status bar and also other flags.
// TODO: Test non-Activity windows.
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class ScreenDecorWindowTests {
private final Context mContext = InstrumentationRegistry.getTargetContext();
@@ -120,7 +119,7 @@ public class ScreenDecorWindowTests {
}
@Test
- public void testScreenSides() throws Exception {
+ public void testScreenSides() {
// Decor on top
final View decorWindow = createDecorWindow(TOP, MATCH_PARENT, mDecorThickness);
assertInsetGreaterOrEqual(mTestActivity, TOP, mDecorThickness);
@@ -139,7 +138,7 @@ public class ScreenDecorWindowTests {
}
@Test
- public void testMultipleDecors() throws Exception {
+ public void testMultipleDecors() {
// Test 2 decor windows on-top.
createDecorWindow(TOP, MATCH_PARENT, mHalfDecorThickness);
assertInsetGreaterOrEqual(mTestActivity, TOP, mHalfDecorThickness);
@@ -153,7 +152,7 @@ public class ScreenDecorWindowTests {
}
@Test
- public void testFlagChange() throws Exception {
+ public void testFlagChange() {
WindowInsets initialInsets = getInsets(mTestActivity);
final View decorWindow = createDecorWindow(TOP, MATCH_PARENT, mDecorThickness);
@@ -174,7 +173,7 @@ public class ScreenDecorWindowTests {
}
@Test
- public void testRemoval() throws Exception {
+ public void testRemoval() {
WindowInsets initialInsets = getInsets(mTestActivity);
final View decorWindow = createDecorWindow(TOP, MATCH_PARENT, mDecorThickness);
@@ -256,7 +255,7 @@ public class ScreenDecorWindowTests {
/**
* Asserts the top inset of {@param activity} is equal to {@param expected} waiting as needed.
*/
- private void assertTopInsetEquals(Activity activity, int expected) throws Exception {
+ private void assertTopInsetEquals(Activity activity, int expected) {
waitForTopInsetEqual(activity, expected);
assertEquals(expected, getInsets(activity).getSystemWindowInsetTop());
}
@@ -269,16 +268,23 @@ public class ScreenDecorWindowTests {
* Asserts the inset at {@param side} of {@param activity} is equal to {@param expected}
* waiting as needed.
*/
- private void assertInsetGreaterOrEqual(Activity activity, int side, int expected)
- throws Exception {
+ private void assertInsetGreaterOrEqual(Activity activity, int side, int expected) {
waitForInsetGreaterOrEqual(activity, side, expected);
final WindowInsets insets = getInsets(activity);
switch (side) {
- case TOP: assertGreaterOrEqual(insets.getSystemWindowInsetTop(), expected); break;
- case BOTTOM: assertGreaterOrEqual(insets.getSystemWindowInsetBottom(), expected); break;
- case LEFT: assertGreaterOrEqual(insets.getSystemWindowInsetLeft(), expected); break;
- case RIGHT: assertGreaterOrEqual(insets.getSystemWindowInsetRight(), expected); break;
+ case TOP:
+ assertThat(insets.getSystemWindowInsetTop()).isAtLeast(expected);
+ break;
+ case BOTTOM:
+ assertThat(insets.getSystemWindowInsetBottom()).isAtLeast(expected);
+ break;
+ case LEFT:
+ assertThat(insets.getSystemWindowInsetLeft()).isAtLeast(expected);
+ break;
+ case RIGHT:
+ assertThat(insets.getSystemWindowInsetRight()).isAtLeast(expected);
+ break;
}
}
@@ -295,22 +301,13 @@ public class ScreenDecorWindowTests {
});
}
- /** Asserts that the first entry is greater than or equal to the second entry. */
- private void assertGreaterOrEqual(int first, int second) throws Exception {
- Assert.assertTrue("Excepted " + first + " >= " + second, first >= second);
- }
-
private void waitFor(BooleanSupplier waitCondition) {
int retriesLeft = 5;
do {
if (waitCondition.getAsBoolean()) {
break;
}
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- // Well I guess we are not waiting...
- }
+ SystemClock.sleep(500);
} while (retriesLeft-- > 0);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java
index 827d938aa73e..21e5d991b63b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.wm;
@@ -33,19 +33,17 @@ import android.view.animation.Animation;
import android.view.animation.ClipRectAnimation;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* Tests for the {@link WindowAnimationSpec} class.
*
- * atest FrameworksServicesTests:com.android.server.wm.WindowAnimationSpecTest
+ * Build/Install/Run:
+ * atest WmTests:WindowAnimationSpecTest
*/
@SmallTest
@Presubmit
-@RunWith(AndroidJUnit4.class)
public class WindowAnimationSpecTest {
private final SurfaceControl mSurfaceControl = mock(SurfaceControl.class);
private final SurfaceControl.Transaction mTransaction = mock(SurfaceControl.Transaction.class);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
new file mode 100644
index 000000000000..dc91f9d2cdca
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyFloat;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.view.Display;
+import android.view.Surface;
+
+import org.mockito.invocation.InvocationOnMock;
+
+/**
+ * A collection of static functions that can be referenced by other test packages to provide access
+ * to WindowManager related test functionality.
+ */
+public class WindowTestUtils {
+ /**
+ * Retrieves an instance of a mock {@link WindowManagerService}.
+ */
+ public static WindowManagerService getMockWindowManagerService() {
+ final WindowManagerService service = mock(WindowManagerService.class);
+ final WindowHashMap windowMap = new WindowHashMap();
+ when(service.getWindowManagerLock()).thenReturn(windowMap);
+ return service;
+ }
+
+ /** An extension of {@link DisplayContent} to gain package scoped access. */
+ public static class TestDisplayContent extends DisplayContent {
+
+ private TestDisplayContent(Display display, WindowManagerService service,
+ WallpaperController wallpaperController, DisplayWindowController controller) {
+ super(display, service, wallpaperController, controller);
+ }
+
+ /** Create a mocked default {@link DisplayContent}. */
+ public static TestDisplayContent create(Context context) {
+ final TestDisplayContent displayContent = mock(TestDisplayContent.class);
+ displayContent.isDefaultDisplay = true;
+
+ final DisplayPolicy displayPolicy = mock(DisplayPolicy.class);
+ when(displayPolicy.navigationBarCanMove()).thenReturn(true);
+ when(displayPolicy.hasNavigationBar()).thenReturn(true);
+
+ final DisplayRotation displayRotation = new DisplayRotation(
+ mock(WindowManagerService.class), displayContent, displayPolicy,
+ context, new Object());
+ displayRotation.mPortraitRotation = Surface.ROTATION_0;
+ displayRotation.mLandscapeRotation = Surface.ROTATION_90;
+ displayRotation.mUpsideDownRotation = Surface.ROTATION_180;
+ displayRotation.mSeascapeRotation = Surface.ROTATION_270;
+
+ when(displayContent.getDisplayRotation()).thenReturn(displayRotation);
+
+ return displayContent;
+ }
+ }
+
+ /**
+ * Creates a mock instance of {@link StackWindowController}.
+ */
+ public static StackWindowController createMockStackWindowContainerController() {
+ StackWindowController controller = mock(StackWindowController.class);
+ controller.mContainer = mock(TestTaskStack.class);
+
+ // many components rely on the {@link StackWindowController#adjustConfigurationForBounds}
+ // to properly set bounds values in the configuration. We must mimick those actions here.
+ doAnswer((InvocationOnMock invocationOnMock) -> {
+ final Configuration config = invocationOnMock.<Configuration>getArgument(7);
+ final Rect bounds = invocationOnMock.<Rect>getArgument(0);
+ config.windowConfiguration.setBounds(bounds);
+ return null;
+ }).when(controller).adjustConfigurationForBounds(any(), any(), any(), any(),
+ anyBoolean(), anyBoolean(), anyFloat(), any(), any(), anyInt());
+
+ return controller;
+ }
+
+ /**
+ * An extension of {@link TestTaskStack}, which overrides package scoped methods that would not
+ * normally be mocked out.
+ */
+ public static class TestTaskStack extends TaskStack {
+ TestTaskStack(WindowManagerService service, int stackId) {
+ super(service, stackId, null);
+ }
+
+ @Override
+ void addTask(Task task, int position, boolean showForAllUsers, boolean moveParents) {
+ // Do nothing.
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
index f82b01224f96..649b785c992b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
@@ -23,8 +23,6 @@ import static android.view.Surface.ROTATION_90;
import static com.android.server.wm.utils.CoordinateTransforms.transformLogicalToPhysicalCoordinates;
import static com.android.server.wm.utils.CoordinateTransforms.transformPhysicalToLogicalCoordinates;
-
-
import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
import static org.hamcrest.Matchers.is;
@@ -40,6 +38,10 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
+/**
+ * Build/Install/Run:
+ * atest WmTests:CoordinateTransformsTest
+ */
public class CoordinateTransformsTest {
private static final int W = 200;
@@ -202,4 +204,4 @@ public class CoordinateTransformsTest {
public interface TransformPointAssertable {
void transformsTo(int x, int y);
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java
index ba8869b1692d..926153db58d6 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/DisplayRotationUtilTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.wm.utils;
@@ -24,6 +24,7 @@ import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
+
import static com.android.server.wm.utils.DisplayRotationUtil.getBoundIndexFromRotation;
import static org.hamcrest.Matchers.equalTo;
@@ -32,24 +33,20 @@ import static org.junit.Assert.assertThat;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
+import org.junit.Test;
/**
* Tests for {@link DisplayRotationUtil}
*
- * Run with: atest DisplayRotationUtilTest
+ * Build/Install/Run:
+ * atest WmTests:DisplayRotationUtilTest
*/
-@RunWith(AndroidJUnit4.class)
@SmallTest
@Presubmit
public class DisplayRotationUtilTest {
- private static Rect ZERO_RECT = new Rect();
+ private static final Rect ZERO_RECT = new Rect();
@Test
public void testGetBoundIndexFromRotation_rot0() {
@@ -103,7 +100,7 @@ public class DisplayRotationUtilTest {
@Test
public void testGetRotatedBounds_top_rot0() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { ZERO_RECT, new Rect(50,0,150,10), ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_0, 200, 300),
equalTo(bounds));
}
@@ -111,31 +108,31 @@ public class DisplayRotationUtilTest {
@Test
public void testGetRotatedBounds_top_rot90() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { ZERO_RECT, new Rect(50,0,150,10), ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_90, 200, 300),
- equalTo(new Rect[] { new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT }));
+ equalTo(new Rect[] {new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT}));
}
@Test
public void testGetRotatedBounds_top_rot180() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { ZERO_RECT, new Rect(50,0,150,10), ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_180, 200, 300),
- equalTo(new Rect[] { ZERO_RECT, ZERO_RECT, ZERO_RECT, new Rect(50, 290, 150, 300) }));
+ equalTo(new Rect[] {ZERO_RECT, ZERO_RECT, ZERO_RECT, new Rect(50, 290, 150, 300)}));
}
@Test
public void testGetRotatedBounds_top_rot270() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { ZERO_RECT, new Rect(50,0,150,10), ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_270, 200, 300),
- equalTo(new Rect[] { ZERO_RECT, ZERO_RECT, new Rect(290, 50, 300, 150), ZERO_RECT }));
+ equalTo(new Rect[] {ZERO_RECT, ZERO_RECT, new Rect(290, 50, 300, 150), ZERO_RECT}));
}
@Test
public void testGetRotatedBounds_left_rot0() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_0, 300, 200),
equalTo(bounds));
}
@@ -143,24 +140,24 @@ public class DisplayRotationUtilTest {
@Test
public void testGetRotatedBounds_left_rot90() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_90, 300, 200),
- equalTo(new Rect[]{ ZERO_RECT, ZERO_RECT, ZERO_RECT, new Rect(50, 290, 150, 300) }));
+ equalTo(new Rect[] {ZERO_RECT, ZERO_RECT, ZERO_RECT, new Rect(50, 290, 150, 300)}));
}
@Test
public void testGetRotatedBounds_left_rot180() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_180, 300, 200),
- equalTo(new Rect[]{ ZERO_RECT, ZERO_RECT, new Rect(290, 50, 300, 150), ZERO_RECT }));
+ equalTo(new Rect[] {ZERO_RECT, ZERO_RECT, new Rect(290, 50, 300, 150), ZERO_RECT}));
}
@Test
public void testGetRotatedBounds_left_rot270() {
DisplayRotationUtil util = new DisplayRotationUtil();
- Rect[] bounds = new Rect[] { new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT };
+ Rect[] bounds = new Rect[] {new Rect(0, 50, 10, 150), ZERO_RECT, ZERO_RECT, ZERO_RECT};
assertThat(util.getRotatedBounds(bounds, ROTATION_270, 300, 200),
- equalTo(new Rect[]{ ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT }));
+ equalTo(new Rect[] {ZERO_RECT, new Rect(50, 0, 150, 10), ZERO_RECT, ZERO_RECT}));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/InsetUtilsTest.java
index 3364aef25bd0..089e908cbd5a 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/InsetUtilsTest.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.server.wm.utils;
@@ -27,18 +27,19 @@ import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:InsetUtilsTest
+ */
@SmallTest
@Presubmit
public class InsetUtilsTest {
@Test
- public void testAdd() throws Exception {
+ public void testAdd() {
final Rect rect1 = new Rect(10, 20, 30, 40);
final Rect rect2 = new Rect(50, 60, 70, 80);
InsetUtils.addInsets(rect1, rect2);
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/RotationCacheTest.java
index 5d08920b43d0..33f34b465576 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/RotationCacheTest.java
@@ -28,13 +28,14 @@ import android.util.Pair;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
+/**
+ * Build/Install/Run:
+ * atest WmTests:RotationCacheTest
+ */
@SmallTest
@FlakyTest(bugId = 74078662)
@Presubmit
@@ -53,7 +54,7 @@ public class RotationCacheTest {
}
@Test
- public void getOrCompute_computes() throws Exception {
+ public void getOrCompute_computes() {
assertThat(mCache.getOrCompute("hello", 0), equalTo(create("hello", 0)));
assertThat(mCache.getOrCompute("hello", 1), equalTo(create("hello", 1)));
assertThat(mCache.getOrCompute("hello", 2), equalTo(create("hello", 2)));
@@ -61,7 +62,7 @@ public class RotationCacheTest {
}
@Test
- public void getOrCompute_sameParam_sameRot_hitsCache() throws Exception {
+ public void getOrCompute_sameParam_sameRot_hitsCache() {
assertNotNull(mCache.getOrCompute("hello", 1));
mComputationCalled = false;
@@ -70,7 +71,7 @@ public class RotationCacheTest {
}
@Test
- public void getOrCompute_sameParam_hitsCache_forAllRots() throws Exception {
+ public void getOrCompute_sameParam_hitsCache_forAllRots() {
assertNotNull(mCache.getOrCompute("hello", 3));
assertNotNull(mCache.getOrCompute("hello", 2));
assertNotNull(mCache.getOrCompute("hello", 1));
@@ -85,14 +86,14 @@ public class RotationCacheTest {
}
@Test
- public void getOrCompute_changingParam_recomputes() throws Exception {
+ public void getOrCompute_changingParam_recomputes() {
assertNotNull(mCache.getOrCompute("hello", 1));
assertThat(mCache.getOrCompute("world", 1), equalTo(create("world", 1)));
}
@Test
- public void getOrCompute_changingParam_clearsCacheForDifferentRots() throws Exception {
+ public void getOrCompute_changingParam_clearsCacheForDifferentRots() {
assertNotNull(mCache.getOrCompute("hello", 1));
assertNotNull(mCache.getOrCompute("world", 2));
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
index c5e35e7304c4..fb8ba7bffd4c 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
@@ -16,12 +16,11 @@
package com.android.server.wm.utils;
-
-import static android.view.DisplayCutout.NO_CUTOUT;
import static android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM;
import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT;
import static android.view.DisplayCutout.BOUNDS_POSITION_RIGHT;
import static android.view.DisplayCutout.BOUNDS_POSITION_TOP;
+import static android.view.DisplayCutout.NO_CUTOUT;
import static android.view.DisplayCutout.fromBoundingRect;
import static org.hamcrest.Matchers.equalTo;
@@ -29,7 +28,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat;
-
import android.graphics.Insets;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
@@ -37,24 +35,18 @@ import android.util.Size;
import android.view.DisplayCutout;
import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Arrays;
/**
* Tests for {@link WmDisplayCutout}
*
- * Run with: atest WmDisplayCutoutTest
+ * Build/Install/Run:
+ * atest WmTests:WmDisplayCutoutTest
*/
-@RunWith(AndroidJUnit4.class)
@SmallTest
@Presubmit
public class WmDisplayCutoutTest {
- private static final Rect ZERO_RECT = new Rect();
-
private final DisplayCutout mCutoutTop = new DisplayCutout(
Insets.of(0, 100, 0, 0),
null /* boundLeft */, new Rect(50, 0, 75, 100) /* boundTop */,
@@ -165,4 +157,4 @@ public class WmDisplayCutoutTest {
assertEquals(new WmDisplayCutout(mCutoutTop, new Size(1, 2)).hashCode(),
new WmDisplayCutout(mCutoutTop, new Size(1, 2)).hashCode());
}
-} \ No newline at end of file
+}
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 5916b04c079a..eaaf9b2210db 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -22,17 +22,16 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
-import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
@@ -57,72 +56,432 @@ public class AppTimeLimitController {
private final MyHandler mHandler;
- private OnLimitReachedListener mListener;
+ private TimeLimitCallbackListener mListener;
private static final long MAX_OBSERVER_PER_UID = 1000;
private static final long ONE_MINUTE = 60_000L;
+ /** Collection of data for each user that has reported usage */
@GuardedBy("mLock")
private final SparseArray<UserData> mUsers = new SparseArray<>();
- private static class UserData {
+ /**
+ * Collection of data for each app that is registering observers
+ * WARNING: Entries are currently not removed, based on the assumption there are a small
+ * fixed number of apps on device that can register observers.
+ */
+ @GuardedBy("mLock")
+ private final SparseArray<ObserverAppData> mObserverApps = new SparseArray<>();
+
+ private class UserData {
/** userId of the user */
- private @UserIdInt int userId;
+ private @UserIdInt
+ int userId;
+
+ /** Set of the currently active entities */
+ private final ArraySet<String> currentlyActive = new ArraySet<>();
- /** The app that is currently in the foreground */
- private String currentForegroundedPackage;
+ /** Map from entity name for quick lookup */
+ private final ArrayMap<String, ArrayList<UsageGroup>> observedMap = new ArrayMap<>();
+
+ private UserData(@UserIdInt int userId) {
+ this.userId = userId;
+ }
- /** The time when the current app came to the foreground */
- private long currentForegroundedTime;
+ @GuardedBy("mLock")
+ boolean isActive(String[] entities) {
+ // TODO: Consider using a bloom filter here if number of actives becomes large
+ final int size = entities.length;
+ for (int i = 0; i < size; i++) {
+ if (currentlyActive.contains(entities[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
- /** Map from package name for quick lookup */
- private ArrayMap<String, ArrayList<TimeLimitGroup>> packageMap = new ArrayMap<>();
+ @GuardedBy("mLock")
+ void addUsageGroup(UsageGroup group) {
+ final int size = group.mObserved.length;
+ for (int i = 0; i < size; i++) {
+ ArrayList<UsageGroup> list = observedMap.get(group.mObserved[i]);
+ if (list == null) {
+ list = new ArrayList<>();
+ observedMap.put(group.mObserved[i], list);
+ }
+ list.add(group);
+ }
+ }
+
+ @GuardedBy("mLock")
+ void removeUsageGroup(UsageGroup group) {
+ final int size = group.mObserved.length;
+ for (int i = 0; i < size; i++) {
+ final ArrayList<UsageGroup> list = observedMap.get(group.mObserved[i]);
+ if (list != null) {
+ list.remove(group);
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ void dump(PrintWriter pw) {
+ pw.print(" userId=");
+ pw.println(userId);
+ pw.print(" Currently Active:");
+ final int nActive = currentlyActive.size();
+ for (int i = 0; i < nActive; i++) {
+ pw.print(currentlyActive.valueAt(i));
+ pw.print(", ");
+ }
+ pw.println();
+ pw.print(" Observed Entities:");
+ final int nEntities = currentlyActive.size();
+ for (int i = 0; i < nEntities; i++) {
+ pw.print(observedMap.keyAt(i));
+ pw.print(", ");
+ }
+ pw.println();
+ }
+ }
+
+
+ private class ObserverAppData {
+ /** uid of the observing app */
+ private int uid;
/** Map of observerId to details of the time limit group */
- private SparseArray<TimeLimitGroup> groups = new SparseArray<>();
+ SparseArray<AppUsageGroup> appUsageGroups = new SparseArray<>();
- /** Map of the number of observerIds registered by uid */
- private SparseIntArray observerIdCounts = new SparseIntArray();
+ /** Map of observerId to details of the time limit group */
+ SparseArray<SessionUsageGroup> sessionUsageGroups = new SparseArray<>();
- private UserData(@UserIdInt int userId) {
- this.userId = userId;
+ private ObserverAppData(int uid) {
+ this.uid = uid;
+ }
+
+ @GuardedBy("mLock")
+ void removeAppUsageGroup(int observerId) {
+ appUsageGroups.remove(observerId);
+ }
+
+ @GuardedBy("mLock")
+ void removeSessionUsageGroup(int observerId) {
+ sessionUsageGroups.remove(observerId);
+ }
+
+
+ @GuardedBy("mLock")
+ void dump(PrintWriter pw) {
+ pw.print(" uid=");
+ pw.println(uid);
+ pw.println(" App Usage Groups:");
+ final int nAppUsageGroups = appUsageGroups.size();
+ for (int i = 0; i < nAppUsageGroups; i++) {
+ appUsageGroups.valueAt(i).dump(pw);
+ pw.println();
+ }
+ pw.println(" Session Usage Groups:");
+ final int nSessionUsageGroups = appUsageGroups.size();
+ for (int i = 0; i < nSessionUsageGroups; i++) {
+ sessionUsageGroups.valueAt(i).dump(pw);
+ pw.println();
+ }
}
}
/**
* Listener interface for being informed when an app group's time limit is reached.
*/
- public interface OnLimitReachedListener {
+ public interface TimeLimitCallbackListener {
/**
* Time limit for a group, keyed by the observerId, has been reached.
- * @param observerId The observerId of the group whose limit was reached
- * @param userId The userId
- * @param timeLimit The original time limit in milliseconds
- * @param timeElapsed How much time was actually spent on apps in the group, in milliseconds
+ *
+ * @param observerId The observerId of the group whose limit was reached
+ * @param userId The userId
+ * @param timeLimit The original time limit in milliseconds
+ * @param timeElapsed How much time was actually spent on apps in the group, in
+ * milliseconds
* @param callbackIntent The PendingIntent to send when the limit is reached
*/
public void onLimitReached(int observerId, @UserIdInt int userId, long timeLimit,
long timeElapsed, PendingIntent callbackIntent);
+
+ /**
+ * Session ended for a group, keyed by the observerId, after limit was reached.
+ *
+ * @param observerId The observerId of the group whose limit was reached
+ * @param userId The userId
+ * @param timeElapsed How much time was actually spent on apps in the group, in
+ * milliseconds
+ * @param callbackIntent The PendingIntent to send when the limit is reached
+ */
+ public void onSessionEnd(int observerId, @UserIdInt int userId, long timeElapsed,
+ PendingIntent callbackIntent);
}
- static class TimeLimitGroup {
- int requestingUid;
- int observerId;
- String[] packages;
- long timeLimit;
- long timeRequested;
- long timeRemaining;
- PendingIntent callbackIntent;
- String currentPackage;
- long timeCurrentPackageStarted;
- int userId;
+ abstract class UsageGroup {
+ protected int mObserverId;
+ protected String[] mObserved;
+ protected long mTimeLimitMs;
+ protected long mUsageTimeMs;
+ protected int mActives;
+ protected long mLastKnownUsageTimeMs;
+ protected WeakReference<UserData> mUserRef;
+ protected WeakReference<ObserverAppData> mObserverAppRef;
+ protected PendingIntent mLimitReachedCallback;
+
+ UsageGroup(UserData user, ObserverAppData observerApp, int observerId, String[] observed,
+ long timeLimitMs, PendingIntent limitReachedCallback) {
+ mUserRef = new WeakReference<>(user);
+ mObserverAppRef = new WeakReference<>(observerApp);
+ mObserverId = observerId;
+ mObserved = observed;
+ mTimeLimitMs = timeLimitMs;
+ mLimitReachedCallback = limitReachedCallback;
+ }
+
+ @GuardedBy("mLock")
+ public long getTimeLimitMs() { return mTimeLimitMs; }
+
+ @GuardedBy("mLock")
+ public long getUsageTimeMs() { return mUsageTimeMs; }
+
+ @GuardedBy("mLock")
+ public void remove() {
+ UserData user = mUserRef.get();
+ if (user != null) {
+ user.removeUsageGroup(this);
+ }
+ // Clear the callback, so any racy inflight message will do nothing
+ mLimitReachedCallback = null;
+ }
+
+ @GuardedBy("mLock")
+ void noteUsageStart(long startTimeMs) {
+ noteUsageStart(startTimeMs, startTimeMs);
+ }
+
+ @GuardedBy("mLock")
+ void noteUsageStart(long startTimeMs, long currentTimeMs) {
+ if (mActives++ == 0) {
+ mLastKnownUsageTimeMs = startTimeMs;
+ final long timeRemaining =
+ mTimeLimitMs - mUsageTimeMs + currentTimeMs - startTimeMs;
+ if (timeRemaining > 0) {
+ if (DEBUG) {
+ Slog.d(TAG, "Posting timeout for " + mObserverId + " for "
+ + timeRemaining + "ms");
+ }
+ postCheckTimeoutLocked(this, timeRemaining);
+ }
+ } else {
+ if (mActives > mObserved.length) {
+ // Try to get to a sane state and log the issue
+ mActives = mObserved.length;
+ final UserData user = mUserRef.get();
+ if (user == null) return;
+ final Object[] array = user.currentlyActive.toArray();
+ Slog.e(TAG,
+ "Too many noted usage starts! Observed entities: " + Arrays.toString(
+ mObserved) + " Active Entities: " + Arrays.toString(array));
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ void noteUsageStop(long stopTimeMs) {
+ if (--mActives == 0) {
+ final boolean limitNotCrossed = mUsageTimeMs < mTimeLimitMs;
+ mUsageTimeMs += stopTimeMs - mLastKnownUsageTimeMs;
+ if (limitNotCrossed && mUsageTimeMs >= mTimeLimitMs) {
+ // Crossed the limit
+ if (DEBUG) Slog.d(TAG, "MTB informing group obs=" + mObserverId);
+ postInformLimitReachedListenerLocked(this);
+ }
+ cancelCheckTimeoutLocked(this);
+ } else {
+ if (mActives < 0) {
+ // Try to get to a sane state and log the issue
+ mActives = 0;
+ final UserData user = mUserRef.get();
+ if (user == null) return;
+ final Object[] array = user.currentlyActive.toArray();
+ Slog.e(TAG,
+ "Too many noted usage stops! Observed entities: " + Arrays.toString(
+ mObserved) + " Active Entities: " + Arrays.toString(array));
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ void checkTimeout(long currentTimeMs) {
+ final UserData user = mUserRef.get();
+ if (user == null) return;
+
+ long timeRemainingMs = mTimeLimitMs - mUsageTimeMs;
+
+ if (DEBUG) Slog.d(TAG, "checkTimeout timeRemaining=" + timeRemainingMs);
+
+ // Already reached the limit, no need to report again
+ if (timeRemainingMs <= 0) return;
+
+ if (DEBUG) {
+ Slog.d(TAG, "checkTimeout");
+ }
+
+ // Double check that at least one entity in this group is currently active
+ if (user.isActive(mObserved)) {
+ if (DEBUG) {
+ Slog.d(TAG, "checkTimeout group is active");
+ }
+ final long timeUsedMs = currentTimeMs - mLastKnownUsageTimeMs;
+ if (timeRemainingMs <= timeUsedMs) {
+ if (DEBUG) Slog.d(TAG, "checkTimeout : Time limit reached");
+ // Hit the limit, set timeRemaining to zero to avoid checking again
+ mUsageTimeMs += timeUsedMs;
+ mLastKnownUsageTimeMs = currentTimeMs;
+ AppTimeLimitController.this.postInformLimitReachedListenerLocked(this);
+ } else {
+ if (DEBUG) Slog.d(TAG, "checkTimeout : Some more time remaining");
+ AppTimeLimitController.this.postCheckTimeoutLocked(this,
+ timeRemainingMs - timeUsedMs);
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ public void onLimitReached() {
+ UserData user = mUserRef.get();
+ if (user == null) return;
+ if (mListener != null) {
+ mListener.onLimitReached(mObserverId, user.userId, mTimeLimitMs, mUsageTimeMs,
+ mLimitReachedCallback);
+ }
+ }
+
+ @GuardedBy("mLock")
+ void dump(PrintWriter pw) {
+ pw.print(" Group id=");
+ pw.print(mObserverId);
+ pw.print(" timeLimit=");
+ pw.print(mTimeLimitMs);
+ pw.print(" used=");
+ pw.print(mUsageTimeMs);
+ pw.print(" lastKnownUsage=");
+ pw.print(mLastKnownUsageTimeMs);
+ pw.print(" mActives=");
+ pw.print(mActives);
+ pw.print(" observed=");
+ pw.print(Arrays.toString(mObserved));
+ }
}
- private class MyHandler extends Handler {
+ class AppUsageGroup extends UsageGroup {
+ public AppUsageGroup(UserData user, ObserverAppData observerApp, int observerId,
+ String[] observed, long timeLimitMs, PendingIntent limitReachedCallback) {
+ super(user, observerApp, observerId, observed, timeLimitMs, limitReachedCallback);
+ }
+ @Override
+ @GuardedBy("mLock")
+ public void remove() {
+ super.remove();
+ ObserverAppData observerApp = mObserverAppRef.get();
+ if (observerApp != null) {
+ observerApp.removeAppUsageGroup(mObserverId);
+ }
+ }
+
+ @Override
+ @GuardedBy("mLock")
+ public void onLimitReached() {
+ super.onLimitReached();
+ // Unregister since the limit has been met and observer was informed.
+ remove();
+ }
+ }
+
+ class SessionUsageGroup extends UsageGroup {
+ private long mLastUsageEndTimeMs;
+ private long mNewSessionThresholdMs;
+ private PendingIntent mSessionEndCallback;
+
+ public SessionUsageGroup(UserData user, ObserverAppData observerApp, int observerId,
+ String[] observed, long timeLimitMs, PendingIntent limitReachedCallback,
+ long newSessionThresholdMs, PendingIntent sessionEndCallback) {
+ super(user, observerApp, observerId, observed, timeLimitMs, limitReachedCallback);
+ this.mNewSessionThresholdMs = newSessionThresholdMs;
+ this.mSessionEndCallback = sessionEndCallback;
+ }
+
+ @Override
+ @GuardedBy("mLock")
+ public void remove() {
+ super.remove();
+ ObserverAppData observerApp = mObserverAppRef.get();
+ if (observerApp != null) {
+ observerApp.removeSessionUsageGroup(mObserverId);
+ }
+ // Clear the callback, so any racy inflight messages will do nothing
+ mSessionEndCallback = null;
+ }
+
+ @Override
+ @GuardedBy("mLock")
+ public void noteUsageStart(long startTimeMs, long currentTimeMs) {
+ if (mActives == 0) {
+ if (startTimeMs - mLastUsageEndTimeMs > mNewSessionThresholdMs) {
+ // New session has started, clear usage time.
+ mUsageTimeMs = 0;
+ }
+ AppTimeLimitController.this.cancelInformSessionEndListener(this);
+ }
+ super.noteUsageStart(startTimeMs, currentTimeMs);
+ }
+
+ @Override
+ @GuardedBy("mLock")
+ public void noteUsageStop(long stopTimeMs) {
+ super.noteUsageStop(stopTimeMs);
+ if (mActives == 0) {
+ mLastUsageEndTimeMs = stopTimeMs;
+ if (mUsageTimeMs >= mTimeLimitMs) {
+ // Usage has ended. Schedule the session end callback to be triggered once
+ // the new session threshold has been reached
+ AppTimeLimitController.this.postInformSessionEndListenerLocked(this,
+ mNewSessionThresholdMs);
+ }
+
+ }
+ }
+
+ @GuardedBy("mLock")
+ public void onSessionEnd() {
+ UserData user = mUserRef.get();
+ if (user == null) return;
+ if (mListener != null) {
+ mListener.onSessionEnd(mObserverId, user.userId, mUsageTimeMs, mSessionEndCallback);
+ }
+ }
+
+ @Override
+ @GuardedBy("mLock")
+ void dump(PrintWriter pw) {
+ super.dump(pw);
+ pw.print(" lastUsageEndTime=");
+ pw.print(mLastUsageEndTimeMs);
+ pw.print(" newSessionThreshold=");
+ pw.print(mNewSessionThresholdMs);
+ }
+ }
+
+
+ private class MyHandler extends Handler {
static final int MSG_CHECK_TIMEOUT = 1;
- static final int MSG_INFORM_LISTENER = 2;
+ static final int MSG_INFORM_LIMIT_REACHED_LISTENER = 2;
+ static final int MSG_INFORM_SESSION_END = 3;
MyHandler(Looper looper) {
super(looper);
@@ -132,10 +491,19 @@ public class AppTimeLimitController {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_CHECK_TIMEOUT:
- checkTimeout((TimeLimitGroup) msg.obj);
+ synchronized (mLock) {
+ ((UsageGroup) msg.obj).checkTimeout(getUptimeMillis());
+ }
break;
- case MSG_INFORM_LISTENER:
- informListener((TimeLimitGroup) msg.obj);
+ case MSG_INFORM_LIMIT_REACHED_LISTENER:
+ synchronized (mLock) {
+ ((UsageGroup) msg.obj).onLimitReached();
+ }
+ break;
+ case MSG_INFORM_SESSION_END:
+ synchronized (mLock) {
+ ((SessionUsageGroup) msg.obj).onSessionEnd();
+ }
break;
default:
super.handleMessage(msg);
@@ -144,7 +512,7 @@ public class AppTimeLimitController {
}
}
- public AppTimeLimitController(OnLimitReachedListener listener, Looper looper) {
+ public AppTimeLimitController(TimeLimitCallbackListener listener, Looper looper) {
mHandler = new MyHandler(looper);
mListener = listener;
}
@@ -157,7 +525,13 @@ public class AppTimeLimitController {
/** Overrideable for testing purposes */
@VisibleForTesting
- protected long getObserverPerUidLimit() {
+ protected long getAppUsageObserverPerUidLimit() {
+ return MAX_OBSERVER_PER_UID;
+ }
+
+ /** Overrideable for testing purposes */
+ @VisibleForTesting
+ protected long getUsageSessionObserverPerUidLimit() {
return MAX_OBSERVER_PER_UID;
}
@@ -167,6 +541,21 @@ public class AppTimeLimitController {
return ONE_MINUTE;
}
+ @VisibleForTesting
+ AppUsageGroup getAppUsageGroup(int observerAppUid, int observerId) {
+ synchronized (mLock) {
+ return getOrCreateObserverAppDataLocked(observerAppUid).appUsageGroups.get(observerId);
+ }
+ }
+
+ @VisibleForTesting
+ SessionUsageGroup getSessionUsageGroup(int observerAppUid, int observerId) {
+ synchronized (mLock) {
+ return getOrCreateObserverAppDataLocked(observerAppUid).sessionUsageGroups.get(
+ observerId);
+ }
+ }
+
/** Returns an existing UserData object for the given userId, or creates one */
@GuardedBy("mLock")
private UserData getOrCreateUserDataLocked(int userId) {
@@ -178,6 +567,17 @@ public class AppTimeLimitController {
return userData;
}
+ /** Returns an existing ObserverAppData object for the given uid, or creates one */
+ @GuardedBy("mLock")
+ private ObserverAppData getOrCreateObserverAppDataLocked(int uid) {
+ ObserverAppData appData = mObserverApps.get(uid);
+ if (appData == null) {
+ appData = new ObserverAppData(uid);
+ mObserverApps.put(uid, appData);
+ }
+ return appData;
+ }
+
/** Clean up data if user is removed */
public void onUserRemoved(int userId) {
synchronized (mLock) {
@@ -187,300 +587,219 @@ public class AppTimeLimitController {
}
/**
- * Registers an observer with the given details. Existing observer with the same observerId
- * is removed.
+ * Check if group has any currently active entities.
*/
- public void addObserver(int requestingUid, int observerId, String[] packages, long timeLimit,
- PendingIntent callbackIntent, @UserIdInt int userId) {
+ @GuardedBy("mLock")
+ private void noteActiveLocked(UserData user, UsageGroup group, long currentTimeMs) {
+ // TODO: Consider using a bloom filter here if number of actives becomes large
+ final int size = group.mObserved.length;
+ for (int i = 0; i < size; i++) {
+ if (user.currentlyActive.contains(group.mObserved[i])) {
+ // Entity is currently active. Start group's usage.
+ group.noteUsageStart(currentTimeMs);
+ }
+ }
+ }
+ /**
+ * Registers an app usage observer with the given details.
+ * Existing app usage observer with the same observerId will be removed.
+ */
+ public void addAppUsageObserver(int requestingUid, int observerId, String[] observed,
+ long timeLimit, PendingIntent callbackIntent, @UserIdInt int userId) {
if (timeLimit < getMinTimeLimit()) {
throw new IllegalArgumentException("Time limit must be >= " + getMinTimeLimit());
}
synchronized (mLock) {
UserData user = getOrCreateUserDataLocked(userId);
- removeObserverLocked(user, requestingUid, observerId, /*readding =*/ true);
+ ObserverAppData observerApp = getOrCreateObserverAppDataLocked(requestingUid);
+ AppUsageGroup group = observerApp.appUsageGroups.get(observerId);
+ if (group != null) {
+ // Remove previous app usage group associated with observerId
+ observerApp.appUsageGroups.get(observerId).remove();
+ }
- final int observerIdCount = user.observerIdCounts.get(requestingUid, 0);
- if (observerIdCount >= getObserverPerUidLimit()) {
+ final int observerIdCount = observerApp.appUsageGroups.size();
+ if (observerIdCount >= getAppUsageObserverPerUidLimit()) {
throw new IllegalStateException(
- "Too many observers added by uid " + requestingUid);
+ "Too many app usage observers added by uid " + requestingUid);
}
- user.observerIdCounts.put(requestingUid, observerIdCount + 1);
-
- TimeLimitGroup group = new TimeLimitGroup();
- group.observerId = observerId;
- group.callbackIntent = callbackIntent;
- group.packages = packages;
- group.timeLimit = timeLimit;
- group.timeRemaining = group.timeLimit;
- group.timeRequested = getUptimeMillis();
- group.requestingUid = requestingUid;
- group.timeCurrentPackageStarted = -1L;
- group.userId = userId;
-
- user.groups.append(observerId, group);
-
- addGroupToPackageMapLocked(user, packages, group);
+ group = new AppUsageGroup(user, observerApp, observerId, observed, timeLimit,
+ callbackIntent);
+ observerApp.appUsageGroups.append(observerId, group);
if (DEBUG) {
- Slog.d(TAG, "addObserver " + packages + " for " + timeLimit);
- }
- // Handle the case where a target package is already in the foreground when observer
- // is added.
- if (user.currentForegroundedPackage != null && inPackageList(group.packages,
- user.currentForegroundedPackage)) {
- group.timeCurrentPackageStarted = group.timeRequested;
- group.currentPackage = user.currentForegroundedPackage;
- if (group.timeRemaining > 0) {
- postCheckTimeoutLocked(group, group.timeRemaining);
- }
+ Slog.d(TAG, "addObserver " + observed + " for " + timeLimit);
}
+
+ user.addUsageGroup(group);
+ noteActiveLocked(user, group, getUptimeMillis());
}
}
/**
* Remove a registered observer by observerId and calling uid.
+ *
* @param requestingUid The calling uid
- * @param observerId The unique observer id for this user
- * @param userId The user id of the observer
+ * @param observerId The unique observer id for this user
+ * @param userId The user id of the observer
*/
- public void removeObserver(int requestingUid, int observerId, @UserIdInt int userId) {
+ public void removeAppUsageObserver(int requestingUid, int observerId, @UserIdInt int userId) {
synchronized (mLock) {
- UserData user = getOrCreateUserDataLocked(userId);
- removeObserverLocked(user, requestingUid, observerId, /*readding =*/ false);
+ ObserverAppData observerApp = getOrCreateObserverAppDataLocked(requestingUid);
+ observerApp.appUsageGroups.get(observerId).remove();
}
}
- @VisibleForTesting
- TimeLimitGroup getObserverGroup(int observerId, int userId) {
- synchronized (mLock) {
- return getOrCreateUserDataLocked(userId).groups.get(observerId);
- }
- }
- private static boolean inPackageList(String[] packages, String packageName) {
- return ArrayUtils.contains(packages, packageName);
- }
+ /**
+ * Registers a usage session observer with the given details.
+ * Existing usage session observer with the same observerId will be removed.
+ */
+ public void addUsageSessionObserver(int requestingUid, int observerId, String[] observed,
+ long timeLimit, long sessionThresholdTime,
+ PendingIntent limitReachedCallbackIntent, PendingIntent sessionEndCallbackIntent,
+ @UserIdInt int userId) {
+ if (timeLimit < getMinTimeLimit()) {
+ throw new IllegalArgumentException("Time limit must be >= " + getMinTimeLimit());
+ }
+ synchronized (mLock) {
+ UserData user = getOrCreateUserDataLocked(userId);
+ ObserverAppData observerApp = getOrCreateObserverAppDataLocked(requestingUid);
+ SessionUsageGroup group = observerApp.sessionUsageGroups.get(observerId);
+ if (group != null) {
+ // Remove previous app usage group associated with observerId
+ observerApp.sessionUsageGroups.get(observerId).remove();
+ }
- @GuardedBy("mLock")
- private void removeObserverLocked(UserData user, int requestingUid, int observerId,
- boolean readding) {
- TimeLimitGroup group = user.groups.get(observerId);
- if (group != null && group.requestingUid == requestingUid) {
- removeGroupFromPackageMapLocked(user, group);
- user.groups.remove(observerId);
- mHandler.removeMessages(MyHandler.MSG_CHECK_TIMEOUT, group);
- final int observerIdCount = user.observerIdCounts.get(requestingUid);
- if (observerIdCount <= 1 && !readding) {
- user.observerIdCounts.delete(requestingUid);
- } else {
- user.observerIdCounts.put(requestingUid, observerIdCount - 1);
+ final int observerIdCount = observerApp.sessionUsageGroups.size();
+ if (observerIdCount >= getUsageSessionObserverPerUidLimit()) {
+ throw new IllegalStateException(
+ "Too many app usage observers added by uid " + requestingUid);
}
+ group = new SessionUsageGroup(user, observerApp, observerId, observed, timeLimit,
+ limitReachedCallbackIntent, sessionThresholdTime, sessionEndCallbackIntent);
+ observerApp.sessionUsageGroups.append(observerId, group);
+
+ user.addUsageGroup(group);
+ noteActiveLocked(user, group, getUptimeMillis());
}
}
/**
- * Called when an app has moved to the foreground.
- * @param packageName The app that is foregrounded
- * @param className The className of the activity
- * @param userId The user
+ * Remove a registered observer by observerId and calling uid.
+ *
+ * @param requestingUid The calling uid
+ * @param observerId The unique observer id for this user
+ * @param userId The user id of the observer
*/
- public void moveToForeground(String packageName, String className, int userId) {
+ public void removeUsageSessionObserver(int requestingUid, int observerId,
+ @UserIdInt int userId) {
synchronized (mLock) {
- UserData user = getOrCreateUserDataLocked(userId);
- if (DEBUG) Slog.d(TAG, "Setting mCurrentForegroundedPackage to " + packageName);
- // Note the current foreground package
- user.currentForegroundedPackage = packageName;
- user.currentForegroundedTime = getUptimeMillis();
-
- // Check if any of the groups need to watch for this package
- maybeWatchForPackageLocked(user, packageName, user.currentForegroundedTime);
+ ObserverAppData observerApp = getOrCreateObserverAppDataLocked(requestingUid);
+ observerApp.sessionUsageGroups.get(observerId).remove();
}
}
/**
- * Called when an app is sent to the background.
+ * Called when an entity becomes active.
*
- * @param packageName
- * @param className
- * @param userId
+ * @param name The entity that became active
+ * @param userId The user
*/
- public void moveToBackground(String packageName, String className, int userId) {
+ public void noteUsageStart(String name, int userId) throws IllegalArgumentException {
synchronized (mLock) {
UserData user = getOrCreateUserDataLocked(userId);
- if (!TextUtils.equals(user.currentForegroundedPackage, packageName)) {
- Slog.w(TAG, "Eh? Last foregrounded package = " + user.currentForegroundedPackage
- + " and now backgrounded = " + packageName);
- return;
+ if (DEBUG) Slog.d(TAG, "Usage entity " + name + " became active");
+ if (user.currentlyActive.contains(name)) {
+ throw new IllegalArgumentException(
+ "Unable to start usage for " + name + ", already in use");
}
- final long stopTime = getUptimeMillis();
-
- // Add up the usage time to all groups that contain the package
- ArrayList<TimeLimitGroup> groups = user.packageMap.get(packageName);
- if (groups != null) {
- final int size = groups.size();
- for (int i = 0; i < size; i++) {
- final TimeLimitGroup group = groups.get(i);
- // Don't continue to send
- if (group.timeRemaining <= 0) continue;
-
- final long startTime = Math.max(user.currentForegroundedTime,
- group.timeRequested);
- long diff = stopTime - startTime;
- group.timeRemaining -= diff;
- if (group.timeRemaining <= 0) {
- if (DEBUG) Slog.d(TAG, "MTB informing group obs=" + group.observerId);
- postInformListenerLocked(group);
- }
- // Reset indicators that observer was added when package was already fg
- group.currentPackage = null;
- group.timeCurrentPackageStarted = -1L;
- mHandler.removeMessages(MyHandler.MSG_CHECK_TIMEOUT, group);
- }
+ final long currentTime = getUptimeMillis();
+
+ // Add to the list of active entities
+ user.currentlyActive.add(name);
+
+ ArrayList<UsageGroup> groups = user.observedMap.get(name);
+ if (groups == null) return;
+
+ final int size = groups.size();
+ for (int i = 0; i < size; i++) {
+ UsageGroup group = groups.get(i);
+ group.noteUsageStart(currentTime);
}
- user.currentForegroundedPackage = null;
}
}
- private void postInformListenerLocked(TimeLimitGroup group) {
- mHandler.sendMessage(mHandler.obtainMessage(MyHandler.MSG_INFORM_LISTENER,
- group));
- }
-
/**
- * Inform the observer and unregister it, as the limit has been reached.
- * @param group the observed group
+ * Called when an entity becomes inactive.
+ *
+ * @param name The entity that became inactive
+ * @param userId The user
*/
- private void informListener(TimeLimitGroup group) {
- if (mListener != null) {
- mListener.onLimitReached(group.observerId, group.userId, group.timeLimit,
- group.timeLimit - group.timeRemaining, group.callbackIntent);
- }
- // Unregister since the limit has been met and observer was informed.
+ public void noteUsageStop(String name, int userId) throws IllegalArgumentException {
synchronized (mLock) {
- UserData user = getOrCreateUserDataLocked(group.userId);
- removeObserverLocked(user, group.requestingUid, group.observerId, false);
- }
- }
+ UserData user = getOrCreateUserDataLocked(userId);
+ if (DEBUG) Slog.d(TAG, "Usage entity " + name + " became inactive");
+ if (!user.currentlyActive.remove(name)) {
+ throw new IllegalArgumentException(
+ "Unable to stop usage for " + name + ", not in use");
+ }
+ final long currentTime = getUptimeMillis();
- /** Check if any of the groups care about this package and set up delayed messages */
- @GuardedBy("mLock")
- private void maybeWatchForPackageLocked(UserData user, String packageName, long uptimeMillis) {
- ArrayList<TimeLimitGroup> groups = user.packageMap.get(packageName);
- if (groups == null) return;
+ // Check if any of the groups need to watch for this entity
+ ArrayList<UsageGroup> groups = user.observedMap.get(name);
+ if (groups == null) return;
- final int size = groups.size();
- for (int i = 0; i < size; i++) {
- TimeLimitGroup group = groups.get(i);
- if (group.timeRemaining > 0) {
- group.timeCurrentPackageStarted = uptimeMillis;
- group.currentPackage = packageName;
- if (DEBUG) {
- Slog.d(TAG, "Posting timeout for " + packageName + " for "
- + group.timeRemaining + "ms");
- }
- postCheckTimeoutLocked(group, group.timeRemaining);
+ final int size = groups.size();
+ for (int i = 0; i < size; i++) {
+ UsageGroup group = groups.get(i);
+ group.noteUsageStop(currentTime);
}
}
}
- private void addGroupToPackageMapLocked(UserData user, String[] packages,
- TimeLimitGroup group) {
- for (int i = 0; i < packages.length; i++) {
- ArrayList<TimeLimitGroup> list = user.packageMap.get(packages[i]);
- if (list == null) {
- list = new ArrayList<>();
- user.packageMap.put(packages[i], list);
- }
- list.add(group);
- }
+ @GuardedBy("mLock")
+ private void postInformLimitReachedListenerLocked(UsageGroup group) {
+ mHandler.sendMessage(mHandler.obtainMessage(MyHandler.MSG_INFORM_LIMIT_REACHED_LISTENER,
+ group));
}
- /**
- * Remove the group reference from the package to group mapping, which is 1 to many.
- * @param group The group to remove from the package map.
- */
- private void removeGroupFromPackageMapLocked(UserData user, TimeLimitGroup group) {
- final int mapSize = user.packageMap.size();
- for (int i = 0; i < mapSize; i++) {
- ArrayList<TimeLimitGroup> list = user.packageMap.valueAt(i);
- list.remove(group);
- }
+ @GuardedBy("mLock")
+ private void postInformSessionEndListenerLocked(SessionUsageGroup group, long timeout) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MyHandler.MSG_INFORM_SESSION_END, group),
+ timeout);
+ }
+
+ @GuardedBy("mLock")
+ private void cancelInformSessionEndListener(SessionUsageGroup group) {
+ mHandler.removeMessages(MyHandler.MSG_INFORM_SESSION_END, group);
}
- private void postCheckTimeoutLocked(TimeLimitGroup group, long timeout) {
+ @GuardedBy("mLock")
+ private void postCheckTimeoutLocked(UsageGroup group, long timeout) {
mHandler.sendMessageDelayed(mHandler.obtainMessage(MyHandler.MSG_CHECK_TIMEOUT, group),
timeout);
}
- /**
- * See if the given group has reached the timeout if the current foreground app is included
- * and it exceeds the time remaining.
- * @param group the group of packages to check
- */
- void checkTimeout(TimeLimitGroup group) {
- // For each package in the group, check if any of the currently foregrounded apps are adding
- // up to hit the limit and inform the observer
- synchronized (mLock) {
- UserData user = getOrCreateUserDataLocked(group.userId);
- // This group doesn't exist anymore, nothing to see here.
- if (user.groups.get(group.observerId) != group) return;
-
- if (DEBUG) Slog.d(TAG, "checkTimeout timeRemaining=" + group.timeRemaining);
-
- // Already reached the limit, no need to report again
- if (group.timeRemaining <= 0) return;
-
- if (DEBUG) {
- Slog.d(TAG, "checkTimeout foregroundedPackage="
- + user.currentForegroundedPackage);
- }
-
- if (inPackageList(group.packages, user.currentForegroundedPackage)) {
- if (DEBUG) {
- Slog.d(TAG, "checkTimeout package in foreground="
- + user.currentForegroundedPackage);
- }
- if (group.timeCurrentPackageStarted < 0) {
- Slog.w(TAG, "startTime was not set correctly for " + group);
- }
- final long timeInForeground = getUptimeMillis() - group.timeCurrentPackageStarted;
- if (group.timeRemaining <= timeInForeground) {
- if (DEBUG) Slog.d(TAG, "checkTimeout : Time limit reached");
- // Hit the limit, set timeRemaining to zero to avoid checking again
- group.timeRemaining -= timeInForeground;
- postInformListenerLocked(group);
- // Reset
- group.timeCurrentPackageStarted = -1L;
- group.currentPackage = null;
- } else {
- if (DEBUG) Slog.d(TAG, "checkTimeout : Some more time remaining");
- postCheckTimeoutLocked(group, group.timeRemaining - timeInForeground);
- }
- }
- }
+ @GuardedBy("mLock")
+ private void cancelCheckTimeoutLocked(UsageGroup group) {
+ mHandler.removeMessages(MyHandler.MSG_CHECK_TIMEOUT, group);
}
void dump(PrintWriter pw) {
synchronized (mLock) {
pw.println("\n App Time Limits");
- int nUsers = mUsers.size();
+ final int nUsers = mUsers.size();
for (int i = 0; i < nUsers; i++) {
- UserData user = mUsers.valueAt(i);
- pw.print(" User "); pw.println(user.userId);
- int nGroups = user.groups.size();
- for (int j = 0; j < nGroups; j++) {
- TimeLimitGroup group = user.groups.valueAt(j);
- pw.print(" Group id="); pw.print(group.observerId);
- pw.print(" timeLimit="); pw.print(group.timeLimit);
- pw.print(" remaining="); pw.print(group.timeRemaining);
- pw.print(" currentPackage="); pw.print(group.currentPackage);
- pw.print(" timeCurrentPkgStarted="); pw.print(group.timeCurrentPackageStarted);
- pw.print(" packages="); pw.println(Arrays.toString(group.packages));
- }
- pw.println();
- pw.print(" currentForegroundedPackage=");
- pw.println(user.currentForegroundedPackage);
+ pw.print(" User ");
+ mUsers.valueAt(i).dump(pw);
+ }
+ pw.println();
+ final int nObserverApps = mObserverApps.size();
+ for (int i = 0; i < nObserverApps; i++) {
+ pw.print(" Observer App ");
+ mObserverApps.valueAt(i).dump(pw);
}
}
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index d12eda75ff32..faf6ee23e208 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -33,6 +33,7 @@ import android.content.pm.PackageStats;
import android.content.pm.UserInfo;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
@@ -165,7 +166,8 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
@Override
public boolean isReservedSupported(String volumeUuid, String callingPackage) {
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- return SystemProperties.getBoolean(StorageManager.PROP_HAS_RESERVED, false);
+ return SystemProperties.getBoolean(StorageManager.PROP_HAS_RESERVED, false)
+ || Build.IS_CONTAINER;
} else {
return false;
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index dd1ddfaf7342..262125212c14 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -165,16 +165,36 @@ public class UsageStatsService extends SystemService implements
mAppStandby = new AppStandbyController(getContext(), BackgroundThread.get().getLooper());
mAppTimeLimit = new AppTimeLimitController(
- (observerId, userId, timeLimit, timeElapsed, callbackIntent) -> {
- Intent intent = new Intent();
- intent.putExtra(UsageStatsManager.EXTRA_OBSERVER_ID, observerId);
- intent.putExtra(UsageStatsManager.EXTRA_TIME_LIMIT, timeLimit);
- intent.putExtra(UsageStatsManager.EXTRA_TIME_USED, timeElapsed);
- try {
- callbackIntent.send(getContext(), 0, intent);
- } catch (PendingIntent.CanceledException e) {
- Slog.w(TAG, "Couldn't deliver callback: "
- + callbackIntent);
+ new AppTimeLimitController.TimeLimitCallbackListener() {
+ @Override
+ public void onLimitReached(int observerId, int userId, long timeLimit,
+ long timeElapsed, PendingIntent callbackIntent) {
+ if (callbackIntent == null) return;
+ Intent intent = new Intent();
+ intent.putExtra(UsageStatsManager.EXTRA_OBSERVER_ID, observerId);
+ intent.putExtra(UsageStatsManager.EXTRA_TIME_LIMIT, timeLimit);
+ intent.putExtra(UsageStatsManager.EXTRA_TIME_USED, timeElapsed);
+ try {
+ callbackIntent.send(getContext(), 0, intent);
+ } catch (PendingIntent.CanceledException e) {
+ Slog.w(TAG, "Couldn't deliver callback: "
+ + callbackIntent);
+ }
+ }
+
+ @Override
+ public void onSessionEnd(int observerId, int userId, long timeElapsed,
+ PendingIntent callbackIntent) {
+ if (callbackIntent == null) return;
+ Intent intent = new Intent();
+ intent.putExtra(UsageStatsManager.EXTRA_OBSERVER_ID, observerId);
+ intent.putExtra(UsageStatsManager.EXTRA_TIME_USED, timeElapsed);
+ try {
+ callbackIntent.send(getContext(), 0, intent);
+ } catch (PendingIntent.CanceledException e) {
+ Slog.w(TAG, "Couldn't deliver callback: "
+ + callbackIntent);
+ }
}
}, mHandler.getLooper());
@@ -412,12 +432,18 @@ public class UsageStatsService extends SystemService implements
mAppStandby.reportEvent(event, elapsedRealtime, userId);
switch (event.mEventType) {
case Event.MOVE_TO_FOREGROUND:
- mAppTimeLimit.moveToForeground(event.getPackageName(), event.getClassName(),
- userId);
+ try {
+ mAppTimeLimit.noteUsageStart(event.getPackageName(), userId);
+ } catch (IllegalArgumentException iae) {
+ Slog.e(TAG, "Failed to note usage start", iae);
+ }
break;
case Event.MOVE_TO_BACKGROUND:
- mAppTimeLimit.moveToBackground(event.getPackageName(), event.getClassName(),
- userId);
+ try {
+ mAppTimeLimit.noteUsageStop(event.getPackageName(), userId);
+ } catch (IllegalArgumentException iae) {
+ Slog.e(TAG, "Failed to note usage stop", iae);
+ }
break;
}
}
@@ -1151,16 +1177,70 @@ public class UsageStatsService extends SystemService implements
Binder.restoreCallingIdentity(token);
}
}
+
+ @Override
+ public void registerUsageSessionObserver(int sessionObserverId, String[] observed,
+ long timeLimitMs, long sessionThresholdTimeMs,
+ PendingIntent limitReachedCallbackIntent, PendingIntent sessionEndCallbackIntent,
+ String callingPackage) {
+ if (!hasObserverPermission(callingPackage)) {
+ throw new SecurityException("Caller doesn't have OBSERVE_APP_USAGE permission");
+ }
+
+ if (observed == null || observed.length == 0) {
+ throw new IllegalArgumentException("Must specify at least one observed entity");
+ }
+ if (limitReachedCallbackIntent == null) {
+ throw new NullPointerException("limitReachedCallbackIntent can't be null");
+ }
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ UsageStatsService.this.registerUsageSessionObserver(callingUid, sessionObserverId,
+ observed, timeLimitMs, sessionThresholdTimeMs, limitReachedCallbackIntent,
+ sessionEndCallbackIntent, userId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void unregisterUsageSessionObserver(int sessionObserverId, String callingPackage) {
+ if (!hasObserverPermission(callingPackage)) {
+ throw new SecurityException("Caller doesn't have OBSERVE_APP_USAGE permission");
+ }
+
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(callingUid);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ UsageStatsService.this.unregisterUsageSessionObserver(callingUid, sessionObserverId, userId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
}
void registerAppUsageObserver(int callingUid, int observerId, String[] packages,
long timeLimitMs, PendingIntent callbackIntent, int userId) {
- mAppTimeLimit.addObserver(callingUid, observerId, packages, timeLimitMs, callbackIntent,
+ mAppTimeLimit.addAppUsageObserver(callingUid, observerId, packages, timeLimitMs, callbackIntent,
userId);
}
void unregisterAppUsageObserver(int callingUid, int observerId, int userId) {
- mAppTimeLimit.removeObserver(callingUid, observerId, userId);
+ mAppTimeLimit.removeAppUsageObserver(callingUid, observerId, userId);
+ }
+
+ void registerUsageSessionObserver(int callingUid, int observerId, String[] observed,
+ long timeLimitMs, long sessionThresholdTime, PendingIntent limitReachedCallbackIntent,
+ PendingIntent sessionEndCallbackIntent, int userId) {
+ mAppTimeLimit.addUsageSessionObserver(callingUid, observerId, observed, timeLimitMs,
+ sessionThresholdTime, limitReachedCallbackIntent, sessionEndCallbackIntent, userId);
+ }
+
+ void unregisterUsageSessionObserver(int callingUid, int sessionObserverId, int userId) {
+ mAppTimeLimit.removeUsageSessionObserver(callingUid, sessionObserverId, userId);
}
/**
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 9918395005b1..27b8cdf83b5b 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -34,7 +34,8 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
-import android.database.ContentObserver;
+import android.debug.AdbManagerInternal;
+import android.debug.IAdbTransport;
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbConfiguration;
import android.hardware.usb.UsbConstants;
@@ -178,7 +179,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
private final boolean mHasUsbAccessory;
@GuardedBy("mLock")
private String[] mAccessoryStrings;
- private UsbDebuggingManager mDebuggingManager;
private final UEventObserver mUEventObserver;
private static Set<Integer> sBlackListedInterfaces;
@@ -199,19 +199,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_WIRELESS_CONTROLLER);
}
- private class AdbSettingsObserver extends ContentObserver {
- public AdbSettingsObserver() {
- super(null);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- boolean enable = (Settings.Global.getInt(mContentResolver,
- Settings.Global.ADB_ENABLED, 0) > 0);
- mHandler.sendMessage(MSG_ENABLE_ADB, enable);
- }
- }
-
/*
* Listens for uevent messages from the kernel to monitor the USB state
*/
@@ -284,24 +271,18 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
}
mControlFds.put(UsbManager.FUNCTION_PTP, ptpFd);
- boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
- boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
- if (secureAdbEnabled && !dataEncrypted) {
- mDebuggingManager = new UsbDebuggingManager(context);
- }
-
if (halNotPresent) {
/**
* Initialze the legacy UsbHandler
*/
mHandler = new UsbHandlerLegacy(FgThread.get().getLooper(), mContext, this,
- mDebuggingManager, alsaManager, settingsManager);
+ alsaManager, settingsManager);
} else {
/**
* Initialize HAL based UsbHandler
*/
mHandler = new UsbHandlerHal(FgThread.get().getLooper(), mContext, this,
- mDebuggingManager, alsaManager, settingsManager);
+ alsaManager, settingsManager);
}
if (nativeIsStartRequested()) {
@@ -364,11 +345,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mUEventObserver = new UsbUEventObserver();
mUEventObserver.startObserving(USB_STATE_MATCH);
mUEventObserver.startObserving(ACCESSORY_START_MATCH);
-
- // register observer to listen for settings changes
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.ADB_ENABLED),
- false, new AdbSettingsObserver());
}
UsbProfileGroupSettingsManager getCurrentSettings() {
@@ -482,13 +458,11 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
private int mMidiDevice;
private final Context mContext;
- private final UsbDebuggingManager mDebuggingManager;
private final UsbAlsaManager mUsbAlsaManager;
private final UsbSettingsManager mSettingsManager;
private NotificationManager mNotificationManager;
protected long mScreenUnlockedFunctions;
- protected boolean mAdbEnabled;
protected boolean mBootCompleted;
protected boolean mCurrentFunctionsApplied;
protected boolean mUseUsbNotification;
@@ -506,11 +480,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
protected static final String USB_PERSISTENT_CONFIG_PROPERTY = "persist.sys.usb.config";
UsbHandler(Looper looper, Context context, UsbDeviceManager deviceManager,
- UsbDebuggingManager debuggingManager, UsbAlsaManager alsaManager,
- UsbSettingsManager settingsManager) {
+ UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) {
super(looper);
mContext = context;
- mDebuggingManager = debuggingManager;
mUsbDeviceManager = deviceManager;
mUsbAlsaManager = alsaManager;
mSettingsManager = settingsManager;
@@ -519,13 +491,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mCurrentUser = ActivityManager.getCurrentUser();
mScreenLocked = true;
- /*
- * Use the normal bootmode persistent prop to maintain state of adb across
- * all boot modes.
- */
- mAdbEnabled = UsbHandlerLegacy.containsFunction(getSystemProperty(
- USB_PERSISTENT_CONFIG_PROPERTY, ""), UsbManager.USB_FUNCTION_ADB);
-
mSettings = getPinnedSharedPrefs(mContext);
if (mSettings == null) {
Slog.e(TAG, "Couldn't load shared preferences");
@@ -626,22 +591,15 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
private void setAdbEnabled(boolean enable) {
if (DEBUG) Slog.d(TAG, "setAdbEnabled: " + enable);
- if (enable != mAdbEnabled) {
- mAdbEnabled = enable;
- if (enable) {
- setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_ADB);
- } else {
- setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, "");
- }
-
- setEnabledFunctions(mCurrentFunctions, true);
- updateAdbNotification(false);
+ if (enable) {
+ setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_ADB);
+ } else {
+ setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, "");
}
- if (mDebuggingManager != null) {
- mDebuggingManager.setAdbEnabled(mAdbEnabled);
- }
+ setEnabledFunctions(mCurrentFunctions, true);
+ updateAdbNotification(false);
}
protected boolean isUsbTransferAllowed() {
@@ -799,6 +757,19 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
setEnabledFunctions(mScreenUnlockedFunctions, false);
}
+ private static class AdbTransport extends IAdbTransport.Stub {
+ private final UsbHandler mHandler;
+
+ AdbTransport(UsbHandler handler) {
+ mHandler = handler;
+ }
+
+ @Override
+ public void onAdbEnabled(boolean enabled) {
+ mHandler.sendMessage(MSG_ENABLE_ADB, enabled);
+ }
+ }
+
/**
* Returns the functions that are passed down to the low level driver once adb and
* charging are accounted for.
@@ -807,7 +778,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
if (functions == UsbManager.FUNCTION_NONE) {
return getChargingFunctions();
}
- if (mAdbEnabled) {
+ if (isAdbEnabled()) {
return functions | UsbManager.FUNCTION_ADB;
}
return functions;
@@ -964,6 +935,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mNotificationManager = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ LocalServices.getService(
+ AdbManagerInternal.class).registerTransport(new AdbTransport(this));
+
// Ensure that the notification channels are set up
if (isTv()) {
// TV-specific notification channel
@@ -1029,19 +1003,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
if (mCurrentAccessory != null) {
mUsbDeviceManager.getCurrentSettings().accessoryAttached(mCurrentAccessory);
}
- if (mDebuggingManager != null) {
- mDebuggingManager.setAdbEnabled(mAdbEnabled);
- }
-
- // make sure the ADB_ENABLED setting value matches the current state
- try {
- putGlobalSettings(mContentResolver, Settings.Global.ADB_ENABLED,
- mAdbEnabled ? 1 : 0);
- } catch (SecurityException e) {
- // If UserManager.DISALLOW_DEBUGGING_FEATURES is on, that this setting can't
- // be changed.
- Slog.d(TAG, "ADB_ENABLED is restricted.");
- }
updateUsbNotification(false);
updateAdbNotification(false);
@@ -1191,12 +1152,16 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
}
}
+ protected boolean isAdbEnabled() {
+ return LocalServices.getService(AdbManagerInternal.class).isAdbEnabled();
+ }
+
protected void updateAdbNotification(boolean force) {
if (mNotificationManager == null) return;
final int id = SystemMessage.NOTE_ADB_ACTIVE;
final int titleRes = com.android.internal.R.string.adb_active_notification_title;
- if (mAdbEnabled && mConnected) {
+ if (isAdbEnabled() && mConnected) {
if ("0".equals(getSystemProperty("persist.adb.notify", ""))) return;
if (force && mAdbNotificationShown) {
@@ -1250,7 +1215,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
protected long getChargingFunctions() {
// if ADB is enabled, reset functions to ADB
// else enable MTP as usual.
- if (mAdbEnabled) {
+ if (isAdbEnabled()) {
return UsbManager.FUNCTION_ADB;
} else {
return UsbManager.FUNCTION_MTP;
@@ -1319,7 +1284,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mHideUsbNotification);
dump.write("audio_accessory_connected", UsbHandlerProto.AUDIO_ACCESSORY_CONNECTED,
mAudioAccessoryConnected);
- dump.write("adb_enabled", UsbHandlerProto.ADB_ENABLED, mAdbEnabled);
try {
writeStringIfNotNull(dump, "kernel_state", UsbHandlerProto.KERNEL_STATE,
@@ -1362,9 +1326,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
private boolean mUsbDataUnlocked;
UsbHandlerLegacy(Looper looper, Context context, UsbDeviceManager deviceManager,
- UsbDebuggingManager debuggingManager, UsbAlsaManager alsaManager,
- UsbSettingsManager settingsManager) {
- super(looper, context, deviceManager, debuggingManager, alsaManager, settingsManager);
+ UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) {
+ super(looper, context, deviceManager, alsaManager, settingsManager);
try {
readOemUsbOverrideConfig(context);
// Restore default functions.
@@ -1446,7 +1409,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
+ overrideFunctions.second);
if (!overrideFunctions.second.equals("")) {
String newFunction;
- if (mAdbEnabled) {
+ if (isAdbEnabled()) {
newFunction = addFunction(overrideFunctions.second,
UsbManager.USB_FUNCTION_ADB);
} else {
@@ -1457,7 +1420,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
setSystemProperty(getPersistProp(false), newFunction);
}
return overrideFunctions.first;
- } else if (mAdbEnabled) {
+ } else if (isAdbEnabled()) {
String newFunction = addFunction(UsbManager.USB_FUNCTION_NONE,
UsbManager.USB_FUNCTION_ADB);
setSystemProperty(getPersistProp(false), newFunction);
@@ -1563,7 +1526,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
if (functions == null) {
functions = "";
}
- if (mAdbEnabled) {
+ if (isAdbEnabled()) {
functions = addFunction(functions, UsbManager.USB_FUNCTION_ADB);
} else {
functions = removeFunction(functions, UsbManager.USB_FUNCTION_ADB);
@@ -1752,9 +1715,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
protected boolean mCurrentUsbFunctionsRequested;
UsbHandlerHal(Looper looper, Context context, UsbDeviceManager deviceManager,
- UsbDebuggingManager debuggingManager, UsbAlsaManager alsaManager,
- UsbSettingsManager settingsManager) {
- super(looper, context, deviceManager, debuggingManager, alsaManager, settingsManager);
+ UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) {
+ super(looper, context, deviceManager, alsaManager, settingsManager);
try {
ServiceNotification serviceNotification = new ServiceNotification();
@@ -1850,7 +1812,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
* Dont force to default when the configuration is already set to default.
*/
if (msg.arg1 != 1) {
- setEnabledFunctions(UsbManager.FUNCTION_NONE, !mAdbEnabled);
+ setEnabledFunctions(UsbManager.FUNCTION_NONE, !isAdbEnabled());
}
break;
default:
@@ -2061,25 +2023,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
mHandler.sendMessage(MSG_SET_SCREEN_UNLOCKED_FUNCTIONS, functions);
}
- public void allowUsbDebugging(boolean alwaysAllow, String publicKey) {
- if (mDebuggingManager != null) {
- mDebuggingManager.allowUsbDebugging(alwaysAllow, publicKey);
- }
- }
-
- public void denyUsbDebugging() {
- if (mDebuggingManager != null) {
- mDebuggingManager.denyUsbDebugging();
- }
- }
-
- public void clearUsbDebuggingKeys() {
- if (mDebuggingManager != null) {
- mDebuggingManager.clearUsbDebuggingKeys();
- } else {
- throw new RuntimeException("Cannot clear Usb Debugging keys, "
- + "UsbDebuggingManager not enabled");
- }
+ private void onAdbEnabled(boolean enabled) {
+ mHandler.sendMessage(MSG_ENABLE_ADB, enabled);
}
/**
@@ -2091,10 +2036,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
if (mHandler != null) {
mHandler.dump(dump, "handler", UsbDeviceManagerProto.HANDLER);
}
- if (mDebuggingManager != null) {
- mDebuggingManager.dump(dump, "debugging_manager",
- UsbDeviceManagerProto.DEBUGGING_MANAGER);
- }
dump.end(token);
}
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index e0f36852c867..f9abedfbf586 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -489,24 +489,6 @@ public class UsbService extends IUsbManager.Stub {
}
@Override
- public void allowUsbDebugging(boolean alwaysAllow, String publicKey) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
- mDeviceManager.allowUsbDebugging(alwaysAllow, publicKey);
- }
-
- @Override
- public void denyUsbDebugging() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
- mDeviceManager.denyUsbDebugging();
- }
-
- @Override
- public void clearUsbDebuggingKeys() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
- mDeviceManager.clearUsbDebuggingKeys();
- }
-
- @Override
public UsbPort[] getPorts() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index daa09f574651..b6ac91d45e78 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -467,8 +467,24 @@ public final class Call {
*/
public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 0x00000800;
+ /**
+ * Indicates that the call is using VoIP audio mode.
+ * <p>
+ * When this property is set, the {@link android.media.AudioManager} audio mode for this
+ * call will be {@link android.media.AudioManager#MODE_IN_COMMUNICATION}. When this
+ * property is not set, the audio mode for this call will be
+ * {@link android.media.AudioManager#MODE_IN_CALL}.
+ * <p>
+ * This property reflects changes made using {@link Connection#setAudioModeIsVoip(boolean)}.
+ * <p>
+ * You can use this property to determine whether an un-answered incoming call or a held
+ * call will use VoIP audio mode (if the call does not currently have focus, the system
+ * audio mode may not reflect the mode the call will use).
+ */
+ public static final int PROPERTY_VOIP_AUDIO_MODE = 0x00001000;
+
//******************************************************************************************
- // Next PROPERTY value: 0x00001000
+ // Next PROPERTY value: 0x00002000
//******************************************************************************************
private final String mTelecomCallId;
@@ -628,15 +644,21 @@ public final class Call {
if (hasProperty(properties, PROPERTY_IS_EXTERNAL_CALL)) {
builder.append(" PROPERTY_IS_EXTERNAL_CALL");
}
- if(hasProperty(properties, PROPERTY_HAS_CDMA_VOICE_PRIVACY)) {
+ if (hasProperty(properties, PROPERTY_HAS_CDMA_VOICE_PRIVACY)) {
builder.append(" PROPERTY_HAS_CDMA_VOICE_PRIVACY");
}
- if(hasProperty(properties, PROPERTY_ASSISTED_DIALING_USED)) {
+ if (hasProperty(properties, PROPERTY_ASSISTED_DIALING_USED)) {
builder.append(" PROPERTY_ASSISTED_DIALING_USED");
}
if (hasProperty(properties, PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL)) {
builder.append(" PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL");
}
+ if (hasProperty(properties, PROPERTY_RTT)) {
+ builder.append(" PROPERTY_RTT");
+ }
+ if (hasProperty(properties, PROPERTY_VOIP_AUDIO_MODE)) {
+ builder.append(" PROPERTY_VOIP_AUDIO_MODE");
+ }
builder.append("]");
return builder.toString();
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 66918eb7c416..983e766a6a98 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2231,6 +2231,20 @@ public class CarrierConfigManager {
public static final String KEY_CALL_WAITING_OVER_UT_WARNING_BOOL =
"call_waiting_over_ut_warning_bool";
+ /**
+ * Flag indicating whether to support "Network default" option in Caller ID settings for Calling
+ * Line Identification Restriction (CLIR).
+ */
+ public static final String KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL =
+ "support_clir_network_default_bool";
+
+ /**
+ * Determines whether the carrier want to support emergency dialer shortcut.
+ * @hide
+ */
+ public static final String KEY_SUPPORT_EMERGENCY_DIALER_SHORTCUT_BOOL =
+ "support_emergency_dialer_shortcut_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -2555,7 +2569,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_SPN_DISPLAY_RULE_USE_ROAMING_FROM_SERVICE_STATE_BOOL, false);
sDefaults.putBoolean(KEY_ALWAYS_SHOW_DATA_RAT_ICON_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL, false);
- sDefaults.putBoolean(KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL, false);
+ sDefaults.putBoolean(KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL, true);
sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
sDefaults.putBoolean(KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL, false);
sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY,
@@ -2579,6 +2593,8 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_CALL_BARRING_OVER_UT_WARNING_BOOL, false);
sDefaults.putBoolean(KEY_CALLER_ID_OVER_UT_WARNING_BOOL, false);
sDefaults.putBoolean(KEY_CALL_WAITING_OVER_UT_WARNING_BOOL, false);
+ sDefaults.putBoolean(KEY_SUPPORT_CLIR_NETWORK_DEFAULT_BOOL, true);
+ sDefaults.putBoolean(KEY_SUPPORT_EMERGENCY_DIALER_SHORTCUT_BOOL, true);
}
/**
diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java
index 9218bdc31fa8..598f56769ca3 100644
--- a/telephony/java/android/telephony/CellIdentityCdma.java
+++ b/telephony/java/android/telephony/CellIdentityCdma.java
@@ -16,7 +16,6 @@
package android.telephony;
-import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.telephony.cdma.CdmaCellLocation;
@@ -56,11 +55,11 @@ public final class CellIdentityCdma extends CellIdentity {
*/
public CellIdentityCdma() {
super(TAG, CellInfo.TYPE_CDMA, null, null, null, null);
- mNetworkId = Integer.MAX_VALUE;
- mSystemId = Integer.MAX_VALUE;
- mBasestationId = Integer.MAX_VALUE;
- mLongitude = Integer.MAX_VALUE;
- mLatitude = Integer.MAX_VALUE;
+ mNetworkId = CellInfo.UNAVAILABLE;
+ mSystemId = CellInfo.UNAVAILABLE;
+ mBasestationId = CellInfo.UNAVAILABLE;
+ mLongitude = CellInfo.UNAVAILABLE;
+ mLatitude = CellInfo.UNAVAILABLE;
}
/**
@@ -104,7 +103,7 @@ public final class CellIdentityCdma extends CellIdentity {
mLongitude = lon;
mLatitude = lat;
} else {
- mLongitude = mLatitude = Integer.MAX_VALUE;
+ mLongitude = mLatitude = CellInfo.UNAVAILABLE;
}
}
@@ -130,21 +129,24 @@ public final class CellIdentityCdma extends CellIdentity {
}
/**
- * @return Network Id 0..65535, Integer.MAX_VALUE if unknown
+ * @return Network Id 0..65535, {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE}
+ * if unavailable.
*/
public int getNetworkId() {
return mNetworkId;
}
/**
- * @return System Id 0..32767, Integer.MAX_VALUE if unknown
+ * @return System Id 0..32767, {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE}
+ * if unavailable.
*/
public int getSystemId() {
return mSystemId;
}
/**
- * @return Base Station Id 0..65535, Integer.MAX_VALUE if unknown
+ * @return Base Station Id 0..65535, {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE}
+ * if unavailable.
*/
public int getBasestationId() {
return mBasestationId;
@@ -155,7 +157,7 @@ public final class CellIdentityCdma extends CellIdentity {
* specified in 3GPP2 C.S0005-A v6.0. It is represented in units
* of 0.25 seconds and ranges from -2592000 to 2592000, both
* values inclusive (corresponding to a range of -180
- * to +180 degrees). Integer.MAX_VALUE if unknown.
+ * to +180 degrees). {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getLongitude() {
return mLongitude;
@@ -166,7 +168,7 @@ public final class CellIdentityCdma extends CellIdentity {
* specified in 3GPP2 C.S0005-A v6.0. It is represented in units
* of 0.25 seconds and ranges from -1296000 to 1296000, both
* values inclusive (corresponding to a range of -90
- * to +90 degrees). Integer.MAX_VALUE if unknown.
+ * to +90 degrees). {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getLatitude() {
return mLatitude;
@@ -182,10 +184,10 @@ public final class CellIdentityCdma extends CellIdentity {
@Override
public CdmaCellLocation asCellLocation() {
CdmaCellLocation cl = new CdmaCellLocation();
- int bsid = mBasestationId != Integer.MAX_VALUE ? mBasestationId : -1;
- int sid = mSystemId != Integer.MAX_VALUE ? mSystemId : -1;
- int nid = mNetworkId != Integer.MAX_VALUE ? mNetworkId : -1;
- // lat and long already use Integer.MAX_VALUE for invalid/unknown
+ int bsid = mBasestationId != CellInfo.UNAVAILABLE ? mBasestationId : -1;
+ int sid = mSystemId != CellInfo.UNAVAILABLE ? mSystemId : -1;
+ int nid = mNetworkId != CellInfo.UNAVAILABLE ? mNetworkId : -1;
+ // lat and long already use CellInfo.UNAVAILABLE for invalid/unknown
cl.setCellLocationData(bsid, mLatitude, mLongitude, sid, nid);
return cl;
}
diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java
index cb9dbf369d7e..04c28e5211c8 100644
--- a/telephony/java/android/telephony/CellIdentityGsm.java
+++ b/telephony/java/android/telephony/CellIdentityGsm.java
@@ -16,7 +16,6 @@
package android.telephony;
-import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.telephony.gsm.GsmCellLocation;
@@ -48,10 +47,10 @@ public final class CellIdentityGsm extends CellIdentity {
@UnsupportedAppUsage
public CellIdentityGsm() {
super(TAG, CellInfo.TYPE_GSM, null, null, null, null);
- mLac = Integer.MAX_VALUE;
- mCid = Integer.MAX_VALUE;
- mArfcn = Integer.MAX_VALUE;
- mBsic = Integer.MAX_VALUE;
+ mLac = CellInfo.UNAVAILABLE;
+ mCid = CellInfo.UNAVAILABLE;
+ mArfcn = CellInfo.UNAVAILABLE;
+ mBsic = CellInfo.UNAVAILABLE;
}
/**
* public constructor
@@ -63,7 +62,7 @@ public final class CellIdentityGsm extends CellIdentity {
* @hide
*/
public CellIdentityGsm(int mcc, int mnc, int lac, int cid) {
- this(lac, cid, Integer.MAX_VALUE, Integer.MAX_VALUE,
+ this(lac, cid, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE,
String.valueOf(mcc), String.valueOf(mnc), null, null);
}
@@ -103,7 +102,7 @@ public final class CellIdentityGsm extends CellIdentity {
mArfcn = arfcn;
// In RIL BSIC is a UINT8, so 0xFF is the 'INVALID' designator
// for inbound parcels
- mBsic = (bsic == 0xFF) ? Integer.MAX_VALUE : bsic;
+ mBsic = (bsic == 0xFF) ? CellInfo.UNAVAILABLE : bsic;
}
private CellIdentityGsm(CellIdentityGsm cid) {
@@ -116,69 +115,73 @@ public final class CellIdentityGsm extends CellIdentity {
}
/**
- * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 3-digit Mobile Country Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMccString} instead.
*/
@Deprecated
public int getMcc() {
- return (mMccStr != null) ? Integer.valueOf(mMccStr) : Integer.MAX_VALUE;
+ return (mMccStr != null) ? Integer.valueOf(mMccStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 2 or 3-digit Mobile Network Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMncString} instead.
*/
@Deprecated
public int getMnc() {
- return (mMncStr != null) ? Integer.valueOf(mMncStr) : Integer.MAX_VALUE;
+ return (mMncStr != null) ? Integer.valueOf(mMncStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 16-bit Location Area Code, 0..65535, Integer.MAX_VALUE if unknown
+ * @return 16-bit Location Area Code, 0..65535,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getLac() {
return mLac;
}
/**
- * @return CID
- * Either 16-bit GSM Cell Identity described
- * in TS 27.007, 0..65535, Integer.MAX_VALUE if unknown
+ * @return 16-bit GSM Cell Identity described in TS 27.007, 0..65535,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCid() {
return mCid;
}
/**
- * @return 16-bit GSM Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ * @return 16-bit GSM Absolute RF Channel Number,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getArfcn() {
return mArfcn;
}
/**
- * @return 6-bit Base Station Identity Code, Integer.MAX_VALUE if unknown
+ * @return 6-bit Base Station Identity Code,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getBsic() {
return mBsic;
}
/**
- * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown
+ * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown.
*/
public String getMobileNetworkOperator() {
return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
}
/**
- * @return Mobile Country Code in string format, null if unknown
+ * @return Mobile Country Code in string format, null if unavailable.
*/
public String getMccString() {
return mMccStr;
}
/**
- * @return Mobile Network Code in string format, null if unknown
+ * @return Mobile Network Code in string format, null if unavailable.
*/
public String getMncString() {
return mMncStr;
@@ -192,19 +195,19 @@ public final class CellIdentityGsm extends CellIdentity {
/**
* @deprecated Primary Scrambling Code is not applicable to GSM.
- * @return Integer.MAX_VALUE, undefined for GSM
+ * @return {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} - undefined for GSM
*/
@Deprecated
public int getPsc() {
- return Integer.MAX_VALUE;
+ return CellInfo.UNAVAILABLE;
}
/** @hide */
@Override
public GsmCellLocation asCellLocation() {
GsmCellLocation cl = new GsmCellLocation();
- int lac = mLac != Integer.MAX_VALUE ? mLac : -1;
- int cid = mCid != Integer.MAX_VALUE ? mCid : -1;
+ int lac = mLac != CellInfo.UNAVAILABLE ? mLac : -1;
+ int cid = mCid != CellInfo.UNAVAILABLE ? mCid : -1;
cl.setLacAndCid(lac, cid);
cl.setPsc(-1);
return cl;
diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java
index b44e891fa870..04b6a6ca7fea 100644
--- a/telephony/java/android/telephony/CellIdentityLte.java
+++ b/telephony/java/android/telephony/CellIdentityLte.java
@@ -16,7 +16,6 @@
package android.telephony;
-import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.telephony.gsm.GsmCellLocation;
@@ -49,11 +48,11 @@ public final class CellIdentityLte extends CellIdentity {
@UnsupportedAppUsage
public CellIdentityLte() {
super(TAG, CellInfo.TYPE_LTE, null, null, null, null);
- mCi = Integer.MAX_VALUE;
- mPci = Integer.MAX_VALUE;
- mTac = Integer.MAX_VALUE;
- mEarfcn = Integer.MAX_VALUE;
- mBandwidth = Integer.MAX_VALUE;
+ mCi = CellInfo.UNAVAILABLE;
+ mPci = CellInfo.UNAVAILABLE;
+ mTac = CellInfo.UNAVAILABLE;
+ mEarfcn = CellInfo.UNAVAILABLE;
+ mBandwidth = CellInfo.UNAVAILABLE;
}
/**
@@ -68,7 +67,7 @@ public final class CellIdentityLte extends CellIdentity {
*/
@UnsupportedAppUsage
public CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac) {
- this(ci, pci, tac, Integer.MAX_VALUE, Integer.MAX_VALUE, String.valueOf(mcc),
+ this(ci, pci, tac, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, String.valueOf(mcc),
String.valueOf(mnc), null, null);
}
@@ -84,7 +83,7 @@ public final class CellIdentityLte extends CellIdentity {
* @hide
*/
public CellIdentityLte(int mcc, int mnc, int ci, int pci, int tac, int earfcn) {
- this(ci, pci, tac, earfcn, Integer.MAX_VALUE, String.valueOf(mcc), String.valueOf(mnc),
+ this(ci, pci, tac, earfcn, CellInfo.UNAVAILABLE, String.valueOf(mcc), String.valueOf(mnc),
null, null);
}
@@ -122,74 +121,81 @@ public final class CellIdentityLte extends CellIdentity {
}
/**
- * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 3-digit Mobile Country Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMccString} instead.
*/
@Deprecated
public int getMcc() {
- return (mMccStr != null) ? Integer.valueOf(mMccStr) : Integer.MAX_VALUE;
+ return (mMccStr != null) ? Integer.valueOf(mMccStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 2 or 3-digit Mobile Network Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMncString} instead.
*/
@Deprecated
public int getMnc() {
- return (mMncStr != null) ? Integer.valueOf(mMncStr) : Integer.MAX_VALUE;
+ return (mMncStr != null) ? Integer.valueOf(mMncStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 28-bit Cell Identity, Integer.MAX_VALUE if unknown
+ * @return 28-bit Cell Identity,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCi() {
return mCi;
}
/**
- * @return Physical Cell Id 0..503, Integer.MAX_VALUE if unknown
+ * @return Physical Cell Id 0..503,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getPci() {
return mPci;
}
/**
- * @return 16-bit Tracking Area Code, Integer.MAX_VALUE if unknown
+ * @return 16-bit Tracking Area Code,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getTac() {
return mTac;
}
/**
- * @return 18-bit Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ * @return 18-bit Absolute RF Channel Number,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getEarfcn() {
return mEarfcn;
}
/**
- * @return Cell bandwidth in kHz, Integer.MAX_VALUE if unknown
+ * @return Cell bandwidth in kHz,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getBandwidth() {
return mBandwidth;
}
/**
- * @return Mobile Country Code in string format, null if unknown
+ * @return Mobile Country Code in string format, null if unavailable.
*/
public String getMccString() {
return mMccStr;
}
/**
- * @return Mobile Network Code in string format, null if unknown
+ * @return Mobile Network Code in string format, null if unavailable.
*/
public String getMncString() {
return mMncStr;
}
/**
- * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown
+ * @return a 5 or 6 character string (MCC+MNC), null if any field is unknown.
*/
public String getMobileNetworkOperator() {
return (mMccStr == null || mMncStr == null) ? null : mMccStr + mMncStr;
@@ -216,8 +222,8 @@ public final class CellIdentityLte extends CellIdentity {
@Override
public GsmCellLocation asCellLocation() {
GsmCellLocation cl = new GsmCellLocation();
- int tac = mTac != Integer.MAX_VALUE ? mTac : -1;
- int cid = mCi != Integer.MAX_VALUE ? mCi : -1;
+ int tac = mTac != CellInfo.UNAVAILABLE ? mTac : -1;
+ int cid = mCi != CellInfo.UNAVAILABLE ? mCi : -1;
cl.setLacAndCid(tac, cid);
cl.setPsc(0);
return cl;
diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java
index bc83de190347..8b1c1b9f024c 100644
--- a/telephony/java/android/telephony/CellIdentityTdscdma.java
+++ b/telephony/java/android/telephony/CellIdentityTdscdma.java
@@ -28,11 +28,12 @@ public final class CellIdentityTdscdma extends CellIdentity {
private static final String TAG = CellIdentityTdscdma.class.getSimpleName();
private static final boolean DBG = false;
- // 16-bit Location Area Code, 0..65535, INT_MAX if unknown.
+ // 16-bit Location Area Code, 0..65535, CellInfo.UNAVAILABLE if unknown.
private final int mLac;
- // 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown.
+ // 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, CellInfo.UNAVAILABLE
+ // if unknown.
private final int mCid;
- // 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown.
+ // 8-bit Cell Parameters ID described in TS 25.331, 0..127, CellInfo.UNAVAILABLE if unknown.
private final int mCpid;
// 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
private final int mUarfcn;
@@ -42,18 +43,20 @@ public final class CellIdentityTdscdma extends CellIdentity {
*/
public CellIdentityTdscdma() {
super(TAG, CellInfo.TYPE_TDSCDMA, null, null, null, null);
- mLac = Integer.MAX_VALUE;
- mCid = Integer.MAX_VALUE;
- mCpid = Integer.MAX_VALUE;
- mUarfcn = Integer.MAX_VALUE;
+ mLac = CellInfo.UNAVAILABLE;
+ mCid = CellInfo.UNAVAILABLE;
+ mCpid = CellInfo.UNAVAILABLE;
+ mUarfcn = CellInfo.UNAVAILABLE;
}
/**
* @param mcc 3-digit Mobile Country Code, 0..999
* @param mnc 2 or 3-digit Mobile Network Code, 0..999
- * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
- * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
- * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @param lac 16-bit Location Area Code, 0..65535, CellInfo.UNAVAILABLE if unknown
+ * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, CellInfo.
+ * UNAVAILABLE if unknown
+ * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, CellInfo.UNAVAILABLE
+ * if unknown
* @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
*
* @hide
@@ -65,9 +68,11 @@ public final class CellIdentityTdscdma extends CellIdentity {
/**
* @param mcc 3-digit Mobile Country Code in string format
* @param mnc 2 or 3-digit Mobile Network Code in string format
- * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
- * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
- * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @param lac 16-bit Location Area Code, 0..65535, CellInfo.UNAVAILABLE if unknown
+ * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455,
+ * CellInfo.UNAVAILABLE if unknown
+ * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127,
+ * CellInfo.UNAVAILABLE if unknown
* @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
* @param alphal long alpha Operator Name String or Enhanced Operator Name String
* @param alphas short alpha Operator Name String or Enhanced Operator Name String
@@ -116,21 +121,24 @@ public final class CellIdentityTdscdma extends CellIdentity {
}
/**
- * @return 16-bit Location Area Code, 0..65535, INT_MAX if unknown
+ * @return 16-bit Location Area Code, 0..65535,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getLac() {
return mLac;
}
/**
- * @return 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
+ * @return 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCid() {
return mCid;
}
/**
- * @return 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @return 8-bit Cell Parameters ID described in TS 25.331, 0..127,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCpid() {
return mCpid;
@@ -146,8 +154,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
@Override
public GsmCellLocation asCellLocation() {
GsmCellLocation cl = new GsmCellLocation();
- int lac = mLac != Integer.MAX_VALUE ? mLac : -1;
- int cid = mCid != Integer.MAX_VALUE ? mCid : -1;
+ int lac = mLac != CellInfo.UNAVAILABLE ? mLac : -1;
+ int cid = mCid != CellInfo.UNAVAILABLE ? mCid : -1;
cl.setLacAndCid(lac, cid);
cl.setPsc(-1); // There is no PSC for TD-SCDMA; not using this for CPI to stem shenanigans
return cl;
diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java
index 727d9908b9b1..3416ffe0b8f4 100644
--- a/telephony/java/android/telephony/CellIdentityWcdma.java
+++ b/telephony/java/android/telephony/CellIdentityWcdma.java
@@ -16,7 +16,6 @@
package android.telephony;
-import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.telephony.gsm.GsmCellLocation;
@@ -46,10 +45,10 @@ public final class CellIdentityWcdma extends CellIdentity {
*/
public CellIdentityWcdma() {
super(TAG, CellInfo.TYPE_WCDMA, null, null, null, null);
- mLac = Integer.MAX_VALUE;
- mCid = Integer.MAX_VALUE;
- mPsc = Integer.MAX_VALUE;
- mUarfcn = Integer.MAX_VALUE;
+ mLac = CellInfo.UNAVAILABLE;
+ mCid = CellInfo.UNAVAILABLE;
+ mPsc = CellInfo.UNAVAILABLE;
+ mUarfcn = CellInfo.UNAVAILABLE;
}
/**
* public constructor
@@ -62,7 +61,7 @@ public final class CellIdentityWcdma extends CellIdentity {
* @hide
*/
public CellIdentityWcdma (int mcc, int mnc, int lac, int cid, int psc) {
- this(lac, cid, psc, Integer.MAX_VALUE, String.valueOf(mcc), String.valueOf(mnc),
+ this(lac, cid, psc, CellInfo.UNAVAILABLE, String.valueOf(mcc), String.valueOf(mnc),
null, null);
}
@@ -113,25 +112,28 @@ public final class CellIdentityWcdma extends CellIdentity {
}
/**
- * @return 3-digit Mobile Country Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 3-digit Mobile Country Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMccString} instead.
*/
@Deprecated
public int getMcc() {
- return (mMccStr != null) ? Integer.valueOf(mMccStr) : Integer.MAX_VALUE;
+ return (mMccStr != null) ? Integer.valueOf(mMccStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 2 or 3-digit Mobile Network Code, 0..999, Integer.MAX_VALUE if unknown
+ * @return 2 or 3-digit Mobile Network Code, 0..999,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
* @deprecated Use {@link #getMncString} instead.
*/
@Deprecated
public int getMnc() {
- return (mMncStr != null) ? Integer.valueOf(mMncStr) : Integer.MAX_VALUE;
+ return (mMncStr != null) ? Integer.valueOf(mMncStr) : CellInfo.UNAVAILABLE;
}
/**
- * @return 16-bit Location Area Code, 0..65535, Integer.MAX_VALUE if unknown
+ * @return 16-bit Location Area Code, 0..65535,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getLac() {
return mLac;
@@ -139,29 +141,30 @@ public final class CellIdentityWcdma extends CellIdentity {
/**
* @return CID
- * 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, Integer.MAX_VALUE if unknown
+ * 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCid() {
return mCid;
}
/**
- * @return 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511, Integer.MAX_VALUE
- * if unknown
+ * @return 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getPsc() {
return mPsc;
}
/**
- * @return Mobile Country Code in string version, null if unknown
+ * @return Mobile Country Code in string version, null if unavailable.
*/
public String getMccString() {
return mMccStr;
}
/**
- * @return Mobile Network Code in string version, null if unknown
+ * @return Mobile Network Code in string version, null if unavailable.
*/
public String getMncString() {
return mMncStr;
@@ -180,7 +183,8 @@ public final class CellIdentityWcdma extends CellIdentity {
}
/**
- * @return 16-bit UMTS Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ * @return 16-bit UMTS Absolute RF Channel Number,
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getUarfcn() {
return mUarfcn;
@@ -196,9 +200,9 @@ public final class CellIdentityWcdma extends CellIdentity {
@Override
public GsmCellLocation asCellLocation() {
GsmCellLocation cl = new GsmCellLocation();
- int lac = mLac != Integer.MAX_VALUE ? mLac : -1;
- int cid = mCid != Integer.MAX_VALUE ? mCid : -1;
- int psc = mPsc != Integer.MAX_VALUE ? mPsc : -1;
+ int lac = mLac != CellInfo.UNAVAILABLE ? mLac : -1;
+ int cid = mCid != CellInfo.UNAVAILABLE ? mCid : -1;
+ int psc = mPsc != CellInfo.UNAVAILABLE ? mPsc : -1;
cl.setLacAndCid(lac, cid);
cl.setPsc(psc);
@@ -280,4 +284,4 @@ public final class CellIdentityWcdma extends CellIdentity {
protected static CellIdentityWcdma createFromParcelBody(Parcel in) {
return new CellIdentityWcdma(in);
}
-} \ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index 94e4293806e6..1c63e8205454 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -33,6 +33,11 @@ import java.lang.annotation.RetentionPolicy;
public abstract class CellInfo implements Parcelable {
/**
+ * This value indicates that the integer field is unreported.
+ */
+ public static final int UNAVAILABLE = Integer.MAX_VALUE;
+
+ /**
* Cell identity type
* @hide
*/
diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java
index aa6b207d2f31..5123052cb78b 100644
--- a/telephony/java/android/telephony/CellSignalStrengthCdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java
@@ -51,8 +51,9 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
* <p>Note that this HAL is inconsistent with UMTS-based radio techs as the value indicating
* that a field is unreported is negative, rather than a large(r) positive number.
* <p>Also note that to keep the public-facing methods of this class consistent with others,
- * unreported values are coerced to Integer.MAX_VALUE rather than left as -1, which is
- * a departure from SignalStrength, which is stuck with the values it currently reports.
+ * unreported values are coerced to {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE}
+ * rather than left as -1, which is a departure from SignalStrength, which is stuck with the
+ * values it currently reports.
*
* @param cdmaDbm negative of the CDMA signal strength value or -1 if invalid.
* @param cdmaEcio negative of the CDMA pilot/noise ratio or -1 if invalid.
@@ -65,12 +66,12 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
int evdoSnr) {
// The values here were lifted from SignalStrength.validateInput()
// FIXME: Combine all checking and setting logic between this and SignalStrength.
- mCdmaDbm = ((cdmaDbm > 0) && (cdmaDbm < 120)) ? -cdmaDbm : Integer.MAX_VALUE;
- mCdmaEcio = ((cdmaEcio > 0) && (cdmaEcio < 160)) ? -cdmaEcio : Integer.MAX_VALUE;
+ mCdmaDbm = ((cdmaDbm > 0) && (cdmaDbm < 120)) ? -cdmaDbm : CellInfo.UNAVAILABLE;
+ mCdmaEcio = ((cdmaEcio > 0) && (cdmaEcio < 160)) ? -cdmaEcio : CellInfo.UNAVAILABLE;
- mEvdoDbm = ((evdoDbm > 0) && (evdoDbm < 120)) ? -evdoDbm : Integer.MAX_VALUE;
- mEvdoEcio = ((evdoEcio > 0) && (evdoEcio < 160)) ? -evdoEcio : Integer.MAX_VALUE;
- mEvdoSnr = ((evdoSnr > 0) && (evdoSnr <= 8)) ? evdoSnr : Integer.MAX_VALUE;
+ mEvdoDbm = ((evdoDbm > 0) && (evdoDbm < 120)) ? -evdoDbm : CellInfo.UNAVAILABLE;
+ mEvdoEcio = ((evdoEcio > 0) && (evdoEcio < 160)) ? -evdoEcio : CellInfo.UNAVAILABLE;
+ mEvdoSnr = ((evdoSnr > 0) && (evdoSnr <= 8)) ? evdoSnr : CellInfo.UNAVAILABLE;
}
/** @hide */
@@ -96,11 +97,11 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
/** @hide */
@Override
public void setDefaultValues() {
- mCdmaDbm = Integer.MAX_VALUE;
- mCdmaEcio = Integer.MAX_VALUE;
- mEvdoDbm = Integer.MAX_VALUE;
- mEvdoEcio = Integer.MAX_VALUE;
- mEvdoSnr = Integer.MAX_VALUE;
+ mCdmaDbm = CellInfo.UNAVAILABLE;
+ mCdmaEcio = CellInfo.UNAVAILABLE;
+ mEvdoDbm = CellInfo.UNAVAILABLE;
+ mEvdoEcio = CellInfo.UNAVAILABLE;
+ mEvdoSnr = CellInfo.UNAVAILABLE;
}
/**
@@ -139,7 +140,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
int cdmaAsuLevel;
int ecioAsuLevel;
- if (cdmaDbm == Integer.MAX_VALUE) cdmaAsuLevel = 99;
+ if (cdmaDbm == CellInfo.UNAVAILABLE) cdmaAsuLevel = 99;
else if (cdmaDbm >= -75) cdmaAsuLevel = 16;
else if (cdmaDbm >= -82) cdmaAsuLevel = 8;
else if (cdmaDbm >= -90) cdmaAsuLevel = 4;
@@ -148,7 +149,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
else cdmaAsuLevel = 99;
// Ec/Io are in dB*10
- if (cdmaEcio == Integer.MAX_VALUE) ecioAsuLevel = 99;
+ if (cdmaEcio == CellInfo.UNAVAILABLE) ecioAsuLevel = 99;
else if (cdmaEcio >= -90) ecioAsuLevel = 16;
else if (cdmaEcio >= -100) ecioAsuLevel = 8;
else if (cdmaEcio >= -115) ecioAsuLevel = 4;
@@ -170,7 +171,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
int levelDbm;
int levelEcio;
- if (cdmaDbm == Integer.MAX_VALUE) levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ if (cdmaDbm == CellInfo.UNAVAILABLE) levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
@@ -178,7 +179,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
// Ec/Io are in dB*10
- if (cdmaEcio == Integer.MAX_VALUE) levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ if (cdmaEcio == CellInfo.UNAVAILABLE) levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
@@ -199,14 +200,14 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
int levelEvdoDbm;
int levelEvdoSnr;
- if (evdoDbm == Integer.MAX_VALUE) levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ if (evdoDbm == CellInfo.UNAVAILABLE) levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
- if (evdoSnr == Integer.MAX_VALUE) levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ if (evdoSnr == CellInfo.UNAVAILABLE) levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
diff --git a/telephony/java/android/telephony/CellSignalStrengthGsm.java b/telephony/java/android/telephony/CellSignalStrengthGsm.java
index 1e8d119c96c7..e906f460024a 100644
--- a/telephony/java/android/telephony/CellSignalStrengthGsm.java
+++ b/telephony/java/android/telephony/CellSignalStrengthGsm.java
@@ -40,7 +40,7 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
@UnsupportedAppUsage
private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5
@UnsupportedAppUsage
- private int mTimingAdvance; // range from 0-219 or Integer.MAX_VALUE if unknown
+ private int mTimingAdvance; // range from 0-219 or CellInfo.UNAVAILABLE if unknown
/** @hide */
@UnsupportedAppUsage
@@ -50,7 +50,7 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
/** @hide */
public CellSignalStrengthGsm(int ss, int ber) {
- this(ss, ber, Integer.MAX_VALUE);
+ this(ss, ber, CellInfo.UNAVAILABLE);
}
/** @hide */
@@ -81,9 +81,9 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
/** @hide */
@Override
public void setDefaultValues() {
- mSignalStrength = Integer.MAX_VALUE;
- mBitErrorRate = Integer.MAX_VALUE;
- mTimingAdvance = Integer.MAX_VALUE;
+ mSignalStrength = CellInfo.UNAVAILABLE;
+ mBitErrorRate = CellInfo.UNAVAILABLE;
+ mTimingAdvance = CellInfo.UNAVAILABLE;
}
/**
@@ -112,8 +112,9 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
/**
* Get the GSM timing advance between 0..219 symbols (normally 0..63).
- * Integer.MAX_VALUE is reported when there is no RR connection.
- * Refer to 3GPP 45.010 Sec 5.8
+ * <p>{@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} is reported when there is no RR
+ * connection. Refer to 3GPP 45.010 Sec 5.8.
+ *
* @return the current GSM timing advance, if available.
*/
public int getTimingAdvance() {
@@ -128,11 +129,11 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
int dBm;
int level = mSignalStrength;
- int asu = (level == 99 ? Integer.MAX_VALUE : level);
- if (asu != Integer.MAX_VALUE) {
+ int asu = (level == 99 ? CellInfo.UNAVAILABLE : level);
+ if (asu != CellInfo.UNAVAILABLE) {
dBm = -113 + (2 * asu);
} else {
- dBm = Integer.MAX_VALUE;
+ dBm = CellInfo.UNAVAILABLE;
}
if (DBG) log("getDbm=" + dBm);
return dBm;
diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java
index ed7d4b2331da..05c1fd53e901 100644
--- a/telephony/java/android/telephony/CellSignalStrengthLte.java
+++ b/telephony/java/android/telephony/CellSignalStrengthLte.java
@@ -31,8 +31,27 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
private static final String LOG_TAG = "CellSignalStrengthLte";
private static final boolean DBG = false;
+ /**
+ * Indicates the unknown or undetectable RSSI value in ASU.
+ *
+ * Reference: TS 27.007 8.5 - Signal quality +CSQ
+ */
+ private static final int SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN = 99;
+ /**
+ * Indicates the maximum valid RSSI value in ASU.
+ *
+ * Reference: TS 27.007 8.5 - Signal quality +CSQ
+ */
+ private static final int SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MAX_VALUE = 31;
+ /**
+ * Indicates the minimum valid RSSI value in ASU.
+ *
+ * Reference: TS 27.007 8.5 - Signal quality +CSQ
+ */
+ private static final int SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MIN_VALUE = 0;
+
@UnsupportedAppUsage
- private int mSignalStrength;
+ private int mRssi;
@UnsupportedAppUsage
private int mRsrp;
@UnsupportedAppUsage
@@ -51,9 +70,9 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
}
/** @hide */
- public CellSignalStrengthLte(int signalStrength, int rsrp, int rsrq, int rssnr, int cqi,
+ public CellSignalStrengthLte(int rssi, int rsrp, int rsrq, int rssnr, int cqi,
int timingAdvance) {
- mSignalStrength = signalStrength;
+ mRssi = convertRssiAsuToDBm(rssi);
mRsrp = rsrp;
mRsrq = rsrq;
mRssnr = rssnr;
@@ -68,7 +87,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/** @hide */
protected void copyFrom(CellSignalStrengthLte s) {
- mSignalStrength = s.mSignalStrength;
+ mRssi = s.mRssi;
mRsrp = s.mRsrp;
mRsrq = s.mRsrq;
mRssnr = s.mRssnr;
@@ -85,12 +104,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/** @hide */
@Override
public void setDefaultValues() {
- mSignalStrength = Integer.MAX_VALUE;
- mRsrp = Integer.MAX_VALUE;
- mRsrq = Integer.MAX_VALUE;
- mRssnr = Integer.MAX_VALUE;
- mCqi = Integer.MAX_VALUE;
- mTimingAdvance = Integer.MAX_VALUE;
+ mRssi = CellInfo.UNAVAILABLE;
+ mRsrp = CellInfo.UNAVAILABLE;
+ mRsrq = CellInfo.UNAVAILABLE;
+ mRssnr = CellInfo.UNAVAILABLE;
+ mCqi = CellInfo.UNAVAILABLE;
+ mTimingAdvance = CellInfo.UNAVAILABLE;
}
/**
@@ -104,26 +123,27 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
int levelRsrp = 0;
int levelRssnr = 0;
- if (mRsrp == Integer.MAX_VALUE) levelRsrp = 0;
+ if (mRsrp == CellInfo.UNAVAILABLE) levelRsrp = 0;
else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT;
else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD;
else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE;
else levelRsrp = SIGNAL_STRENGTH_POOR;
// See RIL_LTE_SignalStrength in ril.h
- if (mRssnr == Integer.MAX_VALUE) levelRssnr = 0;
+ if (mRssnr == CellInfo.UNAVAILABLE) levelRssnr = 0;
else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT;
else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD;
else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE;
else levelRssnr = SIGNAL_STRENGTH_POOR;
int level;
- if (mRsrp == Integer.MAX_VALUE)
+ if (mRsrp == CellInfo.UNAVAILABLE) {
level = levelRssnr;
- else if (mRssnr == Integer.MAX_VALUE)
+ } else if (mRssnr == CellInfo.UNAVAILABLE) {
level = levelRsrp;
- else
+ } else {
level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp;
+ }
if (DBG) log("Lte rsrp level: " + levelRsrp
+ " snr level: " + levelRssnr + " level: " + level);
@@ -133,16 +153,31 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get reference signal received quality
*
- * @return the RSRQ if available or Integer.MAX_VALUE if unavailable.
+ * @return the RSRQ if available or
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getRsrq() {
return mRsrq;
}
/**
+ * Get Received Signal Strength Indication (RSSI) in dBm
+ *
+ * The value range is [-113, -51] inclusively or {@link CellInfo#UNAVAILABLE} if unavailable.
+ *
+ * Reference: TS 27.007 8.5 Signal quality +CSQ
+ *
+ * @return the RSSI if available or {@link CellInfo#UNAVAILABLE} if unavailable.
+ */
+ public int getRssi() {
+ return mRssi;
+ }
+
+ /**
* Get reference signal signal-to-noise ratio
*
- * @return the RSSNR if available or Integer.MAX_VALUE if unavailable.
+ * @return the RSSNR if available or
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getRssnr() {
return mRssnr;
@@ -160,7 +195,8 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get channel quality indicator
*
- * @return the CQI if available or Integer.MAX_VALUE if unavailable.
+ * @return the CQI if available or
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getCqi() {
return mCqi;
@@ -184,7 +220,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
public int getAsuLevel() {
int lteAsuLevel = 99;
int lteDbm = getDbm();
- if (lteDbm == Integer.MAX_VALUE) lteAsuLevel = 99;
+ if (lteDbm == CellInfo.UNAVAILABLE) lteAsuLevel = 99;
else if (lteDbm <= -140) lteAsuLevel = 0;
else if (lteDbm >= -43) lteAsuLevel = 97;
else lteAsuLevel = lteDbm + 140;
@@ -194,10 +230,11 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get the timing advance value for LTE, as a value in range of 0..1282.
- * Integer.MAX_VALUE is reported when there is no active RRC
- * connection. Refer to 3GPP 36.213 Sec 4.2.3
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} is reported when there is no
+ * active RRC connection. Refer to 3GPP 36.213 Sec 4.2.3
*
- * @return the LTE timing advance if available or Integer.MAX_VALUE if unavailable.
+ * @return the LTE timing advance if available or
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
public int getTimingAdvance() {
return mTimingAdvance;
@@ -205,7 +242,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
@Override
public int hashCode() {
- return Objects.hash(mSignalStrength, mRsrp, mRsrq, mRssnr, mCqi, mTimingAdvance);
+ return Objects.hash(mRssi, mRsrp, mRsrq, mRssnr, mCqi, mTimingAdvance);
}
@Override
@@ -222,7 +259,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
return false;
}
- return mSignalStrength == s.mSignalStrength
+ return mRssi == s.mRssi
&& mRsrp == s.mRsrp
&& mRsrq == s.mRsrq
&& mRssnr == s.mRssnr
@@ -236,7 +273,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
@Override
public String toString() {
return "CellSignalStrengthLte:"
- + " ss=" + mSignalStrength
+ + " rssi(dBm)=" + mRssi
+ " rsrp=" + mRsrp
+ " rsrq=" + mRsrq
+ " rssnr=" + mRssnr
@@ -248,12 +285,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- dest.writeInt(mSignalStrength);
+ dest.writeInt(mRssi);
// Need to multiply rsrp and rsrq by -1
// to ensure consistency when reading values written here
// unless the values are invalid
- dest.writeInt(mRsrp * (mRsrp != Integer.MAX_VALUE ? -1 : 1));
- dest.writeInt(mRsrq * (mRsrq != Integer.MAX_VALUE ? -1 : 1));
+ dest.writeInt(mRsrp * (mRsrp != CellInfo.UNAVAILABLE ? -1 : 1));
+ dest.writeInt(mRsrq * (mRsrq != CellInfo.UNAVAILABLE ? -1 : 1));
dest.writeInt(mRssnr);
dest.writeInt(mCqi);
dest.writeInt(mTimingAdvance);
@@ -264,13 +301,13 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
* where the token is already been processed.
*/
private CellSignalStrengthLte(Parcel in) {
- mSignalStrength = in.readInt();
+ mRssi = convertRssiAsuToDBm(in.readInt());
// rsrp and rsrq are written into the parcel as positive values.
// Need to convert into negative values unless the values are invalid
mRsrp = in.readInt();
- if (mRsrp != Integer.MAX_VALUE) mRsrp *= -1;
+ if (mRsrp != CellInfo.UNAVAILABLE) mRsrp *= -1;
mRsrq = in.readInt();
- if (mRsrq != Integer.MAX_VALUE) mRsrq *= -1;
+ if (mRsrq != CellInfo.UNAVAILABLE) mRsrq *= -1;
mRssnr = in.readInt();
mCqi = in.readInt();
mTimingAdvance = in.readInt();
@@ -304,4 +341,17 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
private static void log(String s) {
Rlog.w(LOG_TAG, s);
}
+
+ private static int convertRssiAsuToDBm(int rssiAsu) {
+ if (rssiAsu != SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN
+ && (rssiAsu < SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MIN_VALUE
+ || rssiAsu > SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MAX_VALUE)) {
+ Rlog.e(LOG_TAG, "convertRssiAsuToDBm: invalid RSSI in ASU=" + rssiAsu);
+ return CellInfo.UNAVAILABLE;
+ }
+ if (rssiAsu == SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN) {
+ return CellInfo.UNAVAILABLE;
+ }
+ return -113 + (2 * rssiAsu);
+ }
}
diff --git a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java
index 41859a3e96d9..4d040cca5fff 100644
--- a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java
@@ -36,11 +36,11 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen
private static final int TDSCDMA_SIGNAL_STRENGTH_MODERATE = 5;
private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5
- // or Integer.MAX_VALUE if unknown
+ // or CellInfo.UNAVAILABLE if unknown
private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or
- // Integer.MAX_VALUE if unknown
- private int mRscp; // Pilot power (0-96, 255) as defined in TS 27.007 8.69 or Integer.MAX_VALUE
- // if unknown
+ // CellInfo.UNAVAILABLE if unknown
+ private int mRscp; // Pilot power (0-96, 255) as defined in TS 27.007 8.69 or
+ // CellInfo.UNAVAILABLE if unknown
/** @hide */
public CellSignalStrengthTdscdma() {
@@ -75,9 +75,9 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen
/** @hide */
@Override
public void setDefaultValues() {
- mSignalStrength = Integer.MAX_VALUE;
- mBitErrorRate = Integer.MAX_VALUE;
- mRscp = Integer.MAX_VALUE;
+ mSignalStrength = CellInfo.UNAVAILABLE;
+ mBitErrorRate = CellInfo.UNAVAILABLE;
+ mRscp = CellInfo.UNAVAILABLE;
}
/**
@@ -118,11 +118,11 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen
int dBm;
int level = mSignalStrength;
- int asu = (level == 99 ? Integer.MAX_VALUE : level);
- if (asu != Integer.MAX_VALUE) {
+ int asu = (level == 99 ? CellInfo.UNAVAILABLE : level);
+ if (asu != CellInfo.UNAVAILABLE) {
dBm = -113 + (2 * asu);
} else {
- dBm = Integer.MAX_VALUE;
+ dBm = CellInfo.UNAVAILABLE;
}
if (DBG) log("getDbm=" + dBm);
return dBm;
diff --git a/telephony/java/android/telephony/CellSignalStrengthWcdma.java b/telephony/java/android/telephony/CellSignalStrengthWcdma.java
index 66e08822dfa7..0048cbdea8f6 100644
--- a/telephony/java/android/telephony/CellSignalStrengthWcdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthWcdma.java
@@ -37,14 +37,14 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
@UnsupportedAppUsage
private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5
- // or Integer.MAX_VALUE if unknown
+ // or CellInfo.UNAVAILABLE if unknown
@UnsupportedAppUsage
private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or
- // Integer.MAX_VALUE if unknown
+ // CellInfo.UNAVAILABLE if unknown
private int mRscp; // bit error rate (0-96, 255) as defined in TS 27.007 8.69 or
- // Integer.MAX_VALUE if unknown
+ // CellInfo.UNAVAILABLE if unknown
private int mEcNo; // signal to noise radio (0-49, 255) as defined in TS 27.007 8.69 or
- // Integer.MAX_VALUE if unknown
+ // CellInfo.UNAVAILABLE if unknown
/** @hide */
public CellSignalStrengthWcdma() {
@@ -81,10 +81,10 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
/** @hide */
@Override
public void setDefaultValues() {
- mSignalStrength = Integer.MAX_VALUE;
- mBitErrorRate = Integer.MAX_VALUE;
- mRscp = Integer.MAX_VALUE;
- mEcNo = Integer.MAX_VALUE;
+ mSignalStrength = CellInfo.UNAVAILABLE;
+ mBitErrorRate = CellInfo.UNAVAILABLE;
+ mRscp = CellInfo.UNAVAILABLE;
+ mEcNo = CellInfo.UNAVAILABLE;
}
/**
@@ -119,11 +119,11 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
int dBm;
int level = mSignalStrength;
- int asu = (level == 99 ? Integer.MAX_VALUE : level);
- if (asu != Integer.MAX_VALUE) {
+ int asu = (level == 99 ? CellInfo.UNAVAILABLE : level);
+ if (asu != CellInfo.UNAVAILABLE) {
dBm = -113 + (2 * asu);
} else {
- dBm = Integer.MAX_VALUE;
+ dBm = CellInfo.UNAVAILABLE;
}
if (DBG) log("getDbm=" + dBm);
return dBm;
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index c83d6aa3897d..97b1bdcd1c22 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -301,6 +301,14 @@ public class PhoneStateListener {
@SystemApi
public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 0x00800000;
+ /**
+ * Listen for changes to emergency number list based on all active subscriptions.
+ *
+ * <p>Requires permission {@link android.Manifest.permission#READ_PHONE_STATE} or the calling
+ * app has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}).
+ */
+ public static final int LISTEN_EMERGENCY_NUMBER_LIST = 0x01000000;
+
/*
* Subscription used to listen to the phone state changes
* @hide
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index fb801b29b945..bc832c3fbfa5 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -21,8 +21,8 @@ import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.CarrierConfigManager;
-import android.text.TextUtils;
import android.util.Log;
+import android.content.res.Resources;
import java.util.ArrayList;
import java.util.Arrays;
@@ -65,8 +65,9 @@ public class SignalStrength implements Parcelable {
};
/**
- * Use Integer.MAX_VALUE because -1 is a valid value in signal strength.
- * @hide
+ * Indicates the invalid measures of signal strength.
+ *
+ * For example, this can be returned by {@link #getEvdoDbm()} or {@link #getCdmaDbm()}
*/
public static final int INVALID = Integer.MAX_VALUE;
@@ -173,9 +174,9 @@ public class SignalStrength implements Parcelable {
public SignalStrength(boolean gsmFlag) {
mGsmSignalStrength = 99;
mGsmBitErrorRate = -1;
- mCdmaDbm = -1;
+ mCdmaDbm = INVALID;
mCdmaEcio = -1;
- mEvdoDbm = -1;
+ mEvdoDbm = INVALID;
mEvdoEcio = -1;
mEvdoSnr = -1;
mLteSignalStrength = 99;
@@ -542,6 +543,8 @@ public class SignalStrength implements Parcelable {
/**
* Get the CDMA RSSI value in dBm
+ *
+ * @return the CDMA RSSI value or {@link #INVALID} if invalid
*/
public int getCdmaDbm() {
return this.mCdmaDbm;
@@ -556,6 +559,8 @@ public class SignalStrength implements Parcelable {
/**
* Get the EVDO RSSI value in dBm
+ *
+ * @return the EVDO RSSI value or {@link #INVALID} if invalid
*/
public int getEvdoDbm() {
return this.mEvdoDbm;
@@ -1116,7 +1121,7 @@ public class SignalStrength implements Parcelable {
public int getWcdmaLevel() {
int level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
- if (TextUtils.isEmpty(mWcdmaDefaultSignalMeasurement)) {
+ if (mWcdmaDefaultSignalMeasurement == null) {
Log.wtf(LOG_TAG, "getWcdmaLevel - WCDMA default signal measurement is invalid.");
return level;
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 04596679293f..0ba18ee54bf4 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -43,6 +43,7 @@ import android.database.ContentObserver;
import android.net.INetworkPolicyManager;
import android.net.NetworkCapabilities;
import android.net.Uri;
+import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
@@ -781,8 +782,13 @@ public class SubscriptionManager {
IOnSubscriptionsChangedListener callback = new IOnSubscriptionsChangedListener.Stub() {
@Override
public void onSubscriptionsChanged() {
- if (DBG) log("onOpportunisticSubscriptionsChanged callback received.");
- mExecutor.execute(() -> onOpportunisticSubscriptionsChanged());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (DBG) log("onOpportunisticSubscriptionsChanged callback received.");
+ mExecutor.execute(() -> onOpportunisticSubscriptionsChanged());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
};
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index f484d1fc97f9..e5c4ccda422a 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -20,7 +20,9 @@ import static android.content.Context.TELECOM_SERVICE;
import static com.android.internal.util.Preconditions.checkNotNull;
+import android.Manifest;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
@@ -56,6 +58,8 @@ import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.VisualVoicemailService.VisualVoicemailTask;
+import android.telephony.emergency.EmergencyNumber;
+import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsMmTelFeature;
import android.telephony.ims.aidl.IImsRcsFeature;
@@ -85,6 +89,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -5169,6 +5174,9 @@ public class TelephonyManager {
* {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
+ * TODO: remove this one. use {@link #rebootRadio()} for reset type 1 and
+ * {@link #resetRadioConfig()} for reset type 3
+ *
* @param resetType reset type: 1: reload NV reset, 2: erase NV reset, 3: factory NV reset
* @return true on success; false on any failure.
*
@@ -5178,8 +5186,15 @@ public class TelephonyManager {
public boolean nvResetConfig(int resetType) {
try {
ITelephony telephony = getITelephony();
- if (telephony != null)
- return telephony.nvResetConfig(resetType);
+ if (telephony != null) {
+ if (resetType == 1 /*1: reload NV reset */) {
+ return telephony.rebootModem(getSlotIndex());
+ } else if (resetType == 3 /*3: factory NV reset */) {
+ return telephony.resetModemConfig(getSlotIndex());
+ } else {
+ Rlog.e(TAG, "nvResetConfig unsupported reset type");
+ }
+ }
} catch (RemoteException ex) {
Rlog.e(TAG, "nvResetConfig RemoteException", ex);
} catch (NullPointerException ex) {
@@ -5189,6 +5204,61 @@ public class TelephonyManager {
}
/**
+ * Rollback modem configurations to factory default except some config which are in whitelist.
+ * Used for device configuration by some CDMA operators.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @return {@code true} on success; {@code false} on any failure.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ @SystemApi
+ public boolean resetRadioConfig() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.resetModemConfig(getSlotIndex());
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "resetRadioConfig RemoteException", ex);
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "resetRadioConfig NPE", ex);
+ }
+ return false;
+ }
+
+ /**
+ * Generate a radio modem reset. Used for device configuration by some CDMA operators.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @return {@code true} on success; {@code false} on any failure.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ @SystemApi
+ public boolean rebootRadio() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.rebootModem(getSlotIndex());
+ }
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "rebootRadio RemoteException", ex);
+ } catch (NullPointerException ex) {
+ Rlog.e(TAG, "rebootRadio NPE", ex);
+ }
+ return false;
+ }
+
+ /**
* Return an appropriate subscription ID for any situation.
*
* If this object has been created with {@link #createForSubscriptionId}, then the provided
@@ -6256,7 +6326,7 @@ public class TelephonyManager {
/**
* Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning
- * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for
+ * SystemProperty to decide whether DUN APN is required for
* tethering.
*
* @return 0: Not required. 1: required. 2: Not set.
@@ -7375,6 +7445,27 @@ public class TelephonyManager {
}
/**
+ * Determines whether the device currently supports RTT (Real-time text). Based both on carrier
+ * support for the feature and device firmware support.
+ *
+ * @return {@code true} if the device and carrier both support RTT, {@code false} otherwise.
+ * @hide
+ */
+ @TestApi
+ public boolean isRttSupported() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.isRttSupported(mSubId);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#isRttSupported", e);
+ } catch (SecurityException e) {
+ Log.e(TAG, "Permission error calling ITelephony#isWorldPhone", e);
+ }
+ return false;
+ }
+ /**
* Whether the phone supports hearing aid compatibility.
*
* @return {@code true} if the device supports hearing aid compatibility, and {@code false}
@@ -8204,6 +8295,29 @@ public class TelephonyManager {
}
/**
+ * Return a list of certs in hex string from loaded carrier privileges access rules.
+ *
+ * @return a list of certificate in hex string. return {@code null} if there is no certs
+ * or privilege rules are not loaded yet.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE}
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public List<String> getCertsFromCarrierPrivilegeAccessRules() {
+ try {
+ ITelephony service = getITelephony();
+ if (service != null) {
+ return service.getCertsFromCarrierPrivilegeAccessRules(getSubId());
+ }
+ } catch (RemoteException ex) {
+ // This could happen if binder process crashes.
+ }
+ return null;
+ }
+
+ /**
* Return the application ID for the uicc application type like {@link #APPTYPE_CSIM}.
* All uicc applications are uniquely identified by application ID. See ETSI 102.221 and 101.220
* <p>Requires Permission:
@@ -8984,4 +9098,115 @@ public class TelephonyManager {
}
}
+ /**
+ * Get the emergency number list based on current locale, sim, default, modem and network.
+ *
+ * <p>The emergency number {@link EmergencyNumber} with higher display priority is located at
+ * the smaller index in the returned list.
+ *
+ * <p>The subscriptions which the returned list would be based on, are all the active
+ * subscriptions, no matter which subscription could be used to create TelephonyManager.
+ *
+ * <p>Requires permission {@link android.Manifest.permission#READ_PHONE_STATE} or the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @return Map including the key as the active subscription ID (Note: if there is no active
+ * subscription, the key is {@link SubscriptionManager#DEFAULT_SUBSCRIPTION_ID}) and the value
+ * as the list of {@link EmergencyNumber}; null if this information is not available.
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ @Nullable
+ public Map<Integer, List<EmergencyNumber>> getCurrentEmergencyNumberList() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) {
+ return null;
+ }
+ return telephony.getCurrentEmergencyNumberList(mContext.getOpPackageName());
+ } catch (RemoteException ex) {
+ Log.e(TAG, "getCurrentEmergencyNumberList RemoteException", ex);
+ }
+ return null;
+ }
+
+ /**
+ * Get the per-category emergency number list based on current locale, sim, default, modem
+ * and network.
+ *
+ * <p>The emergency number {@link EmergencyNumber} with higher display priority is located at
+ * the smaller index in the returned list.
+ *
+ * <p>The subscriptions which the returned list would be based on, are all the active
+ * subscriptions, no matter which subscription could be used to create TelephonyManager.
+ *
+ * <p>Requires permission {@link android.Manifest.permission#READ_PHONE_STATE} or the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @param categories the emergency service categories which are the bitwise-OR combination of
+ * the following constants:
+ * <ol>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_POLICE} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AMBULANCE} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_FIRE_BRIGADE} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MARINE_GUARD} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MOUNTAIN_RESCUE} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_MIEC} </li>
+ * <li>{@link EmergencyNumber#EMERGENCY_SERVICE_CATEGORY_AIEC} </li>
+ * </ol>
+ * @return Map including the key as the active subscription ID (Note: if there is no active
+ * subscription, the key is {@link SubscriptionManager#DEFAULT_SUBSCRIPTION_ID}) and the value
+ * as the list of {@link EmergencyNumber}; null if this information is not available.
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ @Nullable
+ public Map<Integer, List<EmergencyNumber>> getCurrentEmergencyNumberList(
+ @EmergencyServiceCategories int categories) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) {
+ return null;
+ }
+ Map<Integer, List<EmergencyNumber>> numberMap = telephony
+ .getCurrentEmergencyNumberList(mContext.getOpPackageName());
+ if (numberMap != null) {
+ for (Integer subscriptionId : numberMap.keySet()) {
+ List<EmergencyNumber> numberList = numberMap.get(subscriptionId);
+ for (EmergencyNumber number : numberList) {
+ if (!number.isInEmergencyServiceCategories(categories)) {
+ numberList.remove(number);
+ }
+ }
+ }
+ }
+ return numberMap;
+ } catch (RemoteException ex) {
+ Log.e(TAG, "getCurrentEmergencyNumberList with Categories RemoteException", ex);
+ }
+ return null;
+ }
+
+ /**
+ * Checks if the supplied number is an emergency number based on current locale, sim, default,
+ * modem and network.
+ *
+ * <p>The subscriptions which the identification would be based on, are all the active
+ * subscriptions, no matter which subscription could be used to create TelephonyManager.
+ *
+ * @param number - the number to look up
+ * @return {@code true} if the given number is an emergency number based on current locale,
+ * sim, modem and network; {@code false} otherwise.
+ */
+ public boolean isCurrentEmergencyNumber(@NonNull String number) {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) {
+ return false;
+ }
+ return telephony.isCurrentEmergencyNumber(number);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "isCurrentEmergencyNumber RemoteException", ex);
+ }
+ return false;
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index dc233585dea4..b20b164e46d5 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -49,6 +49,7 @@ import com.android.internal.telephony.CellNetworkScanResult;
import com.android.internal.telephony.OperatorInfo;
import java.util.List;
+import java.util.Map;
import android.telephony.UiccSlotInfo;
@@ -638,15 +639,30 @@ interface ITelephony {
boolean nvWriteCdmaPrl(in byte[] preferredRoamingList);
/**
- * Perform the specified type of NV config reset. The radio will be taken offline
- * and the device must be rebooted after the operation. Used for device
- * configuration by some CDMA operators.
+ * Rollback modem configurations to factory default except some config which are in whitelist.
+ * Used for device configuration by some CDMA operators.
*
- * @param resetType the type of reset to perform (1 == factory reset; 2 == NV-only reset).
- * @return true on success; false on any failure.
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @param slotIndex - device slot.
+ * @return {@code true} on success; {@code false} on any failure.
*/
- boolean nvResetConfig(int resetType);
+ boolean resetModemConfig(int slotIndex);
+ /**
+ * Generate a radio modem reset. Used for device configuration by some CDMA operators.
+ * Different than {@link #setRadioPower(boolean)}, modem reboot will power down sim card.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling
+ * app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
+ * @param slotIndex - device slot.
+ * @return {@code true} on success; {@code false} on any failure.
+ */
+ boolean rebootModem(int slotIndex);
/*
* Get the calculated preferred network type.
* Used for device configuration by some CDMA operators.
@@ -667,7 +683,7 @@ interface ITelephony {
/**
* Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning
- * SystemProperty, and config_tether_apndata to decide whether DUN APN is required for
+ * SystemProperty to decide whether DUN APN is required for
* tethering.
*
* @return 0: Not required. 1: required. 2: Not set.
@@ -1038,6 +1054,8 @@ interface ITelephony {
*/
boolean isTtyModeSupported();
+ boolean isRttSupported(int subscriptionId);
+
/**
* Whether the phone supports hearing aid compatibility.
*
@@ -1615,4 +1633,19 @@ interface ITelephony {
* return true if TTY over VoLTE is enabled for the subscription specified.
*/
boolean isTtyOverVolteEnabled(int subId);
+
+ /**
+ * Return the emergency number list from all the active subscriptions.
+ */
+ Map getCurrentEmergencyNumberList(String callingPackage);
+
+ /**
+ * Identify if the number is emergency number, based on all the active subscriptions.
+ */
+ boolean isCurrentEmergencyNumber(String number);
+
+ /**
+ * Return a list of certs in hex string from loaded carrier privileges access rules.
+ */
+ List<String> getCertsFromCarrierPrivilegeAccessRules(int subId);
}
diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java
index 5b8028b52ae4..9874f809c0b4 100644
--- a/telephony/java/com/android/internal/telephony/SmsApplication.java
+++ b/telephony/java/com/android/internal/telephony/SmsApplication.java
@@ -562,8 +562,7 @@ public final class SmsApplication {
+ AppOpsManager.modeToName(appOp) + ": "
+ (updateIfNeeded ? " (fixing)" : " (no permission to fix)"));
if (updateIfNeeded) {
- setExclusiveAppop(applicationData.mPackageName, appOps, appOp,
- AppOpsManager.MODE_ALLOWED, applicationData.mUid);
+ appOps.setUidMode(appOp, applicationData.mUid, AppOpsManager.MODE_ALLOWED);
} else {
return false;
}
@@ -732,14 +731,6 @@ public final class SmsApplication {
private static void setExclusiveAppops(String pkg, AppOpsManager appOpsManager, int uid,
int mode) {
for (int appop : DEFAULT_APP_EXCLUSIVE_APPOPS) {
- setExclusiveAppop(pkg, appOpsManager, appop, mode, uid);
- }
- }
-
- private static void setExclusiveAppop(String pkg, AppOpsManager appOpsManager, int appop,
- int mode, int uid) {
- // IGNORED means user explicitly revoked permission in settings, so avoid overriding it.
- if (appOpsManager.checkOpNoThrow(appop, uid, pkg) != AppOpsManager.MODE_IGNORED) {
appOpsManager.setUidMode(appop, uid, mode);
}
}
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
index 23311b027183..4b93ca3dcaa9 100644
--- a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
+++ b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
@@ -59,8 +59,6 @@ public class UsbHandlerTest {
@Mock
private UsbDeviceManager mUsbDeviceManager;
@Mock
- private UsbDebuggingManager mUsbDebuggingManager;
- @Mock
private UsbAlsaManager mUsbAlsaManager;
@Mock
private UsbSettingsManager mUsbSettingsManager;
@@ -89,9 +87,8 @@ public class UsbHandlerTest {
Intent mBroadcastedIntent;
MockUsbHandler(Looper looper, Context context, UsbDeviceManager deviceManager,
- UsbDebuggingManager debuggingManager, UsbAlsaManager alsaManager,
- UsbSettingsManager settingsManager) {
- super(looper, context, deviceManager, debuggingManager, alsaManager, settingsManager);
+ UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) {
+ super(looper, context, deviceManager, alsaManager, settingsManager);
mUseUsbNotification = false;
mIsUsbTransferAllowed = true;
mCurrentUsbFunctionsReceived = true;
@@ -144,8 +141,8 @@ public class UsbHandlerTest {
when(mSharedPreferences.edit()).thenReturn(mEditor);
mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
- InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
- mUsbAlsaManager, mUsbSettingsManager);
+ InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
+ mUsbSettingsManager);
}
@SmallTest
@@ -190,8 +187,7 @@ public class UsbHandlerTest {
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
.USB_PERSISTENT_CONFIG_PROPERTY), UsbManager.USB_FUNCTION_ADB);
- verify(mUsbDebuggingManager).setAdbEnabled(true);
- assertTrue(mUsbHandler.mAdbEnabled);
+ assertTrue(mUsbHandler.isAdbEnabled());
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
@@ -208,16 +204,15 @@ public class UsbHandlerTest {
mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY,
UsbManager.USB_FUNCTION_ADB);
mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
- InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
- mUsbAlsaManager, mUsbSettingsManager);
+ InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
+ mUsbSettingsManager);
sendBootCompleteMessages(mUsbHandler);
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_ENABLE_ADB, 0));
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
- assertFalse(mUsbHandler.mAdbEnabled);
+ assertFalse(mUsbHandler.isAdbEnabled());
assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
.USB_PERSISTENT_CONFIG_PROPERTY), "");
- verify(mUsbDebuggingManager).setAdbEnabled(false);
}
@SmallTest
@@ -232,14 +227,13 @@ public class UsbHandlerTest {
public void bootCompletedAdbEnabled() {
mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY, "adb");
mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
- InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
- mUsbAlsaManager, mUsbSettingsManager);
+ InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
+ mUsbSettingsManager);
sendBootCompleteMessages(mUsbHandler);
assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
assertEquals(mMockGlobalSettings.get(Settings.Global.ADB_ENABLED).intValue(), 1);
- assertTrue(mUsbHandler.mAdbEnabled);
- verify(mUsbDebuggingManager).setAdbEnabled(true);
+ assertTrue(mUsbHandler.isAdbEnabled());
}
@SmallTest
@@ -321,8 +315,8 @@ public class UsbHandlerTest {
UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser), ""))
.thenReturn(UsbManager.USB_FUNCTION_MTP);
mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
- InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
- mUsbAlsaManager, mUsbSettingsManager);
+ InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
+ mUsbSettingsManager);
sendBootCompleteMessages(mUsbHandler);
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 1));
mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
@@ -335,4 +329,4 @@ public class UsbHandlerTest {
handler.handleMessage(handler.obtainMessage(MSG_BOOT_COMPLETED));
handler.handleMessage(handler.obtainMessage(MSG_SYSTEM_READY));
}
-} \ No newline at end of file
+}
diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java
index 8f18d072a0bb..d6dbf5aaa9d8 100644
--- a/tests/net/java/android/net/NetworkStatsTest.java
+++ b/tests/net/java/android/net/NetworkStatsTest.java
@@ -39,6 +39,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.net.NetworkStats.Entry;
import android.os.Process;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.filters.SmallTest;
@@ -785,7 +786,38 @@ public class NetworkStatsTest {
ArrayMap<String, String> stackedIface = new ArrayMap<>();
stackedIface.put(v4Iface, baseIface);
- NetworkStats.Entry otherEntry = new NetworkStats.Entry(
+ // Ipv4 traffic sent/received by an app on stacked interface.
+ final NetworkStats.Entry appEntry = new NetworkStats.Entry(
+ v4Iface, appUid, SET_DEFAULT, TAG_NONE,
+ 30501490 /* rxBytes */,
+ 22401 /* rxPackets */,
+ 876235 /* txBytes */,
+ 13805 /* txPackets */,
+ 0 /* operations */);
+
+ // Traffic measured for the root uid on the base interface if eBPF is in use.
+ // Incorrectly includes appEntry's bytes and packets, plus IPv4-IPv6 translation
+ // overhead (20 bytes per packet), only for TX traffic.
+ final NetworkStats.Entry ebpfRootUidEntry = new NetworkStats.Entry(
+ baseIface, rootUid, SET_DEFAULT, TAG_NONE,
+ 163577 /* rxBytes */,
+ 187 /* rxPackets */,
+ 1169942 /* txBytes */,
+ 13902 /* txPackets */,
+ 0 /* operations */);
+
+ // Traffic measured for the root uid on the base interface if xt_qtaguid is in use.
+ // Incorrectly includes appEntry's bytes and packets, plus IPv4-IPv6 translation
+ // overhead (20 bytes per packet), in both directions.
+ final NetworkStats.Entry xtRootUidEntry = new NetworkStats.Entry(
+ baseIface, rootUid, SET_DEFAULT, TAG_NONE,
+ 31113087 /* rxBytes */,
+ 22588 /* rxPackets */,
+ 1169942 /* txBytes */,
+ 13902 /* txPackets */,
+ 0 /* operations */);
+
+ final NetworkStats.Entry otherEntry = new NetworkStats.Entry(
otherIface, appUid, SET_DEFAULT, TAG_NONE,
2600 /* rxBytes */,
2 /* rxPackets */,
@@ -793,39 +825,41 @@ public class NetworkStatsTest {
3 /* txPackets */,
0 /* operations */);
- NetworkStats stats = new NetworkStats(TEST_START, 3)
- .addValues(v4Iface, appUid, SET_DEFAULT, TAG_NONE,
- 30501490 /* rxBytes */,
- 22401 /* rxPackets */,
- 876235 /* txBytes */,
- 13805 /* txPackets */,
- 0 /* operations */)
- .addValues(baseIface, rootUid, SET_DEFAULT, TAG_NONE,
- 31113087,
- 22588,
- 1169942,
- 13902,
- 0)
+ final NetworkStats statsXt = new NetworkStats(TEST_START, 3)
+ .addValues(appEntry)
+ .addValues(xtRootUidEntry)
.addValues(otherEntry);
- stats.apply464xlatAdjustments(stackedIface);
+ final NetworkStats statsEbpf = new NetworkStats(TEST_START, 3)
+ .addValues(appEntry)
+ .addValues(ebpfRootUidEntry)
+ .addValues(otherEntry);
- assertEquals(3, stats.size());
- assertValues(stats, 0, v4Iface, appUid, SET_DEFAULT, TAG_NONE,
- METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+ statsXt.apply464xlatAdjustments(stackedIface, false);
+ statsEbpf.apply464xlatAdjustments(stackedIface, true);
+
+ assertEquals(3, statsXt.size());
+ assertEquals(3, statsEbpf.size());
+ final NetworkStats.Entry expectedAppUid = new NetworkStats.Entry(
+ v4Iface, appUid, SET_DEFAULT, TAG_NONE,
30949510,
22401,
1152335,
13805,
0);
- assertValues(stats, 1, baseIface, 0, SET_DEFAULT, TAG_NONE,
- METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+ final NetworkStats.Entry expectedRootUid = new NetworkStats.Entry(
+ baseIface, 0, SET_DEFAULT, TAG_NONE,
163577,
187,
17607,
97,
0);
- assertEquals(otherEntry, stats.getValues(2, null));
+ assertEquals(expectedAppUid, statsXt.getValues(0, null));
+ assertEquals(expectedRootUid, statsXt.getValues(1, null));
+ assertEquals(otherEntry, statsXt.getValues(2, null));
+ assertEquals(expectedAppUid, statsEbpf.getValues(0, null));
+ assertEquals(expectedRootUid, statsEbpf.getValues(1, null));
+ assertEquals(otherEntry, statsEbpf.getValues(2, null));
}
@Test
@@ -850,7 +884,7 @@ public class NetworkStatsTest {
.addValues(secondEntry);
// Empty map: no adjustment
- stats.apply464xlatAdjustments(new ArrayMap<>());
+ stats.apply464xlatAdjustments(new ArrayMap<>(), false);
assertEquals(2, stats.size());
assertEquals(firstEntry, stats.getValues(0, null));
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
index 4dc63f249a52..f12756a8062f 100644
--- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -25,6 +25,7 @@ import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_OEM;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_PRODUCT;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_VENDOR;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
+import static android.os.Process.SYSTEM_UID;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -55,26 +56,41 @@ public class PermissionMonitorTest {
private static final String PARTITION_OEM = "oem";
private static final String PARTITION_PRODUCT = "product";
private static final String PARTITION_VENDOR = "vendor";
+ private static final int VERSION_P = Build.VERSION_CODES.P;
+ private static final int VERSION_Q = Build.VERSION_CODES.Q;
@Mock private Context mContext;
@Mock private PackageManager mPackageManager;
private PermissionMonitor mPermissionMonitor;
+ private int mMockFirstSdkInt;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
- when(mPackageManager.getPackagesForUid(MOCK_UID)).thenReturn(MOCK_PACKAGE_NAMES);
- mPermissionMonitor = new PermissionMonitor(mContext, null);
+ when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(MOCK_PACKAGE_NAMES);
+ // Try to use spy() here for stubbing getDeviceFirstSdkInt value but the spies are loaded
+ // by a custom class loader that's different from the loader used for loading the real
+ // thing. That means those two classes are not in the same package, so a package private
+ // method is not accessible. Hence, using override method to control FIRST_SDK_INT value
+ // instead of spy function for testing.
+ mPermissionMonitor = new PermissionMonitor(mContext, null) {
+ @Override
+ int getDeviceFirstSdkInt() {
+ return mMockFirstSdkInt;
+ }
+ };
}
- private void expectPermission(String[] permissions, String partition,
- int targetSdkVersion) throws Exception {
- final PackageInfo packageInfo = packageInfoWithPermissions(permissions, partition);
+ private boolean hasBgPermission(String partition, int targetSdkVersion, int uid,
+ String... permission) throws Exception {
+ final PackageInfo packageInfo = packageInfoWithPermissions(permission, partition);
packageInfo.applicationInfo.targetSdkVersion = targetSdkVersion;
+ packageInfo.applicationInfo.uid = uid;
when(mPackageManager.getPackageInfoAsUser(
eq(MOCK_PACKAGE_NAMES[0]), eq(GET_PERMISSIONS), anyInt())).thenReturn(packageInfo);
+ return mPermissionMonitor.hasUseBackgroundNetworksPermission(uid);
}
private PackageInfo packageInfoWithPermissions(String[] permissions, String partition) {
@@ -136,51 +152,44 @@ public class PermissionMonitorTest {
@Test
public void testHasUseBackgroundNetworksPermission() throws Exception {
- expectPermission(new String[] { CHANGE_NETWORK_STATE },
- PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { NETWORK_STACK }, PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CONNECTIVITY_INTERNAL },
- PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CONNECTIVITY_USE_RESTRICTED_NETWORKS },
- PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
-
- expectPermission(new String[] { CHANGE_NETWORK_STATE },
- PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { NETWORK_STACK },
- PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CONNECTIVITY_INTERNAL },
- PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CONNECTIVITY_USE_RESTRICTED_NETWORKS },
- PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
-
- expectPermission(new String[] {}, PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CHANGE_WIFI_STATE },
- PARTITION_SYSTEM, Build.VERSION_CODES.P);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] {}, PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CHANGE_WIFI_STATE },
- PARTITION_VENDOR, Build.VERSION_CODES.P);
- assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
-
- expectPermission(new String[] {}, PARTITION_SYSTEM, Build.VERSION_CODES.Q);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CHANGE_WIFI_STATE },
- PARTITION_SYSTEM, Build.VERSION_CODES.Q);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] {}, PARTITION_VENDOR, Build.VERSION_CODES.Q);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
- expectPermission(new String[] { CHANGE_WIFI_STATE },
- PARTITION_VENDOR, Build.VERSION_CODES.Q);
- assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID));
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CHANGE_NETWORK_STATE));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, NETWORK_STACK));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CONNECTIVITY_INTERNAL));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID,
+ CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_P, MOCK_UID, CHANGE_WIFI_STATE));
+
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID));
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID, CHANGE_WIFI_STATE));
+ }
+
+ @Test
+ public void testHasUseBackgroundNetworksPermissionSystemUid() throws Exception {
+ mMockFirstSdkInt = VERSION_P;
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CHANGE_WIFI_STATE));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID,
+ CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+
+ mMockFirstSdkInt = VERSION_Q;
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID));
+ assertFalse(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CHANGE_WIFI_STATE));
+ assertTrue(hasBgPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID,
+ CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ }
+
+ @Test
+ public void testHasUseBackgroundNetworksPermissionVendorApp() throws Exception {
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID));
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CHANGE_NETWORK_STATE));
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, NETWORK_STACK));
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CONNECTIVITY_INTERNAL));
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID,
+ CONNECTIVITY_USE_RESTRICTED_NETWORKS));
+ assertTrue(hasBgPermission(PARTITION_VENDOR, VERSION_P, MOCK_UID, CHANGE_WIFI_STATE));
+
+ assertFalse(hasBgPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID));
+ assertFalse(hasBgPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID, CHANGE_WIFI_STATE));
}
}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 74722787f441..03306143872b 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -785,6 +785,23 @@ public class WifiConfiguration implements Parcelable {
/**
* @hide
+ * Use factory MAC when connecting to this network
+ */
+ public static final int RANDOMIZATION_NONE = 0;
+ /**
+ * @hide
+ * Generate a randomized MAC once and reuse it for all connections to this network
+ */
+ public static final int RANDOMIZATION_PERSISTENT = 1;
+
+ /**
+ * @hide
+ * Level of MAC randomization for this network
+ */
+ public int macRandomizationSetting = RANDOMIZATION_PERSISTENT;
+
+ /**
+ * @hide
* Randomized MAC address to use with this particular network
*/
@NonNull
@@ -1645,6 +1662,7 @@ public class WifiConfiguration implements Parcelable {
if (this.meteredOverride != METERED_OVERRIDE_NONE) {
sbuf.append(" meteredOverride ").append(meteredOverride).append("\n");
}
+ sbuf.append(" macRandomizationSetting ").append(macRandomizationSetting).append("\n");
sbuf.append(" KeyMgmt:");
for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
if (this.allowedKeyManagement.get(k)) {
@@ -2109,6 +2127,7 @@ public class WifiConfiguration implements Parcelable {
shared = source.shared;
recentFailure.setAssociationStatus(source.recentFailure.getAssociationStatus());
mRandomizedMacAddress = source.mRandomizedMacAddress;
+ macRandomizationSetting = source.macRandomizationSetting;
}
}
@@ -2173,6 +2192,7 @@ public class WifiConfiguration implements Parcelable {
dest.writeString(mPasspointManagementObjectTree);
dest.writeInt(recentFailure.getAssociationStatus());
dest.writeParcelable(mRandomizedMacAddress, flags);
+ dest.writeInt(macRandomizationSetting);
}
/** Implement the Parcelable interface {@hide} */
@@ -2239,6 +2259,7 @@ public class WifiConfiguration implements Parcelable {
config.mPasspointManagementObjectTree = in.readString();
config.recentFailure.setAssociationStatus(in.readInt());
config.mRandomizedMacAddress = in.readParcelable(null);
+ config.macRandomizationSetting = in.readInt();
return config;
}
diff --git a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java b/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
index 4b76526cbb59..5c9db539c8f5 100644
--- a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
+++ b/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
@@ -160,9 +160,9 @@ public abstract class ProvisioningCallback {
public static final int OSU_STATUS_AP_CONNECTED = 2;
/**
- * The status code for provisioning flow to indicate the server connection is completed.
+ * The status code for provisioning flow to indicate connecting to the server.
*/
- public static final int OSU_STATUS_SERVER_CONNECTED = 3;
+ public static final int OSU_STATUS_SERVER_CONNECTING = 3;
/**
* The status code for provisioning flow to indicate the server certificate is validated.
@@ -170,9 +170,9 @@ public abstract class ProvisioningCallback {
public static final int OSU_STATUS_SERVER_VALIDATED = 4;
/**
- * The status code for provisioning flow to indicate the service provider is verified.
+ * The status code for provisioning flow to indicate the server is connected
*/
- public static final int OSU_STATUS_SERVICE_PROVIDER_VERIFIED = 5;
+ public static final int OSU_STATUS_SERVER_CONNECTED = 5;
/**
* The status code for provisioning flow to indicate starting the first SOAP exchange.