summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp7
-rw-r--r--api/current.txt388
-rw-r--r--api/system-current.txt238
-rw-r--r--api/test-current.txt111
-rwxr-xr-xcmds/hid/hid6
-rw-r--r--cmds/incident_helper/src/ih_util.cpp2
-rw-r--r--cmds/incident_helper/src/parsers/CpuInfoParser.cpp5
-rw-r--r--cmds/incident_helper/testdata/cpuinfo.txt8
-rw-r--r--cmds/statsd/Android.bp2
-rw-r--r--cmds/statsd/OWNERS1
-rw-r--r--cmds/statsd/src/StatsService.cpp49
-rw-r--r--cmds/statsd/src/atoms.proto59
-rw-r--r--cmds/statsd/src/external/GpuStatsPuller.cpp91
-rw-r--r--cmds/statsd/src/external/GpuStatsPuller.h36
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp4
-rw-r--r--cmds/statsd/src/logd/LogEvent.cpp132
-rw-r--r--cmds/statsd/src/logd/LogEvent.h27
-rw-r--r--config/hiddenapi-greylist.txt106
-rw-r--r--core/java/android/app/AppOpsManager.java1425
-rw-r--r--core/java/android/app/NotificationManager.java8
-rw-r--r--core/java/android/app/TEST_MAPPING51
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java51
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl1
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl10
-rw-r--r--core/java/android/app/contentsuggestions/ClassificationsRequest.java10
-rw-r--r--core/java/android/app/contentsuggestions/SelectionsRequest.java12
-rw-r--r--core/java/android/app/job/IJobCallback.aidl5
-rw-r--r--core/java/android/app/job/IJobService.aidl2
-rw-r--r--core/java/android/app/role/OnRoleHoldersChangedListener.java2
-rw-r--r--core/java/android/app/role/RoleManager.java8
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl6
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java38
-rw-r--r--core/java/android/companion/BluetoothDeviceFilterUtils.java4
-rw-r--r--core/java/android/content/ContentProviderNative.java1
-rw-r--r--core/java/android/content/Context.java6
-rw-r--r--core/java/android/content/IContentService.aidl6
-rw-r--r--core/java/android/content/IIntentReceiver.aidl1
-rw-r--r--core/java/android/content/ISyncAdapter.aidl3
-rw-r--r--core/java/android/content/ISyncServiceAdapter.aidl2
-rw-r--r--core/java/android/content/ISyncStatusObserver.aidl1
-rw-r--r--core/java/android/content/Intent.java2
-rw-r--r--core/java/android/content/om/IOverlayManager.aidl2
-rw-r--r--core/java/android/content/pm/IPackageDataObserver.aidl1
-rw-r--r--core/java/android/content/pm/IPackageDeleteObserver.aidl1
-rw-r--r--core/java/android/content/pm/IPackageDeleteObserver2.aidl1
-rw-r--r--core/java/android/content/pm/IPackageInstallObserver2.aidl2
-rw-r--r--core/java/android/content/pm/IPackageInstaller.aidl1
-rw-r--r--core/java/android/content/pm/IPackageInstallerCallback.aidl5
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl56
-rw-r--r--core/java/android/content/pm/IPackageStatsObserver.aidl1
-rw-r--r--core/java/android/content/res/Resources.java8
-rw-r--r--core/java/android/content/res/ResourcesImpl.java1
-rw-r--r--core/java/android/content/rollback/RollbackManager.java3
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java26
-rw-r--r--core/java/android/database/sqlite/SQLiteOpenHelper.java9
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java8
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java54
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java8
-rw-r--r--core/java/android/hardware/camera2/params/MandatoryStreamCombination.java71
-rw-r--r--core/java/android/hardware/display/DisplayManagerGlobal.java15
-rw-r--r--core/java/android/hardware/display/DisplayManagerInternal.java8
-rw-r--r--core/java/android/hardware/display/IDisplayManager.aidl2
-rw-r--r--core/java/android/hardware/hdmi/HdmiControlManager.java7
-rw-r--r--core/java/android/net/ConnectivityManager.java2
-rw-r--r--core/java/android/net/InetAddresses.java6
-rw-r--r--core/java/android/net/LinkAddress.java9
-rw-r--r--core/java/android/net/NetworkCapabilities.java13
-rw-r--r--core/java/android/net/Uri.java2
-rw-r--r--core/java/android/net/VpnService.java44
-rw-r--r--core/java/android/net/http/SslCertificate.java3
-rw-r--r--core/java/android/os/PowerManager.java27
-rw-r--r--core/java/android/os/Process.java6
-rw-r--r--core/java/android/os/ZygoteProcess.java162
-rw-r--r--core/java/android/permission/IPermissionController.aidl1
-rw-r--r--core/java/android/permission/PermissionControllerManager.java71
-rw-r--r--core/java/android/permission/PermissionControllerService.java32
-rw-r--r--core/java/android/permission/RuntimePermissionPresentationInfo.java21
-rw-r--r--core/java/android/provider/DeviceConfig.java79
-rw-r--r--core/java/android/provider/Settings.java51
-rw-r--r--core/java/android/service/autofill/CustomDescription.java4
-rw-r--r--core/java/android/service/autofill/FillResponse.java15
-rw-r--r--core/java/android/service/autofill/UserData.java4
-rw-r--r--core/java/android/service/autofill/augmented/AugmentedAutofillService.java1
-rw-r--r--core/java/android/service/carrier/ApnService.java6
-rw-r--r--core/java/android/service/notification/Adjustment.java16
-rw-r--r--core/java/android/service/notification/NotificationAssistantService.java19
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java4
-rw-r--r--core/java/android/text/style/LineHeightSpan.java2
-rw-r--r--core/java/android/util/DocumentsStatsLog.java3
-rw-r--r--core/java/android/util/LocalLog.java19
-rw-r--r--core/java/android/util/LongSparseArray.java3
-rw-r--r--core/java/android/util/LongSparseLongArray.java2
-rw-r--r--core/java/android/view/Display.java22
-rw-r--r--core/java/android/view/DisplayInfo.java13
-rw-r--r--core/java/android/view/View.java4
-rw-r--r--core/java/android/view/ViewRootImpl.java4
-rw-r--r--core/java/android/view/WindowManager.java16
-rw-r--r--core/java/android/view/WindowManagerImpl.java9
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeIdManager.java13
-rw-r--r--core/java/android/view/inspector/InspectableProperty.java3
-rw-r--r--core/java/android/widget/AbsListView.java2
-rw-r--r--core/java/android/widget/RemoteViews.java11
-rw-r--r--core/java/android/widget/TextView.java2
-rw-r--r--core/java/android/widget/ToggleButton.java2
-rw-r--r--core/java/android/widget/ViewFlipper.java4
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java14
-rw-r--r--core/java/com/android/internal/app/IAppOpsService.aidl4
-rw-r--r--core/java/com/android/internal/os/BinderCallsStats.java2
-rw-r--r--core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java4
-rw-r--r--core/java/com/android/internal/os/Zygote.java145
-rw-r--r--core/java/com/android/internal/os/ZygoteArguments.java10
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java35
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java2
-rw-r--r--core/java/com/android/internal/os/ZygoteServer.java240
-rw-r--r--core/java/com/android/internal/policy/DecorView.java3
-rw-r--r--core/java/com/android/internal/widget/DecorCaptionView.java18
-rw-r--r--core/java/com/android/server/SystemConfig.java15
-rw-r--r--core/jni/android/graphics/TEST_MAPPING7
-rw-r--r--core/jni/android_util_AssetManager.cpp5
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp264
-rw-r--r--core/jni/fd_utils.cpp6
-rwxr-xr-xcore/jni/runtime_native_boot-flags-test.sh47
-rw-r--r--core/proto/android/app/settings_enums.proto6
-rw-r--r--core/res/AndroidManifest.xml15
-rw-r--r--core/res/res/color-car/car_borderless_button_text_color.xml20
-rw-r--r--core/res/res/color-car/car_button_text_color.xml20
-rw-r--r--core/res/res/color-car/car_switch.xml24
-rw-r--r--core/res/res/drawable-car/car_button_background.xml36
-rw-r--r--core/res/res/drawable-car/car_checkbox.xml23
-rw-r--r--core/res/res/drawable-car/car_dialog_button_background.xml22
-rw-r--r--core/res/res/drawable-car/car_seekbar_thumb.xml24
-rw-r--r--core/res/res/drawable-car/car_seekbar_thumb_dark.xml24
-rw-r--r--core/res/res/drawable-car/car_seekbar_thumb_light.xml24
-rw-r--r--core/res/res/drawable-car/car_seekbar_track.xml43
-rw-r--r--core/res/res/drawable-car/car_seekbar_track_dark.xml44
-rw-r--r--core/res/res/drawable-car/car_seekbar_track_light.xml44
-rw-r--r--core/res/res/drawable-car/car_switch_thumb.xml25
-rw-r--r--core/res/res/drawable-nodpi/stat_sys_adb.xml24
-rw-r--r--core/res/res/layout-car/car_preference.xml72
-rw-r--r--core/res/res/layout-car/car_preference_category.xml65
-rw-r--r--core/res/res/layout-car/car_resolver_different_item_header.xml33
-rw-r--r--core/res/res/layout-car/car_resolver_list.xml112
-rw-r--r--core/res/res/layout-car/car_resolver_list_with_default.xml161
-rw-r--r--core/res/res/layout/immersive_mode_cling.xml6
-rw-r--r--core/res/res/values-af/strings.xml32
-rw-r--r--core/res/res/values-am/strings.xml32
-rw-r--r--core/res/res/values-ar/strings.xml32
-rw-r--r--core/res/res/values-as/strings.xml65
-rw-r--r--core/res/res/values-az/strings.xml32
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml32
-rw-r--r--core/res/res/values-be/strings.xml32
-rw-r--r--core/res/res/values-bg/strings.xml32
-rw-r--r--core/res/res/values-bn/strings.xml29
-rw-r--r--core/res/res/values-bs/strings.xml32
-rw-r--r--core/res/res/values-ca/strings.xml34
-rw-r--r--core/res/res/values-cs/strings.xml32
-rw-r--r--core/res/res/values-da/strings.xml29
-rw-r--r--core/res/res/values-de/strings.xml36
-rw-r--r--core/res/res/values-el/strings.xml32
-rw-r--r--core/res/res/values-en-rAU/strings.xml29
-rw-r--r--core/res/res/values-en-rCA/strings.xml29
-rw-r--r--core/res/res/values-en-rGB/strings.xml29
-rw-r--r--core/res/res/values-en-rIN/strings.xml29
-rw-r--r--core/res/res/values-en-rXC/strings.xml29
-rw-r--r--core/res/res/values-es-rUS/strings.xml36
-rw-r--r--core/res/res/values-es/strings.xml29
-rw-r--r--core/res/res/values-et/strings.xml32
-rw-r--r--core/res/res/values-eu/strings.xml34
-rw-r--r--core/res/res/values-fa/strings.xml32
-rw-r--r--core/res/res/values-fi/strings.xml29
-rw-r--r--core/res/res/values-fr-rCA/strings.xml32
-rw-r--r--core/res/res/values-fr/strings.xml34
-rw-r--r--core/res/res/values-gl/strings.xml32
-rw-r--r--core/res/res/values-gu/strings.xml32
-rw-r--r--core/res/res/values-hi/strings.xml87
-rw-r--r--core/res/res/values-hr/strings.xml32
-rw-r--r--core/res/res/values-hu/strings.xml32
-rw-r--r--core/res/res/values-hy/strings.xml29
-rw-r--r--core/res/res/values-in/strings.xml32
-rw-r--r--core/res/res/values-is/strings.xml32
-rw-r--r--core/res/res/values-it/strings.xml32
-rw-r--r--core/res/res/values-iw/strings.xml32
-rw-r--r--core/res/res/values-ja/strings.xml32
-rw-r--r--core/res/res/values-ka/strings.xml29
-rw-r--r--core/res/res/values-kk/strings.xml34
-rw-r--r--core/res/res/values-km/strings.xml34
-rw-r--r--core/res/res/values-kn/strings.xml29
-rw-r--r--core/res/res/values-ko/strings.xml29
-rw-r--r--core/res/res/values-ky/strings.xml32
-rw-r--r--core/res/res/values-lo/strings.xml32
-rw-r--r--core/res/res/values-lt/strings.xml32
-rw-r--r--core/res/res/values-lv/strings.xml32
-rw-r--r--core/res/res/values-mk/strings.xml32
-rw-r--r--core/res/res/values-ml/strings.xml32
-rw-r--r--core/res/res/values-mn/strings.xml32
-rw-r--r--core/res/res/values-mr/strings.xml32
-rw-r--r--core/res/res/values-ms/strings.xml29
-rw-r--r--core/res/res/values-my/strings.xml32
-rw-r--r--core/res/res/values-nb/strings.xml32
-rw-r--r--core/res/res/values-ne/strings.xml32
-rw-r--r--core/res/res/values-nl/strings.xml32
-rw-r--r--core/res/res/values-or/strings.xml52
-rw-r--r--core/res/res/values-pa/strings.xml32
-rw-r--r--core/res/res/values-pl/strings.xml29
-rw-r--r--core/res/res/values-pt-rBR/strings.xml29
-rw-r--r--core/res/res/values-pt-rPT/strings.xml29
-rw-r--r--core/res/res/values-pt/strings.xml29
-rw-r--r--core/res/res/values-ro/strings.xml32
-rw-r--r--core/res/res/values-ru/strings.xml29
-rw-r--r--core/res/res/values-si/strings.xml32
-rw-r--r--core/res/res/values-sk/strings.xml32
-rw-r--r--core/res/res/values-sl/strings.xml32
-rw-r--r--core/res/res/values-sq/strings.xml32
-rw-r--r--core/res/res/values-sr/strings.xml32
-rw-r--r--core/res/res/values-sv/strings.xml32
-rw-r--r--core/res/res/values-sw/strings.xml32
-rw-r--r--core/res/res/values-ta/strings.xml52
-rw-r--r--core/res/res/values-te/strings.xml32
-rw-r--r--core/res/res/values-th/strings.xml32
-rw-r--r--core/res/res/values-tl/strings.xml32
-rw-r--r--core/res/res/values-tr/strings.xml32
-rw-r--r--core/res/res/values-uk/strings.xml33
-rw-r--r--core/res/res/values-ur/strings.xml32
-rw-r--r--core/res/res/values-uz/strings.xml32
-rw-r--r--core/res/res/values-vi/strings.xml29
-rw-r--r--core/res/res/values-zh-rCN/strings.xml32
-rw-r--r--core/res/res/values-zh-rHK/strings.xml32
-rw-r--r--core/res/res/values-zh-rTW/strings.xml29
-rw-r--r--core/res/res/values-zu/strings.xml32
-rw-r--r--core/res/res/values/config.xml29
-rw-r--r--core/res/res/values/symbols.xml2
-rw-r--r--core/tests/BroadcastRadioTests/Android.mk2
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java11
-rw-r--r--data/etc/com.android.settings.xml1
-rw-r--r--graphics/TEST_MAPPING7
-rw-r--r--graphics/java/android/graphics/ImageDecoder.java35
-rw-r--r--graphics/java/android/graphics/drawable/ColorStateListDrawable.java29
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java4
-rw-r--r--keystore/tests/Android.mk2
-rw-r--r--keystore/tests/AndroidManifest.xml2
-rw-r--r--keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java12
-rw-r--r--keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java6
-rw-r--r--libs/androidfw/AssetManager2.cpp2
-rw-r--r--location/java/android/location/ILocationManager.aidl1
-rw-r--r--location/java/android/location/LocationManager.java17
-rw-r--r--location/java/android/location/LocationRequest.java10
-rw-r--r--location/java/com/android/internal/location/GpsNetInitiatedHandler.java9
-rw-r--r--location/java/com/android/internal/location/ProviderRequest.java2
-rw-r--r--media/apex/java/android/media/CallbackDataSourceDesc.java10
-rw-r--r--media/apex/java/android/media/DataSourceCallback.java4
-rw-r--r--media/apex/java/android/media/DataSourceDesc.java5
-rw-r--r--media/apex/java/android/media/FileDataSourceDesc.java5
-rw-r--r--media/apex/java/android/media/MediaPlayer2.java85
-rw-r--r--media/apex/java/android/media/UriDataSourceDesc.java15
-rw-r--r--media/java/android/media/AudioManager.java29
-rw-r--r--media/java/android/media/AudioTrack.java84
-rw-r--r--media/java/android/media/HwAudioSource.java2
-rw-r--r--media/java/android/media/IAudioService.aidl4
-rw-r--r--media/java/android/media/MediaPlayer.java2
-rw-r--r--media/java/android/media/MediaTimestamp.java2
-rw-r--r--media/java/android/media/PlayerBase.java8
-rw-r--r--media/java/android/media/SubtitleData.java2
-rw-r--r--media/java/android/media/TimedMetaData.java2
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategies.java2
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroup.java2
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroups.java2
-rw-r--r--media/tests/MediaFrameworkTest/Android.mk2
-rw-r--r--media/tests/MediaFrameworkTest/AndroidManifest.xml2
-rw-r--r--media/tests/MediaFrameworkTest/AndroidTest.xml2
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java4
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaFileTest.java3
-rw-r--r--packages/BackupRestoreConfirmation/res/values-de/strings.xml2
-rw-r--r--packages/ExtServices/tests/Android.bp8
-rw-r--r--packages/ExtServices/tests/AndroidManifest.xml2
-rw-r--r--packages/ExtServices/tests/AndroidTest.xml2
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/AgingHelperTest.java5
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java5
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java3
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/EntityTypeCounterTest.java3
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java5
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java5
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/SmartActionsHelperTest.java5
-rw-r--r--packages/NetworkStack/tests/Android.bp2
-rw-r--r--packages/NetworkStack/tests/AndroidManifest.xml2
-rw-r--r--packages/NetworkStack/tests/AndroidTest.xml2
-rw-r--r--packages/NetworkStack/tests/src/android/net/apf/ApfTest.java7
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java9
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java7
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java3
-rw-r--r--packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java5
-rw-r--r--packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java5
-rw-r--r--packages/NetworkStack/tests/src/android/net/ip/IpReachabilityMonitorTest.java6
-rw-r--r--packages/NetworkStack/tests/src/android/net/util/ConnectivityPacketSummaryTest.java5
-rw-r--r--packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java5
-rw-r--r--packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java6
-rw-r--r--packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java5
-rw-r--r--packages/SettingsLib/res/drawable/ic_volume_remote.xml (renamed from packages/SystemUI/res/drawable/ic_volume_remote.xml)0
-rw-r--r--packages/SettingsLib/res/drawable/ic_volume_remote_mute.xml (renamed from packages/SystemUI/res/drawable/ic_volume_remote_mute.xml)0
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/location/RecentLocationAccesses.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/volume/D.java23
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/volume/MediaSessions.java (renamed from packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java)99
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/volume/Util.java187
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java18
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java2
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java57
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java12
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java10
-rw-r--r--packages/SystemUI/Android.bp3
-rw-r--r--packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.pngbin27326 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/layout/bubble_clock.xml4
-rw-r--r--packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml4
-rw-r--r--packages/SystemUI/res/layout/quick_settings_footer_dialog.xml28
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_text_area.xml4
-rw-r--r--packages/SystemUI/res/values-af/strings.xml9
-rw-r--r--packages/SystemUI/res/values-am/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml9
-rw-r--r--packages/SystemUI/res/values-as/strings.xml9
-rw-r--r--packages/SystemUI/res/values-az/strings.xml9
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml9
-rw-r--r--packages/SystemUI/res/values-be/strings.xml9
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml9
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml9
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml17
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml9
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml9
-rw-r--r--packages/SystemUI/res/values-da/strings.xml9
-rw-r--r--packages/SystemUI/res/values-de/strings.xml9
-rw-r--r--packages/SystemUI/res/values-el/strings.xml9
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml9
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml9
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml9
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml9
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml9
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml9
-rw-r--r--packages/SystemUI/res/values-es/strings.xml9
-rw-r--r--packages/SystemUI/res/values-et/strings.xml9
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml9
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml9
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml9
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml9
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml9
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml9
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml9
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml12
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml9
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml9
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml11
-rw-r--r--packages/SystemUI/res/values-in/strings.xml9
-rw-r--r--packages/SystemUI/res/values-is/strings.xml9
-rw-r--r--packages/SystemUI/res/values-it/strings.xml9
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml13
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml9
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml9
-rw-r--r--packages/SystemUI/res/values-km/strings.xml9
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml9
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml9
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml9
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml9
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml9
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml9
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml9
-rw-r--r--packages/SystemUI/res/values-my/strings.xml9
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml9
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml9
-rw-r--r--packages/SystemUI/res/values-or/strings.xml12
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml9
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml9
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml9
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml9
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml9
-rw-r--r--packages/SystemUI/res/values-si/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml12
-rw-r--r--packages/SystemUI/res/values-te/strings.xml13
-rw-r--r--packages/SystemUI/res/values-th/strings.xml9
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml9
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml9
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml9
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml9
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml9
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml9
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml9
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml9
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml9
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml9
-rw-r--r--packages/SystemUI/res/values/internal.xml1
-rw-r--r--packages/SystemUI/res/values/styles.xml11
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl10
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java12
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/DevicePolicyManagerWrapper.java43
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java19
-rw-r--r--packages/SystemUI/src/com/android/keyguard/CarrierTextController.java87
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java1
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java13
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dependency.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/DependencyProvider.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/analytics/DataCollector.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/Classifier.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/DirectionEvaluator.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java39
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt272
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt215
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java66
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java63
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java295
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java48
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/Util.java144
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java245
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/ExpandedAnimationControllerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/chooser/ChooserHelperTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/AlwaysOnDisplayPolicyTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ScreenLifecycleTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/TouchAnimatorTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java63
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileColorPickerTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java13
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/SensorPrivacyTileTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/MediaNotificationProcessorTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapperTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapperTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarButtonTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarInflaterViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarRotationContextTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java141
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/LifecycleFragmentTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/wakelock/KeepAwakeAnimationListenerTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java15
-rw-r--r--proto/src/metrics_constants/metrics_constants.proto13
-rw-r--r--proto/src/wifi.proto24
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java2
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java116
-rw-r--r--services/core/java/com/android/server/LooperStatsService.java2
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java3
-rw-r--r--services/core/java/com/android/server/VibratorService.java5
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java2
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java2
-rw-r--r--services/core/java/com/android/server/am/SettingsToPropertiesMapper.java6
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java859
-rw-r--r--services/core/java/com/android/server/appop/HistoricalRegistry.java214
-rw-r--r--services/core/java/com/android/server/appop/TEST_MAPPING21
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceBroker.java114
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceInventory.java74
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java14
-rw-r--r--services/core/java/com/android/server/audio/BtHelper.java2
-rw-r--r--services/core/java/com/android/server/connectivity/TcpKeepaliveController.java13
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java4
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java48
-rw-r--r--services/core/java/com/android/server/display/DisplayDevice.java14
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java77
-rw-r--r--services/core/java/com/android/server/display/DisplayModeDirector.java685
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java195
-rw-r--r--services/core/java/com/android/server/display/LogicalDisplay.java27
-rw-r--r--services/core/java/com/android/server/display/OverlayDisplayAdapter.java17
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java11
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java5
-rw-r--r--services/core/java/com/android/server/os/BugreportManagerServiceImpl.java9
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java7
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverController.java2
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java45
-rw-r--r--services/core/java/com/android/server/rollback/RollbackData.java50
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java489
-rw-r--r--services/core/java/com/android/server/rollback/RollbackStore.java142
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java30
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java68
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java51
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java80
-rw-r--r--services/core/java/com/android/server/wm/ActivityStackSupervisor.java39
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java20
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java2
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java7
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java13
-rw-r--r--services/core/java/com/android/server/wm/RootActivityContainer.java7
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioner.java11
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerInternal.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java12
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java35
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java8
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java12
-rwxr-xr-xservices/tests/runtests.py2
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java26
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java91
-rw-r--r--services/tests/uiservicestests/Android.bp2
-rw-r--r--services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java14
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java5
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java6
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java17
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java25
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java5
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java11
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotifyingAppTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java5
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java6
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java14
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java6
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java36
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java15
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/PackageMatchingCacheTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java5
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java4
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java3
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java71
-rw-r--r--services/usage/java/com/android/server/usage/AppTimeLimitController.java12
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsDatabase.java33
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java17
-rw-r--r--services/usage/java/com/android/server/usage/UserUsageStatsService.java5
-rw-r--r--startop/iorap/tests/Android.bp2
-rw-r--r--startop/iorap/tests/AndroidManifest.xml2
-rw-r--r--startop/iorap/tests/AndroidTest.xml2
-rw-r--r--startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt37
-rw-r--r--startop/iorap/tests/src/com/google/android/startop/iorap/ParcelablesTest.kt20
-rw-r--r--startop/view_compiler/dex_builder_test/Android.bp2
-rw-r--r--startop/view_compiler/dex_builder_test/AndroidManifest.xml2
-rw-r--r--startop/view_compiler/dex_builder_test/AndroidTest.xml2
-rw-r--r--startop/view_compiler/dex_builder_test/src/android/startop/test/DexBuilderTest.java12
-rw-r--r--startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java15
-rw-r--r--telecomm/java/android/telecom/CallIdentification.java17
-rw-r--r--telecomm/java/android/telecom/PhoneAccountSuggestion.java5
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java21
-rw-r--r--telephony/java/android/provider/Telephony.java4
-rw-r--r--telephony/java/android/telephony/CallAttributes.java9
-rw-r--r--telephony/java/android/telephony/CarrierRestrictionRules.java19
-rw-r--r--telephony/java/android/telephony/NetworkService.java8
-rw-r--r--telephony/java/android/telephony/PhoneNumberRange.java2
-rw-r--r--telephony/java/android/telephony/ServiceState.java8
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java35
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java47
-rw-r--r--telephony/java/android/telephony/data/ApnSetting.java13
-rw-r--r--telephony/java/android/telephony/data/DataService.java9
-rw-r--r--telephony/java/android/telephony/data/QualifiedNetworksService.java5
-rw-r--r--telephony/java/android/telephony/euicc/EuiccManager.java2
-rw-r--r--telephony/java/android/telephony/ims/ImsCallSessionListener.java5
-rw-r--r--telephony/java/android/telephony/ims/ImsSsData.java42
-rw-r--r--telephony/java/android/telephony/ims/ImsSsInfo.java4
-rw-r--r--telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java13
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl9
-rw-r--r--telephony/java/com/android/internal/telephony/PhoneConstants.java5
-rw-r--r--tests/ActivityManagerPerfTests/tests/Android.mk2
-rw-r--r--tests/ActivityManagerPerfTests/tests/AndroidManifest.xml2
-rw-r--r--tests/ActivityManagerPerfTests/tests/AndroidTest.xml2
-rw-r--r--tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java3
-rw-r--r--tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BroadcastPerfTest.java5
-rw-r--r--tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java5
-rw-r--r--tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java5
-rw-r--r--tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java5
-rw-r--r--tests/ActivityManagerPerfTests/utils/Android.mk2
-rw-r--r--tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java3
-rw-r--r--tests/AppLaunch/Android.mk2
-rw-r--r--tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java4
-rw-r--r--tests/AppLaunchWear/Android.mk2
-rw-r--r--tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java5
-rw-r--r--tests/BackgroundDexOptServiceIntegrationTests/Android.mk2
-rw-r--r--tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml2
-rw-r--r--tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml2
-rw-r--r--tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java5
-rw-r--r--tests/Camera2Tests/CameraToo/tests/Android.mk2
-rw-r--r--tests/Camera2Tests/CameraToo/tests/AndroidManifest.xml2
-rw-r--r--tests/Compatibility/Android.mk2
-rw-r--r--tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java5
-rw-r--r--tests/Compatibility/src/com/android/compatibilitytest/AppCompatibilityRunner.java2
-rw-r--r--tests/DynamicCodeLoggerIntegrationTests/Android.mk2
-rw-r--r--tests/DynamicCodeLoggerIntegrationTests/AndroidManifest.xml2
-rw-r--r--tests/DynamicCodeLoggerIntegrationTests/AndroidTest.xml2
-rw-r--r--tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java5
-rw-r--r--tests/FlickerTests/AndroidManifest.xml2
-rw-r--r--tests/FlickerTests/lib/Android.mk4
-rw-r--r--tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java3
-rw-r--r--tests/FlickerTests/lib/src/com/android/server/wm/flicker/TransitionRunner.java3
-rw-r--r--tests/FlickerTests/lib/src/com/android/server/wm/flicker/WindowUtils.java3
-rw-r--r--tests/FlickerTests/lib/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitor.java2
-rw-r--r--tests/FlickerTests/lib/test/Android.mk2
-rw-r--r--tests/FlickerTests/lib/test/AndroidManifest.xml2
-rw-r--r--tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/LayersTraceTest.java3
-rw-r--r--tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/TestFileUtils.java3
-rw-r--r--tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitorTest.java4
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ChangeAppRotationTest.java5
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToAppTest.java7
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToHomeTest.java7
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/CommonTransitions.java3
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/DebugTest.java5
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/FlickerTestBase.java3
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppColdTest.java6
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppToSplitScreenTest.java6
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppWarmTest.java6
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/OpenImeWindowTest.java4
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ResizeSplitScreenTest.java7
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/SeamlessAppRotationTest.java5
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/SplitScreenToLauncherTest.java8
-rw-r--r--tests/Internal/Android.mk2
-rw-r--r--tests/Internal/AndroidManifest.xml2
-rw-r--r--tests/Internal/AndroidTest.xml2
-rw-r--r--tests/Internal/src/android/app/WallpaperColorsTest.java5
-rw-r--r--tests/Internal/src/android/app/WallpaperInfoTest.java7
-rw-r--r--tests/Internal/src/android/service/wallpaper/WallpaperServiceTest.java2
-rw-r--r--tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java7
-rw-r--r--tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java7
-rw-r--r--tests/Internal/src/com/android/internal/graphics/ColorUtilsTest.java7
-rw-r--r--tests/Internal/src/com/android/internal/ml/clustering/KMeansTest.java5
-rw-r--r--tests/PackageWatchdog/Android.mk2
-rw-r--r--tests/PackageWatchdog/AndroidManifest.xml2
-rw-r--r--tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java3
-rw-r--r--tests/RcsTests/Android.mk2
-rw-r--r--tests/RcsTests/AndroidManifest.xml2
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadIconChangedEventTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadNameChangedEventTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantJoinedEventTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantLeftEventTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsParticipantAliasChangedEventTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsParticipantQueryParamsTest.java3
-rw-r--r--tests/RcsTests/src/com/android/tests/ims/RcsThreadQueryParamsTest.java3
-rw-r--r--tests/RollbackTest/Android.mk2
-rw-r--r--tests/RollbackTest/RollbackTest.xml2
-rw-r--r--tests/RollbackTest/RollbackTest/AndroidManifest.xml2
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/LocalIntentSender.java3
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackBroadcastReceiver.java3
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java62
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java62
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java3
-rw-r--r--tests/ServiceCrashTest/Android.mk2
-rw-r--r--tests/UsageStatsPerfTests/Android.mk2
-rw-r--r--tests/UsageStatsPerfTests/AndroidManifest.xml2
-rw-r--r--tests/UsageStatsPerfTests/AndroidTest.xml2
-rw-r--r--tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java7
-rw-r--r--tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java5
-rw-r--r--tests/UsbTests/Android.mk2
-rw-r--r--tests/UsbTests/AndroidManifest.xml2
-rw-r--r--tests/UsbTests/AndroidTest.xml2
-rw-r--r--tests/UsbTests/src/com/android/server/usb/UsbDescriptorParserTests.java20
-rw-r--r--tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java8
-rw-r--r--tests/WindowAnimationJank/Android.mk2
-rw-r--r--tests/WindowAnimationJank/src/android/windowanimationjank/FullscreenRotationTest.java5
-rw-r--r--tests/WindowAnimationJank/src/android/windowanimationjank/WindowAnimationJankTestBase.java6
-rw-r--r--tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java146
-rw-r--r--tests/testables/Android.bp2
-rw-r--r--tests/testables/src/android/testing/AndroidTestingRunner.java8
-rw-r--r--tests/testables/src/android/testing/BaseFragmentTest.java3
-rw-r--r--tests/testables/src/android/testing/TestableInstrumentation.java3
-rw-r--r--tests/testables/src/android/testing/TestableLooper.java3
-rw-r--r--tests/testables/src/android/testing/ViewUtils.java1
-rw-r--r--tests/testables/tests/Android.mk2
-rw-r--r--tests/testables/tests/AndroidManifest.xml2
-rw-r--r--tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java4
-rw-r--r--tests/testables/tests/src/android/testing/TestableContentResolverTest.java5
-rw-r--r--tests/testables/tests/src/android/testing/TestablePermissionsTest.java7
-rw-r--r--tests/testables/tests/src/android/testing/TestableResourcesTest.java3
-rw-r--r--tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java10
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java89
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java282
-rw-r--r--tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java5
-rw-r--r--tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java25
-rw-r--r--tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/FieldProperty.java.txt39
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java5
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSpecifier.java27
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSuggestion.java30
-rw-r--r--wifi/java/android/net/wifi/hotspot2/OsuProvider.java5
862 files changed, 13409 insertions, 5642 deletions
diff --git a/Android.bp b/Android.bp
index 4b22f9e6670e..c97ee3da36e4 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1788,3 +1788,10 @@ filegroup {
],
}
+// Creates an index of AIDL methods; used for adding UnsupportedAppUsage
+// annotations to private apis
+aidl_mapping {
+ name: "framework-aidl-mappings",
+ srcs: [":framework-defaults"],
+ output: "framework-aidl-mappings.txt"
+} \ No newline at end of file
diff --git a/api/current.txt b/api/current.txt
index 9dbfd51e9871..76e14abc13f8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4268,6 +4268,7 @@ package android.app {
method public int noteOpNoThrow(String, int, String);
method public int noteProxyOp(String, String);
method public int noteProxyOpNoThrow(String, String);
+ method public int noteProxyOpNoThrow(@NonNull String, @Nullable String, int);
method public static String permissionToOp(String);
method public int startOp(String, int, String);
method public int startOpNoThrow(String, int, String);
@@ -4276,7 +4277,8 @@ package android.app {
method public void stopWatchingMode(android.app.AppOpsManager.OnOpChangedListener);
method public int unsafeCheckOp(String, int, String);
method public int unsafeCheckOpNoThrow(String, int, String);
- method public int unsafeCheckOpRaw(String, int, String);
+ method public int unsafeCheckOpRaw(@NonNull String, int, String);
+ method public int unsafeCheckOpRawNoThrow(@NonNull String, int, @NonNull String);
field public static final int MODE_ALLOWED = 0; // 0x0
field public static final int MODE_DEFAULT = 3; // 0x3
field public static final int MODE_ERRORED = 2; // 0x2
@@ -5785,7 +5787,7 @@ package android.app {
method public boolean areBubblesAllowed();
method public boolean areNotificationsEnabled();
method public boolean areNotificationsPaused();
- method public boolean canNotifyAsPackage(String);
+ method public boolean canNotifyAsPackage(@NonNull String);
method public void cancel(int);
method public void cancel(String, int);
method public void cancelAll();
@@ -5806,15 +5808,15 @@ package android.app {
method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
method @Nullable public String getNotificationDelegate();
method public android.app.NotificationManager.Policy getNotificationPolicy();
- method public boolean isNotificationAssistantAccessGranted(android.content.ComponentName);
+ method public boolean isNotificationAssistantAccessGranted(@NonNull android.content.ComponentName);
method public boolean isNotificationListenerAccessGranted(android.content.ComponentName);
method public boolean isNotificationPolicyAccessGranted();
method public void notify(int, android.app.Notification);
method public void notify(String, int, android.app.Notification);
- method public void notifyAsPackage(@NonNull String, @NonNull String, int, android.app.Notification);
+ method public void notifyAsPackage(@NonNull String, @NonNull String, int, @NonNull android.app.Notification);
method public boolean removeAutomaticZenRule(String);
method public void revokeNotificationDelegate();
- method public void setAutomaticZenRuleState(String, android.service.notification.Condition);
+ method public void setAutomaticZenRuleState(@NonNull String, @NonNull android.service.notification.Condition);
method public final void setInterruptionFilter(int);
method public void setNotificationDelegate(@NonNull String);
method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy);
@@ -9650,7 +9652,7 @@ package android.content {
public abstract class Context {
ctor public Context();
- method public boolean bindIsolatedService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String);
+ method public boolean bindIsolatedService(@RequiresPermission @NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String);
method public abstract boolean bindService(@RequiresPermission android.content.Intent, @NonNull android.content.ServiceConnection, int);
method @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)") public abstract int checkCallingOrSelfPermission(@NonNull String);
method @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)") public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
@@ -9703,7 +9705,7 @@ package android.content {
method public abstract java.io.File getNoBackupFilesDir();
method public abstract java.io.File getObbDir();
method public abstract java.io.File[] getObbDirs();
- method public String getOpPackageName();
+ method @NonNull public String getOpPackageName();
method public abstract String getPackageCodePath();
method public abstract android.content.pm.PackageManager getPackageManager();
method public abstract String getPackageName();
@@ -12335,7 +12337,7 @@ package android.content.res {
public final class Resources.Theme {
method public void applyStyle(int, boolean);
method public void dump(int, String, String);
- method public int[] getAttributeResolutionStack(@AttrRes int, @StyleRes int, @StyleRes int);
+ method @NonNull public int[] getAttributeResolutionStack(@AttrRes int, @StyleRes int, @StyleRes int);
method public int getChangingConfigurations();
method public android.graphics.drawable.Drawable getDrawable(@DrawableRes int) throws android.content.res.Resources.NotFoundException;
method @StyleRes public int getExplicitStyle(@Nullable android.util.AttributeSet);
@@ -14154,6 +14156,7 @@ package android.graphics {
method @Nullable public android.graphics.ImageDecoder.OnPartialImageListener getOnPartialImageListener();
method @Nullable public android.graphics.PostProcessor getPostProcessor();
method public boolean isDecodeAsAlphaMaskEnabled();
+ method public static boolean isMimeTypeSupported(@NonNull String);
method public boolean isMutableRequired();
method public boolean isUnpremultipliedRequired();
method public void setAllocator(int);
@@ -15273,18 +15276,18 @@ package android.graphics.drawable {
public class ColorStateListDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
ctor public ColorStateListDrawable();
- ctor public ColorStateListDrawable(android.content.res.ColorStateList);
+ ctor public ColorStateListDrawable(@NonNull android.content.res.ColorStateList);
method public void clearAlpha();
- method public void draw(android.graphics.Canvas);
+ method public void draw(@NonNull android.graphics.Canvas);
method @NonNull public android.content.res.ColorStateList getColorStateList();
method public int getOpacity();
method public boolean hasFocusStateSpecified();
- method public void invalidateDrawable(android.graphics.drawable.Drawable);
- method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable, long);
method public void setAlpha(@IntRange(from=0, to=255) int);
- method public void setColorFilter(android.graphics.ColorFilter);
- method public void setColorStateList(android.content.res.ColorStateList);
- method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ method public void setColorFilter(@Nullable android.graphics.ColorFilter);
+ method public void setColorStateList(@NonNull android.content.res.ColorStateList);
+ method public void unscheduleDrawable(@NonNull android.graphics.drawable.Drawable, @NonNull Runnable);
}
public abstract class Drawable {
@@ -16643,7 +16646,7 @@ package android.hardware.camera2 {
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailablePhysicalCameraRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableSessionKeys();
method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
- method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
+ method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
method @NonNull public java.util.Set<java.lang.String> getPhysicalCameraIds();
method @Nullable public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int);
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
@@ -16795,6 +16798,7 @@ package android.hardware.camera2 {
public abstract static class CameraManager.AvailabilityCallback {
ctor public CameraManager.AvailabilityCallback();
+ method public void onCameraAccessPrioritiesChanged();
method public void onCameraAvailable(@NonNull String);
method public void onCameraUnavailable(@NonNull String);
}
@@ -17275,13 +17279,13 @@ package android.hardware.camera2.params {
}
public final class MandatoryStreamCombination {
- method public String getDescription();
- method public java.util.List<android.hardware.camera2.params.MandatoryStreamCombination.MandatoryStreamInformation> getStreamsInformation();
+ method @NonNull public CharSequence getDescription();
+ method @NonNull public java.util.List<android.hardware.camera2.params.MandatoryStreamCombination.MandatoryStreamInformation> getStreamsInformation();
method public boolean isReprocessable();
}
public static final class MandatoryStreamCombination.MandatoryStreamInformation {
- method public java.util.List<android.util.Size> getAvailableSizes();
+ method @NonNull public java.util.List<android.util.Size> getAvailableSizes();
method public int getFormat();
method public boolean isInput();
}
@@ -23565,14 +23569,13 @@ package android.media {
method @Deprecated public void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
- method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method protected void finalize();
method public void flush();
method @NonNull public android.media.AudioAttributes getAudioAttributes();
method public int getAudioFormat();
method public int getAudioSessionId();
- method public int getBufferCapacityInFrames();
- method public int getBufferSizeInFrames();
+ method @IntRange(from=0) public int getBufferCapacityInFrames();
+ method @IntRange(from=0) public int getBufferSizeInFrames();
method public int getChannelConfiguration();
method public int getChannelCount();
method @NonNull public android.media.AudioFormat getFormat();
@@ -23583,6 +23586,8 @@ package android.media {
method @Deprecated protected int getNativeFrameCount();
method public static int getNativeOutputSampleRate(int);
method public int getNotificationMarkerPosition();
+ method @IntRange(from=0) public int getOffloadDelay();
+ method @IntRange(from=0) public int getOffloadPadding();
method public int getPerformanceMode();
method public int getPlayState();
method public int getPlaybackHeadPosition();
@@ -23597,6 +23602,7 @@ package android.media {
method public boolean getTimestamp(android.media.AudioTimestamp);
method public int getUnderrunCount();
method public static boolean isDirectPlaybackSupported(@NonNull android.media.AudioFormat, @NonNull android.media.AudioAttributes);
+ method public boolean isOffloadedPlayback();
method public void pause() throws java.lang.IllegalStateException;
method public void play() throws java.lang.IllegalStateException;
method public void registerStreamEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioTrack.StreamEventCallback);
@@ -23604,13 +23610,13 @@ package android.media {
method public int reloadStaticData();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener);
- method public int setAuxEffectSendLevel(float);
- method public int setBufferSizeInFrames(int);
- method public int setLoopPoints(int, int, int);
+ method public int setAuxEffectSendLevel(@FloatRange(from=0.0) float);
+ method public int setBufferSizeInFrames(@IntRange(from=0) int);
+ method public int setLoopPoints(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0xffffffff) int);
method public int setNotificationMarkerPosition(int);
- method public void setOffloadDelayPadding(int, int);
+ method public void setOffloadDelayPadding(@IntRange(from=0) int, @IntRange(from=0) int);
method public void setOffloadEndOfStream();
- method public int setPlaybackHeadPosition(int);
+ method public int setPlaybackHeadPosition(@IntRange(from=0) int);
method public void setPlaybackParams(@NonNull android.media.PlaybackParams);
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener);
method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler);
@@ -23655,10 +23661,10 @@ package android.media {
method @NonNull public android.media.AudioTrack build() throws java.lang.UnsupportedOperationException;
method @NonNull public android.media.AudioTrack.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException;
method @NonNull public android.media.AudioTrack.Builder setAudioFormat(@NonNull android.media.AudioFormat) throws java.lang.IllegalArgumentException;
- method @NonNull public android.media.AudioTrack.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setBufferSizeInBytes(@IntRange(from=0) int) throws java.lang.IllegalArgumentException;
method @NonNull public android.media.AudioTrack.Builder setOffloadedPlayback(boolean);
method @NonNull public android.media.AudioTrack.Builder setPerformanceMode(int);
- method @NonNull public android.media.AudioTrack.Builder setSessionId(int) throws java.lang.IllegalArgumentException;
+ method @NonNull public android.media.AudioTrack.Builder setSessionId(@IntRange(from=1) int) throws java.lang.IllegalArgumentException;
method @NonNull public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
}
@@ -23682,18 +23688,18 @@ package android.media {
public abstract static class AudioTrack.StreamEventCallback {
ctor public AudioTrack.StreamEventCallback();
- method public void onDataRequest(android.media.AudioTrack, int);
- method public void onPresentationEnded(android.media.AudioTrack);
- method public void onTearDown(android.media.AudioTrack);
+ method public void onDataRequest(@NonNull android.media.AudioTrack, @IntRange(from=0) int);
+ method public void onPresentationEnded(@NonNull android.media.AudioTrack);
+ method public void onTearDown(@NonNull android.media.AudioTrack);
}
public class CallbackDataSourceDesc extends android.media.DataSourceDesc {
- method public android.media.DataSourceCallback getDataSourceCallback();
+ method @NonNull public android.media.DataSourceCallback getDataSourceCallback();
}
public static class CallbackDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.CallbackDataSourceDesc.Builder> {
ctor public CallbackDataSourceDesc.Builder();
- ctor public CallbackDataSourceDesc.Builder(android.media.CallbackDataSourceDesc);
+ ctor public CallbackDataSourceDesc.Builder(@Nullable android.media.CallbackDataSourceDesc);
method @NonNull public android.media.CallbackDataSourceDesc build();
method @NonNull public android.media.CallbackDataSourceDesc.Builder setDataSource(@NonNull android.media.DataSourceCallback);
}
@@ -23753,12 +23759,12 @@ package android.media {
public abstract class DataSourceCallback implements java.io.Closeable {
ctor public DataSourceCallback();
method public abstract long getSize() throws java.io.IOException;
- method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
+ method public abstract int readAt(long, @NonNull byte[], int, int) throws java.io.IOException;
}
public class DataSourceDesc {
method public long getEndPosition();
- method public String getMediaId();
+ method @Nullable public String getMediaId();
method public long getStartPosition();
field public static final long LONG_MAX_TIME_MS = 576460752303423L; // 0x20c49ba5e353fL
field public static final long POSITION_UNKNOWN = 576460752303423L; // 0x20c49ba5e353fL
@@ -23766,7 +23772,7 @@ package android.media {
protected static class DataSourceDesc.BuilderBase<T extends android.media.DataSourceDesc.BuilderBase> {
method @NonNull public T setEndPosition(long);
- method @NonNull public T setMediaId(String);
+ method @NonNull public T setMediaId(@Nullable String);
method @NonNull public T setStartPosition(long);
}
@@ -23975,13 +23981,13 @@ package android.media {
public class FileDataSourceDesc extends android.media.DataSourceDesc {
method public long getLength();
method public long getOffset();
- method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+ method @NonNull public android.os.ParcelFileDescriptor getParcelFileDescriptor();
field public static final long FD_LENGTH_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL
}
public static class FileDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.FileDataSourceDesc.Builder> {
ctor public FileDataSourceDesc.Builder();
- ctor public FileDataSourceDesc.Builder(android.media.FileDataSourceDesc);
+ ctor public FileDataSourceDesc.Builder(@Nullable android.media.FileDataSourceDesc);
method @NonNull public android.media.FileDataSourceDesc build();
method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor);
method @NonNull public android.media.FileDataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor, long, long);
@@ -25319,7 +25325,6 @@ package android.media {
method public static android.media.MediaPlayer create(android.content.Context, int);
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
method @NonNull public android.media.VolumeShaper createVolumeShaper(@NonNull android.media.VolumeShaper.Configuration);
- method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method public void deselectTrack(int) throws java.lang.IllegalStateException;
method protected void finalize();
method public int getAudioSessionId();
@@ -25533,16 +25538,16 @@ package android.media {
}
public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable {
- ctor public MediaPlayer2(android.content.Context);
- method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
- method public Object attachAuxEffect(int);
+ ctor public MediaPlayer2(@NonNull android.content.Context);
+ method public void addOnRoutingChangedListener(@NonNull android.media.AudioRouting.OnRoutingChangedListener, @Nullable android.os.Handler);
+ method @NonNull public Object attachAuxEffect(int);
method public boolean cancelCommand(@NonNull Object);
method public void clearDrmEventCallback();
- method public Object clearNextDataSources();
+ method @NonNull public Object clearNextDataSources();
method public void clearPendingCommands();
method public void close();
- method public Object deselectTrack(int);
- method public Object deselectTrack(@NonNull android.media.DataSourceDesc, int);
+ method @NonNull public Object deselectTrack(int);
+ method @NonNull public Object deselectTrack(@NonNull android.media.DataSourceDesc, int);
method @NonNull public android.media.AudioAttributes getAudioAttributes();
method public int getAudioSessionId();
method public long getBufferedPosition();
@@ -25552,11 +25557,11 @@ package android.media {
method public long getDuration();
method public long getDuration(@NonNull android.media.DataSourceDesc);
method public float getMaxPlayerVolume();
- method public android.os.PersistableBundle getMetrics();
+ method @Nullable public android.os.PersistableBundle getMetrics();
method @NonNull public android.media.PlaybackParams getPlaybackParams();
method public float getPlayerVolume();
- method public android.media.AudioDeviceInfo getPreferredDevice();
- method public android.media.AudioDeviceInfo getRoutedDevice();
+ method @Nullable public android.media.AudioDeviceInfo getPreferredDevice();
+ method @Nullable public android.media.AudioDeviceInfo getRoutedDevice();
method public int getSelectedTrack(int);
method public int getSelectedTrack(@NonNull android.media.DataSourceDesc, int);
method public int getState();
@@ -25564,37 +25569,37 @@ package android.media {
method @Nullable public android.media.MediaTimestamp getTimestamp();
method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo();
method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(@NonNull android.media.DataSourceDesc);
- method public android.util.Size getVideoSize();
+ method @NonNull public android.util.Size getVideoSize();
method public boolean isLooping();
- method public Object loopCurrent(boolean);
- method public Object notifyWhenCommandLabelReached(@NonNull Object);
- method public Object pause();
- method public Object play();
- method public Object prepare();
+ method @NonNull public Object loopCurrent(boolean);
+ method @NonNull public Object notifyWhenCommandLabelReached(@NonNull Object);
+ method @NonNull public Object pause();
+ method @NonNull public Object play();
+ method @NonNull public Object prepare();
method public void registerEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.EventCallback);
- method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
+ method public void removeOnRoutingChangedListener(@NonNull android.media.AudioRouting.OnRoutingChangedListener);
method public void reset();
- method public Object seekTo(long);
- method public Object seekTo(long, int);
- method public Object selectTrack(int);
- method public Object selectTrack(@NonNull android.media.DataSourceDesc, int);
- method public Object setAudioAttributes(@NonNull android.media.AudioAttributes);
- method public Object setAudioSessionId(int);
- method public Object setAuxEffectSendLevel(float);
- method public Object setDataSource(@NonNull android.media.DataSourceDesc);
- method public Object setDisplay(android.view.SurfaceHolder);
+ method @NonNull public Object seekTo(long);
+ method @NonNull public Object seekTo(long, int);
+ method @NonNull public Object selectTrack(int);
+ method @NonNull public Object selectTrack(@NonNull android.media.DataSourceDesc, int);
+ method @NonNull public Object setAudioAttributes(@NonNull android.media.AudioAttributes);
+ method @NonNull public Object setAudioSessionId(int);
+ method @NonNull public Object setAuxEffectSendLevel(float);
+ method @NonNull public Object setDataSource(@NonNull android.media.DataSourceDesc);
+ method @NonNull public Object setDisplay(@Nullable android.view.SurfaceHolder);
method public void setDrmEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.DrmEventCallback);
- method public Object setNextDataSource(@NonNull android.media.DataSourceDesc);
- method public Object setNextDataSources(@NonNull java.util.List<android.media.DataSourceDesc>);
- method public Object setPlaybackParams(@NonNull android.media.PlaybackParams);
- method public Object setPlayerVolume(float);
- method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
- method public Object setScreenOnWhilePlaying(boolean);
- method public Object setSurface(android.view.Surface);
- method public Object setSyncParams(@NonNull android.media.SyncParams);
- method public Object setWakeLock(@NonNull android.os.PowerManager.WakeLock);
- method public Object skipToNext();
- method public void unregisterEventCallback(android.media.MediaPlayer2.EventCallback);
+ method @NonNull public Object setNextDataSource(@NonNull android.media.DataSourceDesc);
+ method @NonNull public Object setNextDataSources(@NonNull java.util.List<android.media.DataSourceDesc>);
+ method @NonNull public Object setPlaybackParams(@NonNull android.media.PlaybackParams);
+ method @NonNull public Object setPlayerVolume(float);
+ method public boolean setPreferredDevice(@Nullable android.media.AudioDeviceInfo);
+ method @NonNull public Object setScreenOnWhilePlaying(boolean);
+ method @NonNull public Object setSurface(@Nullable android.view.Surface);
+ method @NonNull public Object setSyncParams(@NonNull android.media.SyncParams);
+ method @NonNull public Object setWakeLock(@NonNull android.os.PowerManager.WakeLock);
+ method @NonNull public Object skipToNext();
+ method public void unregisterEventCallback(@NonNull android.media.MediaPlayer2.EventCallback);
field public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1; // 0x1
field public static final int CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES = 30; // 0x1e
field public static final int CALL_COMPLETED_DESELECT_TRACK = 2; // 0x2
@@ -25729,8 +25734,8 @@ package android.media {
}
public static class MediaPlayer2.TrackInfo {
- method public android.media.MediaFormat getFormat();
- method public String getLanguage();
+ method @Nullable public android.media.MediaFormat getFormat();
+ method @Nullable public String getLanguage();
method public int getTrackType();
field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
@@ -26414,7 +26419,6 @@ package android.media {
ctor @Deprecated public SoundPool(int, int, int);
method public final void autoPause();
method public final void autoResume();
- method public static void deprecateStreamTypeForPlayback(int, String, String) throws java.lang.IllegalArgumentException;
method protected void finalize();
method public int load(String, int);
method public int load(android.content.Context, int, int);
@@ -26610,15 +26614,15 @@ package android.media {
}
public class UriDataSourceDesc extends android.media.DataSourceDesc {
- method public android.content.Context getContext();
- method public java.util.List<java.net.HttpCookie> getCookies();
- method public java.util.Map<java.lang.String,java.lang.String> getHeaders();
- method public android.net.Uri getUri();
+ method @NonNull public android.content.Context getContext();
+ method @Nullable public java.util.List<java.net.HttpCookie> getCookies();
+ method @Nullable public java.util.Map<java.lang.String,java.lang.String> getHeaders();
+ method @NonNull public android.net.Uri getUri();
}
public static class UriDataSourceDesc.Builder extends android.media.DataSourceDesc.BuilderBase<android.media.UriDataSourceDesc.Builder> {
ctor public UriDataSourceDesc.Builder();
- ctor public UriDataSourceDesc.Builder(android.media.UriDataSourceDesc);
+ ctor public UriDataSourceDesc.Builder(@Nullable android.media.UriDataSourceDesc);
method @NonNull public android.media.UriDataSourceDesc build();
method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri);
method @NonNull public android.media.UriDataSourceDesc.Builder setDataSource(@NonNull android.content.Context, @NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>);
@@ -28753,8 +28757,8 @@ package android.net {
}
public class InetAddresses {
- method public static boolean isNumericAddress(String);
- method public static java.net.InetAddress parseNumericAddress(String);
+ method public static boolean isNumericAddress(@NonNull String);
+ method @NonNull public static java.net.InetAddress parseNumericAddress(@NonNull String);
}
public final class IpPrefix implements android.os.Parcelable {
@@ -28973,6 +28977,7 @@ package android.net {
field public static final int NET_CAPABILITY_IA = 7; // 0x7
field public static final int NET_CAPABILITY_IMS = 4; // 0x4
field public static final int NET_CAPABILITY_INTERNET = 12; // 0xc
+ field public static final int NET_CAPABILITY_MCX = 23; // 0x17
field public static final int NET_CAPABILITY_MMS = 0; // 0x0
field public static final int NET_CAPABILITY_NOT_CONGESTED = 20; // 0x14
field public static final int NET_CAPABILITY_NOT_METERED = 11; // 0xb
@@ -29345,25 +29350,25 @@ package android.net {
public class VpnService.Builder {
ctor public VpnService.Builder();
- method public android.net.VpnService.Builder addAddress(java.net.InetAddress, int);
- method public android.net.VpnService.Builder addAddress(String, int);
- method public android.net.VpnService.Builder addAllowedApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.net.VpnService.Builder addDisallowedApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
- method public android.net.VpnService.Builder addDnsServer(java.net.InetAddress);
- method public android.net.VpnService.Builder addDnsServer(String);
- method public android.net.VpnService.Builder addRoute(java.net.InetAddress, int);
- method public android.net.VpnService.Builder addRoute(String, int);
- method public android.net.VpnService.Builder addSearchDomain(String);
- method public android.net.VpnService.Builder allowBypass();
- method public android.net.VpnService.Builder allowFamily(int);
- method public android.os.ParcelFileDescriptor establish();
- method public android.net.VpnService.Builder setBlocking(boolean);
- method public android.net.VpnService.Builder setConfigureIntent(android.app.PendingIntent);
- method public android.net.VpnService.Builder setHttpProxy(@NonNull android.net.ProxyInfo);
- method public android.net.VpnService.Builder setMetered(boolean);
- method public android.net.VpnService.Builder setMtu(int);
- method public android.net.VpnService.Builder setSession(String);
- method public android.net.VpnService.Builder setUnderlyingNetworks(android.net.Network[]);
+ method @NonNull public android.net.VpnService.Builder addAddress(@NonNull java.net.InetAddress, int);
+ method @NonNull public android.net.VpnService.Builder addAddress(@NonNull String, int);
+ method @NonNull public android.net.VpnService.Builder addAllowedApplication(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @NonNull public android.net.VpnService.Builder addDisallowedApplication(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @NonNull public android.net.VpnService.Builder addDnsServer(@NonNull java.net.InetAddress);
+ method @NonNull public android.net.VpnService.Builder addDnsServer(@NonNull String);
+ method @NonNull public android.net.VpnService.Builder addRoute(@NonNull java.net.InetAddress, int);
+ method @NonNull public android.net.VpnService.Builder addRoute(@NonNull String, int);
+ method @NonNull public android.net.VpnService.Builder addSearchDomain(@NonNull String);
+ method @NonNull public android.net.VpnService.Builder allowBypass();
+ method @NonNull public android.net.VpnService.Builder allowFamily(int);
+ method @Nullable public android.os.ParcelFileDescriptor establish();
+ method @NonNull public android.net.VpnService.Builder setBlocking(boolean);
+ method @NonNull public android.net.VpnService.Builder setConfigureIntent(@NonNull android.app.PendingIntent);
+ method @NonNull public android.net.VpnService.Builder setHttpProxy(@NonNull android.net.ProxyInfo);
+ method @NonNull public android.net.VpnService.Builder setMetered(boolean);
+ method @NonNull public android.net.VpnService.Builder setMtu(int);
+ method @NonNull public android.net.VpnService.Builder setSession(@NonNull String);
+ method @NonNull public android.net.VpnService.Builder setUnderlyingNetworks(@Nullable android.net.Network[]);
}
}
@@ -29395,7 +29400,7 @@ package android.net.http {
method public java.util.Date getValidNotAfterDate();
method @Deprecated public String getValidNotBefore();
method public java.util.Date getValidNotBeforeDate();
- method public java.security.cert.X509Certificate getX509Certificate();
+ method @Nullable public java.security.cert.X509Certificate getX509Certificate();
method public static android.net.http.SslCertificate restoreState(android.os.Bundle);
method public static android.os.Bundle saveState(android.net.http.SslCertificate);
}
@@ -29980,8 +29985,8 @@ package android.net.wifi {
method public boolean is5GHzBandSupported();
method @Deprecated public boolean isDeviceToApRttSupported();
method public boolean isEasyConnectSupported();
+ method public boolean isEnhancedOpenSupported();
method public boolean isEnhancedPowerReportingSupported();
- method public boolean isOweSupported();
method public boolean isP2pSupported();
method public boolean isPreferredNetworkOffloadSupported();
method @Deprecated public boolean isScanAlwaysAvailable();
@@ -30091,19 +30096,19 @@ package android.net.wifi {
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSpecifier> CREATOR;
}
- public static class WifiNetworkSpecifier.Builder {
+ public static final class WifiNetworkSpecifier.Builder {
ctor public WifiNetworkSpecifier.Builder();
- method public android.net.NetworkSpecifier build();
- method public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen();
- method public android.net.wifi.WifiNetworkSpecifier.Builder setIsHiddenSsid();
- method public android.net.wifi.WifiNetworkSpecifier.Builder setSsid(@NonNull String);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setSsidPattern(@NonNull android.os.PatternMatcher);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2Passphrase(@NonNull String);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3Passphrase(@NonNull String);
+ method @NonNull public android.net.NetworkSpecifier build();
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen();
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsHiddenSsid();
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsid(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsidPattern(@NonNull android.os.PatternMatcher);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2Passphrase(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3Passphrase(@NonNull String);
}
public final class WifiNetworkSuggestion implements android.os.Parcelable {
@@ -30112,21 +30117,21 @@ package android.net.wifi {
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSuggestion> CREATOR;
}
- public static class WifiNetworkSuggestion.Builder {
+ public static final class WifiNetworkSuggestion.Builder {
ctor public WifiNetworkSuggestion.Builder();
- method public android.net.wifi.WifiNetworkSuggestion build();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedOpen();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setIsHiddenSsid();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setIsMetered();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setIsUserInteractionRequired();
- method public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(int);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2Passphrase(@NonNull String);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
- method public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3Passphrase(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedOpen();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsHiddenSsid();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsMetered();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsUserInteractionRequired();
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(int);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2Passphrase(@NonNull String);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3Passphrase(@NonNull String);
}
public class WpsInfo implements android.os.Parcelable {
@@ -35128,6 +35133,7 @@ package android.os {
field public static final int LOCATION_MODE_FOREGROUND_ONLY = 3; // 0x3
field public static final int LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF = 1; // 0x1
field public static final int LOCATION_MODE_NO_CHANGE = 0; // 0x0
+ field public static final int LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF = 4; // 0x4
field public static final int ON_AFTER_RELEASE = 536870912; // 0x20000000
field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1
field public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32; // 0x20
@@ -38827,7 +38833,7 @@ package android.provider {
field public static final String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
field public static final String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
field public static final String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
- field public static final String ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE = "android.settings.PROCESS_WIFI_EASY_CONNECT_QR_CODE";
+ field public static final String ACTION_PROCESS_WIFI_EASY_CONNECT_URI = "android.settings.PROCESS_WIFI_EASY_CONNECT_URI";
field public static final String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final String ACTION_REQUEST_SET_AUTOFILL_SERVICE = "android.settings.REQUEST_SET_AUTOFILL_SERVICE";
@@ -38861,7 +38867,6 @@ package android.provider {
field public static final String EXTRA_DO_NOT_DISTURB_MODE_ENABLED = "android.settings.extra.do_not_disturb_mode_enabled";
field public static final String EXTRA_DO_NOT_DISTURB_MODE_MINUTES = "android.settings.extra.do_not_disturb_mode_minutes";
field public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
- field public static final String EXTRA_QR_CODE = "android.provider.extra.QR_CODE";
field public static final String EXTRA_SUB_ID = "android.provider.extra.SUB_ID";
field public static final String INTENT_CATEGORY_USAGE_ACCESS_CONFIG = "android.intent.category.USAGE_ACCESS_CONFIG";
field public static final String METADATA_USAGE_ACCESS_REASON = "android.settings.metadata.USAGE_ACCESS_REASON";
@@ -41122,10 +41127,10 @@ package android.service.autofill {
public static class CustomDescription.Builder {
ctor public CustomDescription.Builder(@NonNull android.widget.RemoteViews);
- method public android.service.autofill.CustomDescription.Builder addChild(int, @NonNull android.service.autofill.Transformation);
- method public android.service.autofill.CustomDescription.Builder addOnClickAction(int, @NonNull android.service.autofill.OnClickAction);
- method public android.service.autofill.CustomDescription.Builder batchUpdate(@NonNull android.service.autofill.Validator, @NonNull android.service.autofill.BatchUpdates);
- method public android.service.autofill.CustomDescription build();
+ method @NonNull public android.service.autofill.CustomDescription.Builder addChild(int, @NonNull android.service.autofill.Transformation);
+ method @NonNull public android.service.autofill.CustomDescription.Builder addOnClickAction(int, @NonNull android.service.autofill.OnClickAction);
+ method @NonNull public android.service.autofill.CustomDescription.Builder batchUpdate(@NonNull android.service.autofill.Validator, @NonNull android.service.autofill.BatchUpdates);
+ method @NonNull public android.service.autofill.CustomDescription build();
}
public final class Dataset implements android.os.Parcelable {
@@ -41230,17 +41235,17 @@ package android.service.autofill {
public static final class FillResponse.Builder {
ctor public FillResponse.Builder();
method @NonNull public android.service.autofill.FillResponse.Builder addDataset(@Nullable android.service.autofill.Dataset);
- method public android.service.autofill.FillResponse build();
- method public android.service.autofill.FillResponse.Builder disableAutofill(long);
+ method @NonNull public android.service.autofill.FillResponse build();
+ method @NonNull public android.service.autofill.FillResponse.Builder disableAutofill(long);
method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews);
- method public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle);
- method public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...);
- method public android.service.autofill.FillResponse.Builder setFlags(int);
- method public android.service.autofill.FillResponse.Builder setFooter(@NonNull android.widget.RemoteViews);
- method public android.service.autofill.FillResponse.Builder setHeader(@NonNull android.widget.RemoteViews);
- method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
+ method @NonNull public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle);
+ method @NonNull public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...);
+ method @NonNull public android.service.autofill.FillResponse.Builder setFlags(int);
+ method @NonNull public android.service.autofill.FillResponse.Builder setFooter(@NonNull android.widget.RemoteViews);
+ method @NonNull public android.service.autofill.FillResponse.Builder setHeader(@NonNull android.widget.RemoteViews);
+ method @NonNull public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
method @NonNull public android.service.autofill.FillResponse.Builder setSaveInfo(@NonNull android.service.autofill.SaveInfo);
- method public android.service.autofill.FillResponse.Builder setUserData(@NonNull android.service.autofill.UserData);
+ method @NonNull public android.service.autofill.FillResponse.Builder setUserData(@NonNull android.service.autofill.UserData);
}
public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
@@ -41349,10 +41354,10 @@ package android.service.autofill {
public static final class UserData.Builder {
ctor public UserData.Builder(@NonNull String, @NonNull String, @NonNull String);
- method public android.service.autofill.UserData.Builder add(@NonNull String, @NonNull String);
- method public android.service.autofill.UserData build();
- method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithm(@Nullable String, @Nullable android.os.Bundle);
- method public android.service.autofill.UserData.Builder setFieldClassificationAlgorithmForCategory(@NonNull String, @Nullable String, @Nullable android.os.Bundle);
+ method @NonNull public android.service.autofill.UserData.Builder add(@NonNull String, @NonNull String);
+ method @NonNull public android.service.autofill.UserData build();
+ method @NonNull public android.service.autofill.UserData.Builder setFieldClassificationAlgorithm(@Nullable String, @Nullable android.os.Bundle);
+ method @NonNull public android.service.autofill.UserData.Builder setFieldClassificationAlgorithmForCategory(@NonNull String, @Nullable String, @Nullable android.os.Bundle);
}
public interface Validator {
@@ -41591,13 +41596,13 @@ package android.service.media {
package android.service.notification {
public final class Adjustment implements android.os.Parcelable {
- ctor public Adjustment(String, String, android.os.Bundle, CharSequence, android.os.UserHandle);
+ ctor public Adjustment(@NonNull String, @NonNull String, @NonNull android.os.Bundle, @NonNull CharSequence, @NonNull android.os.UserHandle);
method public int describeContents();
- method public CharSequence getExplanation();
- method public String getKey();
- method public String getPackage();
- method public android.os.Bundle getSignals();
- method public android.os.UserHandle getUserHandle();
+ method @NonNull public CharSequence getExplanation();
+ method @NonNull public String getKey();
+ method @NonNull public String getPackage();
+ method @NonNull public android.os.Bundle getSignals();
+ method @NonNull public android.os.UserHandle getUserHandle();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions";
@@ -41655,17 +41660,17 @@ package android.service.notification {
public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService {
ctor public NotificationAssistantService();
- method public final void adjustNotification(android.service.notification.Adjustment);
- method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
+ method public final void adjustNotification(@NonNull android.service.notification.Adjustment);
+ method public final void adjustNotifications(@NonNull java.util.List<android.service.notification.Adjustment>);
method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int);
- method public final android.os.IBinder onBind(android.content.Intent);
+ method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent);
method public void onNotificationDirectReplied(@NonNull String);
method public abstract android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
- method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, android.app.NotificationChannel);
+ method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel);
method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean);
- method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, android.service.notification.NotificationStats, int);
+ method public void onNotificationRemoved(@NonNull android.service.notification.StatusBarNotification, @NonNull android.service.notification.NotificationListenerService.RankingMap, @NonNull android.service.notification.NotificationStats, int);
method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, String);
- method public void onNotificationsSeen(java.util.List<java.lang.String>);
+ method public void onNotificationsSeen(@NonNull java.util.List<java.lang.String>);
method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int);
method public final void unsnoozeNotification(String);
field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
@@ -41755,8 +41760,8 @@ package android.service.notification {
method public long getLastAudiblyAlertedMillis();
method public String getOverrideGroupKey();
method public int getRank();
- method public java.util.List<android.app.Notification.Action> getSmartActions();
- method public java.util.List<java.lang.CharSequence> getSmartReplies();
+ method @NonNull public java.util.List<android.app.Notification.Action> getSmartActions();
+ method @NonNull public java.util.List<java.lang.CharSequence> getSmartReplies();
method public int getSuppressedVisualEffects();
method public int getUserSentiment();
method public boolean isAmbient();
@@ -43349,14 +43354,14 @@ package android.telecom {
field @NonNull public static final android.os.Parcelable.Creator<android.telecom.CallIdentification> CREATOR;
}
- public static class CallIdentification.Builder {
+ public static final class CallIdentification.Builder {
ctor public CallIdentification.Builder();
- method public android.telecom.CallIdentification build();
- method public android.telecom.CallIdentification.Builder setDescription(@Nullable CharSequence);
- method public android.telecom.CallIdentification.Builder setDetails(@Nullable CharSequence);
- method public android.telecom.CallIdentification.Builder setName(@Nullable CharSequence);
- method public android.telecom.CallIdentification.Builder setNuisanceConfidence(int);
- method public android.telecom.CallIdentification.Builder setPhoto(@Nullable android.graphics.drawable.Icon);
+ method @NonNull public android.telecom.CallIdentification build();
+ method @NonNull public android.telecom.CallIdentification.Builder setDescription(@Nullable CharSequence);
+ method @NonNull public android.telecom.CallIdentification.Builder setDetails(@Nullable CharSequence);
+ method @NonNull public android.telecom.CallIdentification.Builder setName(@Nullable CharSequence);
+ method @NonNull public android.telecom.CallIdentification.Builder setNuisanceConfidence(int);
+ method @NonNull public android.telecom.CallIdentification.Builder setPhoto(@Nullable android.graphics.drawable.Icon);
}
public abstract class CallRedirectionService extends android.app.Service {
@@ -43823,7 +43828,7 @@ package android.telecom {
public final class PhoneAccountSuggestion implements android.os.Parcelable {
method public int describeContents();
- method public android.telecom.PhoneAccountHandle getPhoneAccountHandle();
+ method @NonNull public android.telecom.PhoneAccountHandle getPhoneAccountHandle();
method public int getReason();
method public boolean shouldAutoSelect();
method public void writeToParcel(android.os.Parcel, int);
@@ -43977,8 +43982,8 @@ package android.telecom {
method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts();
method public android.telecom.PhoneAccountHandle getSimCallManager();
- method public String getSystemDialerPackage();
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
+ method @Nullable public String getSystemDialerPackage();
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @Nullable public android.telecom.PhoneAccountHandle getUserSelectedOutgoingPhoneAccount();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber(android.telecom.PhoneAccountHandle);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handleMmi(String, android.telecom.PhoneAccountHandle);
@@ -45139,8 +45144,8 @@ package android.telephony {
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getImei();
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getImei(int);
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_SMS, android.Manifest.permission.READ_PHONE_NUMBERS}) public String getLine1Number();
- method public String getManufacturerCode();
- method public String getManufacturerCode(int);
+ method @Nullable public String getManufacturerCode();
+ method @Nullable public String getManufacturerCode(int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getMeid();
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getMeid(int);
method public String getMmsUAProfUrl();
@@ -45167,8 +45172,8 @@ package android.telephony {
method public int getSimState();
method public int getSimState(int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId();
- method public String getTypeAllocationCode();
- method public String getTypeAllocationCode(int);
+ method @Nullable public String getTypeAllocationCode();
+ method @Nullable public String getTypeAllocationCode(int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag();
@@ -45464,6 +45469,7 @@ package android.telephony.data {
field public static final int TYPE_HIPRI = 16; // 0x10
field public static final int TYPE_IA = 256; // 0x100
field public static final int TYPE_IMS = 64; // 0x40
+ field public static final int TYPE_MCX = 1024; // 0x400
field public static final int TYPE_MMS = 2; // 0x2
field public static final int TYPE_SUPL = 4; // 0x4
}
@@ -45553,7 +45559,7 @@ package android.telephony.euicc {
}
public class EuiccManager {
- method public android.telephony.euicc.EuiccManager createForCardId(int);
+ method @NonNull public android.telephony.euicc.EuiccManager createForCardId(int);
method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void deleteSubscription(int, android.app.PendingIntent);
method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void downloadSubscription(android.telephony.euicc.DownloadableSubscription, boolean, android.app.PendingIntent);
method @Nullable public String getEid();
@@ -47106,7 +47112,7 @@ package android.text.style {
public static class LineHeightSpan.Standard implements android.text.style.LineHeightSpan android.text.ParcelableSpan {
ctor public LineHeightSpan.Standard(@Px @IntRange(from=1) int);
- ctor public LineHeightSpan.Standard(android.os.Parcel);
+ ctor public LineHeightSpan.Standard(@NonNull android.os.Parcel);
method public void chooseHeight(@NonNull CharSequence, int, int, int, int, @NonNull android.graphics.Paint.FontMetricsInt);
method public int describeContents();
method @Px public int getHeight();
@@ -54950,7 +54956,6 @@ package android.widget {
method public int getCheckedItemPosition();
method public android.util.SparseBooleanArray getCheckedItemPositions();
method public int getChoiceMode();
- method public boolean getDrawSelectorOnTop();
method public int getListPaddingBottom();
method public int getListPaddingLeft();
method public int getListPaddingRight();
@@ -54963,6 +54968,7 @@ package android.widget {
method protected void handleDataChanged();
method public boolean hasTextFilter();
method public void invalidateViews();
+ method public boolean isDrawSelectorOnTop();
method public boolean isFastScrollAlwaysVisible();
method @android.view.ViewDebug.ExportedProperty public boolean isFastScrollEnabled();
method protected boolean isInFilterMode();
@@ -56689,7 +56695,7 @@ package android.widget {
method public void setLong(int, 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 setOnClickResponse(int, @NonNull 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);
@@ -56720,9 +56726,9 @@ package android.widget {
public static class RemoteViews.RemoteResponse {
ctor public RemoteViews.RemoteResponse();
- method public android.widget.RemoteViews.RemoteResponse addSharedElement(int, String);
- method public static android.widget.RemoteViews.RemoteResponse fromFillInIntent(android.content.Intent);
- method public static android.widget.RemoteViews.RemoteResponse fromPendingIntent(android.app.PendingIntent);
+ method @NonNull public android.widget.RemoteViews.RemoteResponse addSharedElement(int, @NonNull String);
+ method @NonNull public static android.widget.RemoteViews.RemoteResponse fromFillInIntent(@NonNull android.content.Intent);
+ method @NonNull public static android.widget.RemoteViews.RemoteResponse fromPendingIntent(@NonNull android.app.PendingIntent);
}
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface RemoteViews.RemoteView {
@@ -57325,7 +57331,7 @@ package android.widget {
method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier();
method public final android.content.res.ColorStateList getTextColors();
method @Nullable public android.graphics.drawable.Drawable getTextCursorDrawable();
- method public android.text.TextDirectionHeuristic getTextDirectionHeuristic();
+ method @NonNull public android.text.TextDirectionHeuristic getTextDirectionHeuristic();
method @NonNull public java.util.Locale getTextLocale();
method @NonNull @Size(min=1) public android.os.LocaleList getTextLocales();
method @NonNull public android.text.PrecomputedText.Params getTextMetricsParams();
@@ -57551,7 +57557,7 @@ package android.widget {
ctor public ToggleButton(android.content.Context, android.util.AttributeSet, int);
ctor public ToggleButton(android.content.Context, android.util.AttributeSet);
ctor public ToggleButton(android.content.Context);
- method public float getDisabledAlpha();
+ method @FloatRange(from=0.0, to=1.0) public float getDisabledAlpha();
method public CharSequence getTextOff();
method public CharSequence getTextOn();
method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -57712,11 +57718,11 @@ package android.widget {
@android.widget.RemoteViews.RemoteView public class ViewFlipper extends android.widget.ViewAnimator {
ctor public ViewFlipper(android.content.Context);
ctor public ViewFlipper(android.content.Context, android.util.AttributeSet);
- method public int getFlipInterval();
+ method @IntRange(from=0) public int getFlipInterval();
method public boolean isAutoStart();
method public boolean isFlipping();
method public void setAutoStart(boolean);
- method public void setFlipInterval(int);
+ method public void setFlipInterval(@IntRange(from=0) int);
method public void startFlipping();
method public void stopFlipping();
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 94bc1dd7e54f..752640bb8d02 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -121,6 +121,7 @@ package android {
field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
+ field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS";
field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT";
field public static final String PACKET_KEEPALIVE_OFFLOAD = "android.permission.PACKET_KEEPALIVE_OFFLOAD";
@@ -180,6 +181,7 @@ package android {
field public static final String SHUTDOWN = "android.permission.SHUTDOWN";
field public static final String STOP_APP_SWITCHES = "android.permission.STOP_APP_SWITCHES";
field public static final String SUBSTITUTE_NOTIFICATION_APP_NAME = "android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME";
+ field public static final String SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON = "android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON";
field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
field public static final String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
field public static final String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
@@ -313,7 +315,6 @@ package android.app {
method @Deprecated @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, String, int[]);
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable java.lang.String...);
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getPackagesForOps(@Nullable String[]);
- method public int noteProxyOpNoThrow(@NonNull String, @Nullable String, int);
method public static int opToDefaultMode(@NonNull String);
method @Nullable public static String opToPermission(@NonNull String);
method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(String, int, String, int);
@@ -362,27 +363,34 @@ package android.app {
field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
field public static final String OPSTR_WRITE_SMS = "android:write_sms";
field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
- field public static final int UID_STATE_BACKGROUND = 5; // 0x5
- field public static final int UID_STATE_CACHED = 6; // 0x6
- field public static final int UID_STATE_FOREGROUND = 4; // 0x4
- field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
- field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
- field public static final int UID_STATE_PERSISTENT = 0; // 0x0
- field public static final int UID_STATE_TOP = 1; // 0x1
+ field public static final int OP_FLAGS_ALL = 31; // 0x1f
+ field public static final int OP_FLAGS_ALL_TRUSTED = 13; // 0xd
+ field public static final int OP_FLAG_SELF = 1; // 0x1
+ field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8
+ field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2
+ field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10
+ field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4
+ field public static final int UID_STATE_BACKGROUND = 600; // 0x258
+ field public static final int UID_STATE_CACHED = 700; // 0x2bc
+ field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
+ field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
+ field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
+ field public static final int UID_STATE_PERSISTENT = 100; // 0x64
+ field public static final int UID_STATE_TOP = 200; // 0xc8
}
public static final class AppOpsManager.HistoricalOp 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 long getAccessCount(int, int, int);
+ method public long getAccessDuration(int, int, int);
+ method public long getBackgroundAccessCount(int);
+ method public long getBackgroundAccessDuration(int);
+ method public long getBackgroundRejectCount(int);
+ method public long getForegroundAccessCount(int);
+ method public long getForegroundAccessDuration(int);
+ method public long getForegroundRejectCount(int);
method @NonNull public String getOpName();
- method public long getRejectCount(int);
+ method public long getRejectCount(int, int, int);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
}
@@ -404,6 +412,7 @@ package android.app {
public static final class AppOpsManager.HistoricalOpsRequest.Builder {
ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
+ method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
@@ -431,17 +440,24 @@ package android.app {
public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
method public int describeContents();
- method public int getDuration();
- method public long getLastAccessBackgroundTime();
- method public long getLastAccessForegroundTime();
- method public long getLastAccessTime();
- method public long getLastRejectBackgroundTime();
- method public long getLastRejectForegroundTime();
- method public long getLastRejectTime();
+ method public long getDuration();
+ method public long getLastAccessBackgroundTime(int);
+ method public long getLastAccessForegroundTime(int);
+ method public long getLastAccessTime(int);
+ method public long getLastAccessTime(int, int, int);
+ method public long getLastBackgroundDuration(int);
+ method public long getLastDuration(int, int, int);
+ method public long getLastForegroundDuration(int);
+ method public long getLastRejectBackgroundTime(int);
+ method public long getLastRejectForegroundTime(int);
+ method public long getLastRejectTime(int);
+ method public long getLastRejectTime(int, int, int);
method public int getMode();
- method public String getOpStr();
- method public String getProxyPackageName();
+ method @NonNull public String getOpStr();
+ method @Nullable public String getProxyPackageName();
+ method @Nullable public String getProxyPackageName(int, int);
method public int getProxyUid();
+ method public int getProxyUid(int, int);
method public boolean isRunning();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
@@ -450,7 +466,7 @@ package android.app {
public static final class AppOpsManager.PackageOps implements android.os.Parcelable {
method public int describeContents();
method public java.util.List<android.app.AppOpsManager.OpEntry> getOps();
- method public String getPackageName();
+ method @NonNull public String getPackageName();
method public int getUid();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR;
@@ -936,7 +952,7 @@ package android.app.contentsuggestions {
public final class ClassificationsRequest implements android.os.Parcelable {
method public int describeContents();
- method @Nullable public android.os.Bundle getExtras();
+ method @NonNull public android.os.Bundle getExtras();
method @NonNull public java.util.List<android.app.contentsuggestions.ContentSelection> getSelections();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.contentsuggestions.ClassificationsRequest> CREATOR;
@@ -944,8 +960,8 @@ package android.app.contentsuggestions {
public static final class ClassificationsRequest.Builder {
ctor public ClassificationsRequest.Builder(@NonNull java.util.List<android.app.contentsuggestions.ContentSelection>);
- method public android.app.contentsuggestions.ClassificationsRequest build();
- method public android.app.contentsuggestions.ClassificationsRequest.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.app.contentsuggestions.ClassificationsRequest build();
+ method @NonNull public android.app.contentsuggestions.ClassificationsRequest.Builder setExtras(@NonNull android.os.Bundle);
}
public final class ContentClassification implements android.os.Parcelable {
@@ -983,7 +999,7 @@ package android.app.contentsuggestions {
public final class SelectionsRequest implements android.os.Parcelable {
method public int describeContents();
- method @Nullable public android.os.Bundle getExtras();
+ method @NonNull public android.os.Bundle getExtras();
method @Nullable public android.graphics.Point getInterestPoint();
method public int getTaskId();
method public void writeToParcel(android.os.Parcel, int);
@@ -992,9 +1008,9 @@ package android.app.contentsuggestions {
public static final class SelectionsRequest.Builder {
ctor public SelectionsRequest.Builder(int);
- method public android.app.contentsuggestions.SelectionsRequest build();
- method public android.app.contentsuggestions.SelectionsRequest.Builder setExtras(@NonNull android.os.Bundle);
- method public android.app.contentsuggestions.SelectionsRequest.Builder setInterestPoint(@NonNull android.graphics.Point);
+ method @NonNull public android.app.contentsuggestions.SelectionsRequest build();
+ method @NonNull public android.app.contentsuggestions.SelectionsRequest.Builder setExtras(@NonNull android.os.Bundle);
+ method @NonNull public android.app.contentsuggestions.SelectionsRequest.Builder setInterestPoint(@NonNull android.graphics.Point);
}
}
@@ -1172,7 +1188,7 @@ package android.app.usage {
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
method public int getUsageSource();
- method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @Nullable android.app.PendingIntent);
+ method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String);
@@ -1317,7 +1333,7 @@ package android.content {
method public abstract void sendBroadcast(android.content.Intent, @Nullable String, @Nullable android.os.Bundle);
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public abstract void sendBroadcastAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle, @Nullable String, @Nullable android.os.Bundle);
method public abstract void sendOrderedBroadcast(@NonNull android.content.Intent, @Nullable String, @Nullable android.os.Bundle, @Nullable android.content.BroadcastReceiver, @Nullable android.os.Handler, int, @Nullable String, @Nullable android.os.Bundle);
- method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void startActivityAsUser(@RequiresPermission android.content.Intent, android.os.UserHandle);
+ method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public void startActivityAsUser(@RequiresPermission @NonNull android.content.Intent, @NonNull android.os.UserHandle);
field public static final String APP_PREDICTION_SERVICE = "app_prediction";
field public static final String BACKUP_SERVICE = "backup";
field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
@@ -1969,10 +1985,10 @@ package android.hardware.hdmi {
method @Nullable public android.hardware.hdmi.HdmiPlaybackClient getPlaybackClient();
method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient();
method @Nullable public android.hardware.hdmi.HdmiTvClient getTvClient();
- method public boolean isRemoteDeviceConnected(android.hardware.hdmi.HdmiDeviceInfo);
- method public void powerOffRemoteDevice(android.hardware.hdmi.HdmiDeviceInfo);
+ method public boolean isRemoteDeviceConnected(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
+ method public void powerOffRemoteDevice(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(android.hardware.hdmi.HdmiControlManager.HotplugEventListener);
- method public void requestRemoteDeviceToBecomeActiveSource(android.hardware.hdmi.HdmiDeviceInfo);
+ method public void requestRemoteDeviceToBecomeActiveSource(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
method @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setStandbyMode(boolean);
field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE";
field public static final int AVR_VOLUME_MUTED = 101; // 0x65
@@ -3525,7 +3541,7 @@ package android.media {
method public void stop();
}
- public static class HwAudioSource.Builder {
+ public static final class HwAudioSource.Builder {
ctor public HwAudioSource.Builder();
method @NonNull public android.media.HwAudioSource build();
method @NonNull public android.media.HwAudioSource.Builder setAudioAttributes(@NonNull android.media.AudioAttributes);
@@ -3538,7 +3554,7 @@ package android.media {
field public static final int RADIO_TUNER = 1998; // 0x7ce
}
- public static class MediaTimestamp.Builder {
+ public static final class MediaTimestamp.Builder {
ctor public MediaTimestamp.Builder();
ctor public MediaTimestamp.Builder(@NonNull android.media.MediaTimestamp);
method @NonNull public android.media.MediaTimestamp build();
@@ -3554,14 +3570,14 @@ package android.media {
method public void stop();
}
- public static class SubtitleData.Builder {
+ public static final class SubtitleData.Builder {
ctor public SubtitleData.Builder();
ctor public SubtitleData.Builder(@NonNull android.media.SubtitleData);
method @NonNull public android.media.SubtitleData build();
method @NonNull public android.media.SubtitleData.Builder setSubtitleData(int, long, long, @NonNull byte[]);
}
- public static class TimedMetaData.Builder {
+ public static final class TimedMetaData.Builder {
ctor public TimedMetaData.Builder();
ctor public TimedMetaData.Builder(@NonNull android.media.TimedMetaData);
method @NonNull public android.media.TimedMetaData build();
@@ -3663,7 +3679,7 @@ package android.media.audiopolicy {
method @Nullable public android.media.audiopolicy.AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull android.media.AudioAttributes);
method public int getVolumeGroupIdForAttributes(@NonNull android.media.AudioAttributes);
method public int getVolumeGroupIdForLegacyStreamType(int);
- method public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator();
+ method @NonNull public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator();
method public int size();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategies> CREATOR;
@@ -3680,7 +3696,7 @@ package android.media.audiopolicy {
public final class AudioVolumeGroup implements android.os.Parcelable {
method public int describeContents();
- method public java.util.List<android.media.AudioAttributes> getAudioAttributes();
+ method @NonNull public java.util.List<android.media.AudioAttributes> getAudioAttributes();
method public int getId();
method @NonNull public int[] getLegacyStreamTypes();
method @NonNull public String name();
@@ -3692,7 +3708,7 @@ package android.media.audiopolicy {
ctor public AudioVolumeGroups();
method public int describeContents();
method @Nullable public android.media.audiopolicy.AudioVolumeGroup getById(int);
- method public java.util.Iterator<android.media.audiopolicy.AudioVolumeGroup> iterator();
+ method @NonNull public java.util.Iterator<android.media.audiopolicy.AudioVolumeGroup> iterator();
method public int size();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroups> CREATOR;
@@ -4076,8 +4092,8 @@ package android.net {
public class LinkAddress implements android.os.Parcelable {
ctor public LinkAddress(java.net.InetAddress, int, int, int);
- ctor public LinkAddress(java.net.InetAddress, int);
- ctor public LinkAddress(String);
+ ctor public LinkAddress(@NonNull java.net.InetAddress, int);
+ ctor public LinkAddress(@NonNull String);
ctor public LinkAddress(String, int, int);
method public boolean isGlobalPreferred();
method public boolean isIPv4();
@@ -4722,9 +4738,9 @@ package android.net.wifi {
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void connect(int, android.net.wifi.WifiManager.ActionListener);
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void disable(int, android.net.wifi.WifiManager.ActionListener);
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void forget(int, android.net.wifi.WifiManager.ActionListener);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(java.util.List<android.net.wifi.ScanResult>);
- method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
+ method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
+ method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(java.util.List<android.net.wifi.ScanResult>);
+ method @NonNull @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks();
method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState();
@@ -4966,8 +4982,8 @@ package android.net.wifi.hotspot2 {
public final class OsuProvider implements android.os.Parcelable {
method public int describeContents();
- method public String getFriendlyName();
- method public android.net.Uri getServerUri();
+ method @Nullable public String getFriendlyName();
+ method @Nullable public android.net.Uri getServerUri();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.OsuProvider> CREATOR;
}
@@ -5667,12 +5683,13 @@ package android.permission {
public abstract class PermissionControllerService extends android.app.Service {
ctor public PermissionControllerService();
method public final void attachBaseContext(android.content.Context);
- method public final android.os.IBinder onBind(android.content.Intent);
+ method @NonNull public final android.os.IBinder onBind(android.content.Intent);
method public abstract int onCountPermissionApps(@NonNull java.util.List<java.lang.String>, int);
method @NonNull public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(@NonNull String);
method @NonNull public abstract java.util.List<android.permission.RuntimePermissionUsageInfo> onGetPermissionUsages(boolean, long);
method public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream);
method public abstract boolean onIsApplicationQualifiedForRole(@NonNull String, @NonNull String);
+ method public abstract boolean onIsRoleVisible(@NonNull String);
method @BinderThread public abstract boolean onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle);
method @BinderThread public abstract void onRestoreRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream);
method public abstract void onRevokeRuntimePermission(@NonNull String, @NonNull String);
@@ -5692,7 +5709,7 @@ package android.permission {
}
public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
- ctor public RuntimePermissionPresentationInfo(CharSequence, boolean, boolean);
+ ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean);
method public int describeContents();
method @NonNull public CharSequence getLabel();
method public boolean isGranted();
@@ -5836,19 +5853,17 @@ package android.provider {
method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String);
method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean);
field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
+ field public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT = "activity_manager_native_boot";
field public static final String NAMESPACE_AUTOFILL = "autofill";
field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
+ field public static final String NAMESPACE_MEDIA_NATIVE = "media_native";
field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
+ field public static final String NAMESPACE_RUNTIME_NATIVE_BOOT = "runtime_native_boot";
field public static final String NAMESPACE_SYSTEMUI = "systemui";
}
- public static interface DeviceConfig.ActivityManagerNativeBoot {
- field public static final String NAMESPACE = "activity_manager_native_boot";
- field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
- }
-
public static interface DeviceConfig.AttentionManagerService {
field public static final String COMPONENT_NAME = "component_name";
field public static final String NAMESPACE = "attention_manager_service";
@@ -5867,10 +5882,6 @@ package android.provider {
field public static final String NAMESPACE = "intelligence_attention";
}
- public static interface DeviceConfig.MediaNative {
- field public static final String NAMESPACE = "media_native";
- }
-
public static interface DeviceConfig.OnPropertyChangedListener {
method public void onPropertyChanged(String, String, String);
}
@@ -5897,10 +5908,6 @@ package android.provider {
field public static final String NAMESPACE = "runtime_native";
}
- public static interface DeviceConfig.RuntimeNativeBoot {
- field public static final String NAMESPACE = "runtime_native_boot";
- }
-
public static interface DeviceConfig.Scheduler {
field public static final String ENABLE_FAST_METRICS_COLLECTION = "enable_fast_metrics_collection";
field public static final String NAMESPACE = "scheduler";
@@ -6045,6 +6052,7 @@ package android.provider {
}
public final class Settings {
+ field public static final String ACTION_ACCESSIBILITY_DETAILS_SETTINGS = "android.settings.ACCESSIBILITY_DETAILS_SETTINGS";
field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
field public static final String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS";
field public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE";
@@ -6417,8 +6425,8 @@ package android.service.carrier {
public abstract class ApnService extends android.app.Service {
ctor public ApnService();
- method public android.os.IBinder onBind(android.content.Intent);
- method @WorkerThread public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
+ method @NonNull public android.os.IBinder onBind(@Nullable android.content.Intent);
+ method @WorkerThread @NonNull public abstract java.util.List<android.content.ContentValues> onRestoreApns(int);
}
}
@@ -6991,7 +6999,7 @@ package android.telecom {
}
public final class PhoneAccountSuggestion implements android.os.Parcelable {
- ctor public PhoneAccountSuggestion(android.telecom.PhoneAccountHandle, int, boolean);
+ ctor public PhoneAccountSuggestion(@NonNull android.telecom.PhoneAccountHandle, int, boolean);
}
public class PhoneAccountSuggestionService extends android.app.Service {
@@ -7069,8 +7077,8 @@ package android.telecom {
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(String);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall();
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
- method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.WRITE_SECURE_SETTINGS}) public boolean setDefaultDialer(String);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(android.telecom.PhoneAccountHandle);
+ method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.WRITE_SECURE_SETTINGS}) public boolean setDefaultDialer(@Nullable String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle);
field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT";
field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT";
field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
@@ -7090,12 +7098,12 @@ package android.telephony {
field public static final int WWAN = 1; // 0x1
}
- public class CallAttributes implements android.os.Parcelable {
- ctor public CallAttributes(android.telephony.PreciseCallState, int, android.telephony.CallQuality);
+ public final class CallAttributes implements android.os.Parcelable {
+ ctor public CallAttributes(@NonNull android.telephony.PreciseCallState, int, @NonNull android.telephony.CallQuality);
method public int describeContents();
- method public android.telephony.CallQuality getCallQuality();
+ method @NonNull public android.telephony.CallQuality getCallQuality();
method public int getNetworkType();
- method public android.telephony.PreciseCallState getPreciseCallState();
+ method @NonNull public android.telephony.PreciseCallState getPreciseCallState();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallAttributes> CREATOR;
}
@@ -7132,13 +7140,13 @@ package android.telephony {
}
public final class CarrierRestrictionRules implements android.os.Parcelable {
+ method @NonNull public java.util.List<java.lang.Boolean> areCarrierIdentifiersAllowed(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
method public int describeContents();
method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers();
method public int getDefaultCarrierRestriction();
method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getExcludedCarriers();
method public int getMultiSimPolicy();
method public boolean isAllCarriersAllowed();
- method public java.util.List<java.lang.Boolean> isCarrierIdentifiersAllowed(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
method public void writeToParcel(android.os.Parcel, int);
field public static final int CARRIER_RESTRICTION_DEFAULT_ALLOWED = 1; // 0x1
field public static final int CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED = 0; // 0x0
@@ -7147,13 +7155,13 @@ package android.telephony {
field public static final int MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT = 1; // 0x1
}
- public static class CarrierRestrictionRules.Builder {
- method public android.telephony.CarrierRestrictionRules build();
- method public android.telephony.CarrierRestrictionRules.Builder setAllCarriersAllowed();
- method public android.telephony.CarrierRestrictionRules.Builder setAllowedCarriers(java.util.List<android.service.carrier.CarrierIdentifier>);
- method public android.telephony.CarrierRestrictionRules.Builder setDefaultCarrierRestriction(int);
- method public android.telephony.CarrierRestrictionRules.Builder setExcludedCarriers(java.util.List<android.service.carrier.CarrierIdentifier>);
- method public android.telephony.CarrierRestrictionRules.Builder setMultiSimPolicy(int);
+ public static final class CarrierRestrictionRules.Builder {
+ method @NonNull public android.telephony.CarrierRestrictionRules build();
+ method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllCarriersAllowed();
+ method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllowedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
+ method @NonNull public android.telephony.CarrierRestrictionRules.Builder setDefaultCarrierRestriction(int);
+ method @NonNull public android.telephony.CarrierRestrictionRules.Builder setExcludedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>);
+ method @NonNull public android.telephony.CarrierRestrictionRules.Builder setMultiSimPolicy(int);
}
public final class DataFailCause {
@@ -7648,7 +7656,7 @@ package android.telephony {
public abstract class NetworkService.NetworkServiceProvider implements java.lang.AutoCloseable {
ctor public NetworkService.NetworkServiceProvider(int);
method public abstract void close();
- method public void getNetworkRegistrationState(int, android.telephony.NetworkServiceCallback);
+ method public void getNetworkRegistrationState(int, @NonNull android.telephony.NetworkServiceCallback);
method public final int getSlotId();
method public final void notifyNetworkRegistrationStateChanged();
}
@@ -7678,7 +7686,7 @@ package android.telephony {
public final class PhoneNumberRange implements android.os.Parcelable {
ctor public PhoneNumberRange(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
method public int describeContents();
- method public boolean matches(String);
+ method public boolean matches(@NonNull String);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneNumberRange> CREATOR;
}
@@ -7829,12 +7837,12 @@ package android.telephony {
}
public class ServiceState implements android.os.Parcelable {
- method public android.telephony.NetworkRegistrationState getNetworkRegistrationState(int, int);
- method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
- method @Deprecated public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
- method @Deprecated public android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
- method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForDomain(int);
- method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForTransportType(int);
+ method @Nullable public android.telephony.NetworkRegistrationState getNetworkRegistrationState(int, int);
+ method @NonNull public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
+ method @Deprecated @NonNull public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
+ method @Deprecated @Nullable public android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
+ method @NonNull public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForDomain(int);
+ method @NonNull public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStatesForTransportType(int);
field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3
field public static final int ROAMING_TYPE_NOT_ROAMING = 0; // 0x0
@@ -7926,7 +7934,7 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableDataConnectivity();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableModemForSlot(int, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean);
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int);
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent);
method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int);
@@ -7942,9 +7950,10 @@ package android.telephony {
method @Deprecated public boolean getDataEnabled();
method @Deprecated public boolean getDataEnabled(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
+ method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.util.Pair<java.lang.Integer,java.lang.Integer>> getLogicalToPhysicalSlotMapping();
+ method public static long getMaxNumberVerificationTimeoutMillis();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmap();
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState();
method public int getSimApplicationState();
@@ -8005,7 +8014,6 @@ package android.telephony {
field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
- field public static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000L; // 0xea60L
field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
@@ -8142,9 +8150,9 @@ package android.telephony.data {
method public void getDataCallList(@NonNull android.telephony.data.DataServiceCallback);
method public final int getSlotId();
method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
- method public void setDataProfile(java.util.List<android.telephony.data.DataProfile>, boolean, @Nullable android.telephony.data.DataServiceCallback);
- method public void setInitialAttachApn(android.telephony.data.DataProfile, boolean, @Nullable android.telephony.data.DataServiceCallback);
- method public void setupDataCall(int, android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @Nullable android.telephony.data.DataServiceCallback);
+ method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @Nullable android.telephony.data.DataServiceCallback);
+ method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @Nullable android.telephony.data.DataServiceCallback);
+ method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @Nullable android.telephony.data.DataServiceCallback);
}
public class DataServiceCallback {
@@ -8163,7 +8171,7 @@ package android.telephony.data {
public abstract class QualifiedNetworksService extends android.app.Service {
ctor public QualifiedNetworksService();
- method public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int);
+ method @NonNull public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int);
field public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService";
}
@@ -8171,7 +8179,7 @@ package android.telephony.data {
ctor public QualifiedNetworksService.NetworkAvailabilityUpdater(int);
method public abstract void close();
method public final int getSlotIndex();
- method public final void updateQualifiedNetworkTypes(int, int[]);
+ method public final void updateQualifiedNetworkTypes(int, @Nullable int[]);
}
}
@@ -8419,7 +8427,7 @@ package android.telephony.ims {
}
public class ImsCallSessionListener {
- method public void callQualityChanged(android.telephony.CallQuality);
+ method public void callQualityChanged(@NonNull android.telephony.CallQuality);
method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo);
method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile);
@@ -8444,7 +8452,7 @@ package android.telephony.ims {
method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo);
method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile);
method public void callSessionResumed(android.telephony.ims.ImsCallProfile);
- method public void callSessionRttAudioIndicatorChanged(android.telephony.ims.ImsStreamMediaProfile);
+ method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile);
method public void callSessionRttMessageReceived(String);
method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile);
method public void callSessionRttModifyResponseReceived(int);
@@ -8748,12 +8756,12 @@ package android.telephony.ims {
public final class ImsSsData implements android.os.Parcelable {
ctor public ImsSsData(int, int, int, int, int);
method public int describeContents();
- method public android.telephony.ims.ImsCallForwardInfo[] getCallForwardInfo();
+ method @Nullable public java.util.List<android.telephony.ims.ImsCallForwardInfo> getCallForwardInfo();
method public int getRequestType();
method public int getResult();
method public int getServiceClass();
method public int getServiceType();
- method @NonNull public android.telephony.ims.ImsSsInfo[] getSuppServiceInfo();
+ method @NonNull public java.util.List<android.telephony.ims.ImsSsInfo> getSuppServiceInfo();
method public int getTeleserviceType();
method public boolean isTypeBarring();
method public boolean isTypeCf();
@@ -8813,11 +8821,11 @@ package android.telephony.ims {
field public static final int SS_WAIT = 12; // 0xc
}
- public static class ImsSsData.Builder {
+ public static final class ImsSsData.Builder {
ctor public ImsSsData.Builder(int, int, int, int, int);
method @NonNull public android.telephony.ims.ImsSsData build();
- method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull android.telephony.ims.ImsCallForwardInfo[]);
- method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull android.telephony.ims.ImsSsInfo[]);
+ method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull java.util.List<android.telephony.ims.ImsCallForwardInfo>);
+ method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull java.util.List<android.telephony.ims.ImsSsInfo>);
}
public final class ImsSsInfo implements android.os.Parcelable {
@@ -8826,7 +8834,7 @@ package android.telephony.ims {
method public int getClirInterrogationStatus();
method public int getClirOutgoingState();
method @Deprecated public String getIcbNum();
- method public String getIncomingCommunicationBarringNumber();
+ method @Nullable public String getIncomingCommunicationBarringNumber();
method public int getProvisionStatus();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
@@ -8847,7 +8855,7 @@ package android.telephony.ims {
field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff
}
- public static class ImsSsInfo.Builder {
+ public static final class ImsSsInfo.Builder {
ctor public ImsSsInfo.Builder(int);
method @NonNull public android.telephony.ims.ImsSsInfo build();
method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int);
@@ -9295,12 +9303,12 @@ package android.telephony.mbms.vendor {
public class MbmsGroupCallServiceBase extends android.app.Service {
ctor public MbmsGroupCallServiceBase();
method public void dispose(int) throws android.os.RemoteException;
- method public int initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException;
+ method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
method public android.os.IBinder onBind(android.content.Intent);
- method public int startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback);
+ method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback);
method public void stopGroupCall(int, long);
- method public void updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>);
+ method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>);
}
public class MbmsStreamingServiceBase extends android.os.Binder {
@@ -9347,7 +9355,7 @@ package android.util {
method public static void logFileOperationFailure(int, int);
method public static void logFilePick(int, long, int, boolean, int, int, int);
method public static void logInvalidScopedAccessRequest(int);
- method public static void logPickerLaunchedFrom(String);
+ method public static void logPickerLaunchedFrom(@Nullable String);
method public static void logRootVisited(int, int);
method public static void logSearchMode(int);
method public static void logSearchType(int);
diff --git a/api/test-current.txt b/api/test-current.txt
index 9a2d503d6d52..684524e8987b 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -193,29 +193,36 @@ package android.app {
field public static final String OPSTR_WRITE_SMS = "android:write_sms";
field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
field public static final int OP_COARSE_LOCATION = 0; // 0x0
+ field public static final int OP_FLAGS_ALL = 31; // 0x1f
+ field public static final int OP_FLAG_SELF = 1; // 0x1
+ field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8
+ field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2
+ field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10
+ field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4
field public static final int OP_RECORD_AUDIO = 27; // 0x1b
+ field public static final int OP_START_FOREGROUND = 76; // 0x4c
field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
- field public static final int UID_STATE_BACKGROUND = 5; // 0x5
- field public static final int UID_STATE_CACHED = 6; // 0x6
- field public static final int UID_STATE_FOREGROUND = 4; // 0x4
- field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
- field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
- field public static final int UID_STATE_PERSISTENT = 0; // 0x0
- field public static final int UID_STATE_TOP = 1; // 0x1
+ field public static final int UID_STATE_BACKGROUND = 600; // 0x258
+ field public static final int UID_STATE_CACHED = 700; // 0x2bc
+ field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
+ field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
+ field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
+ field public static final int UID_STATE_PERSISTENT = 100; // 0x64
+ field public static final int UID_STATE_TOP = 200; // 0xc8
}
public static final class AppOpsManager.HistoricalOp 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 long getAccessCount(int, int, int);
+ method public long getAccessDuration(int, int, int);
+ method public long getBackgroundAccessCount(int);
+ method public long getBackgroundAccessDuration(int);
+ method public long getBackgroundRejectCount(int);
+ method public long getForegroundAccessCount(int);
+ method public long getForegroundAccessDuration(int);
+ method public long getForegroundRejectCount(int);
method @NonNull public String getOpName();
- method public long getRejectCount(int);
+ method public long getRejectCount(int, int, int);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
}
@@ -228,9 +235,9 @@ package android.app {
method public int getUidCount();
method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int);
method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(int);
- method public void increaseAccessCount(int, int, @NonNull String, int, long);
- method public void increaseAccessDuration(int, int, @NonNull String, int, long);
- method public void increaseRejectCount(int, int, @NonNull String, int, long);
+ method public void increaseAccessCount(int, int, @NonNull String, int, int, long);
+ method public void increaseAccessDuration(int, int, @NonNull String, int, int, long);
+ method public void increaseRejectCount(int, int, @NonNull String, int, int, long);
method public void offsetBeginAndEndTime(long);
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR;
@@ -242,6 +249,7 @@ package android.app {
public static final class AppOpsManager.HistoricalOpsRequest.Builder {
ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
+ method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
@@ -271,6 +279,31 @@ package android.app {
method public void onOpActiveChanged(int, int, String, boolean);
}
+ public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
+ method public int describeContents();
+ method public long getDuration();
+ method public long getLastAccessBackgroundTime(int);
+ method public long getLastAccessForegroundTime(int);
+ method public long getLastAccessTime(int);
+ method public long getLastAccessTime(int, int, int);
+ method public long getLastBackgroundDuration(int);
+ method public long getLastDuration(int, int, int);
+ method public long getLastForegroundDuration(int);
+ method public long getLastRejectBackgroundTime(int);
+ method public long getLastRejectForegroundTime(int);
+ method public long getLastRejectTime(int);
+ method public long getLastRejectTime(int, int, int);
+ method public int getMode();
+ method @NonNull public String getOpStr();
+ method @Nullable public String getProxyPackageName();
+ method @Nullable public String getProxyPackageName(int, int);
+ method public int getProxyUid();
+ method public int getProxyUid(int, int);
+ method public boolean isRunning();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
+ }
+
public class DownloadManager {
field public static final String COLUMN_MEDIASTORE_URI = "mediastore_uri";
}
@@ -474,12 +507,22 @@ package android.app.prediction {
package android.app.role {
+ public interface OnRoleHoldersChangedListener {
+ method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle);
+ }
+
public final class RoleManager {
+ method @RequiresPermission("android.permission.OBSERVE_ROLE_HOLDERS") public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String);
method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHolders(@NonNull String);
method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle);
+ method @RequiresPermission("android.permission.OBSERVE_ROLE_HOLDERS") public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle);
method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull android.app.role.RoleManagerCallback);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String);
+ method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>);
}
public interface RoleManagerCallback {
@@ -562,6 +605,10 @@ package android.content {
method public android.view.Display getDisplay();
}
+ public class Intent implements java.lang.Cloneable android.os.Parcelable {
+ field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
+ }
+
}
package android.content.pm {
@@ -891,6 +938,7 @@ package android.location {
public class LocationManager {
method public String[] getBackgroundThrottlingWhitelist();
method public String[] getIgnoreSettingsWhitelist();
+ method @NonNull public java.util.List<android.location.LocationRequest> getTestProviderCurrentRequests(String);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(android.location.LocationRequest, android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, android.os.UserHandle);
@@ -904,11 +952,14 @@ package android.location {
method public long getInterval();
method public int getNumUpdates();
method public int getQuality();
+ method public boolean isLocationSettingsIgnored();
method public android.location.LocationRequest setExpireAt(long);
method public android.location.LocationRequest setExpireIn(long);
method public android.location.LocationRequest setFastestInterval(long);
method public android.location.LocationRequest setInterval(long);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest setLocationSettingsIgnored(boolean);
method public android.location.LocationRequest setNumUpdates(int);
+ method public android.location.LocationRequest setProvider(String);
method public android.location.LocationRequest setQuality(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACCURACY_BLOCK = 102; // 0x66
@@ -960,7 +1011,7 @@ package android.media {
method public android.media.MediaPlayer2.DrmInfo getDrmInfo(@NonNull android.media.DataSourceDesc);
method public android.media.MediaDrm.KeyRequest getDrmKeyRequest(@NonNull android.media.DataSourceDesc, @Nullable byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException;
method public String getDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public Object prepareDrm(@NonNull android.media.DataSourceDesc, @NonNull java.util.UUID);
+ method @NonNull public Object prepareDrm(@NonNull android.media.DataSourceDesc, @NonNull java.util.UUID);
method public byte[] provideDrmKeyResponse(@NonNull android.media.DataSourceDesc, @Nullable byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException;
method public void releaseDrm(@NonNull android.media.DataSourceDesc) throws android.media.MediaPlayer2.NoDrmSchemeException;
method public void restoreDrmKeys(@NonNull android.media.DataSourceDesc, @NonNull byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException;
@@ -1085,8 +1136,8 @@ package android.net {
public class LinkAddress implements android.os.Parcelable {
ctor public LinkAddress(java.net.InetAddress, int, int, int);
- ctor public LinkAddress(java.net.InetAddress, int);
- ctor public LinkAddress(String);
+ ctor public LinkAddress(@NonNull java.net.InetAddress, int);
+ ctor public LinkAddress(@NonNull String);
ctor public LinkAddress(String, int, int);
method public boolean isGlobalPreferred();
method public boolean isIPv4();
@@ -1986,6 +2037,7 @@ package android.provider {
field public static final String DYNAMIC_POWER_SAVINGS_ENABLED = "dynamic_power_savings_enabled";
field public static final String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions";
field public static final String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
+ field public static final String LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST = "location_ignore_settings_package_whitelist";
field public static final String LOW_POWER_MODE = "low_power";
field public static final String LOW_POWER_MODE_STICKY = "low_power_sticky";
field public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices";
@@ -2302,7 +2354,7 @@ package android.telecom {
}
public final class PhoneAccountSuggestion implements android.os.Parcelable {
- ctor public PhoneAccountSuggestion(android.telecom.PhoneAccountHandle, int, boolean);
+ ctor public PhoneAccountSuggestion(@NonNull android.telecom.PhoneAccountHandle, int, boolean);
}
public class PhoneAccountSuggestionService extends android.app.Service {
@@ -2316,7 +2368,7 @@ package android.telecom {
public class TelecomManager {
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getCurrentTtyMode();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall();
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(android.telecom.PhoneAccountHandle);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle);
field public static final int TTY_MODE_FULL = 1; // 0x1
field public static final int TTY_MODE_HCO = 2; // 0x2
field public static final int TTY_MODE_OFF = 0; // 0x0
@@ -2421,12 +2473,12 @@ package android.telephony.mbms.vendor {
public class MbmsGroupCallServiceBase extends android.app.Service {
ctor public MbmsGroupCallServiceBase();
method public void dispose(int) throws android.os.RemoteException;
- method public int initialize(android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException;
+ method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException;
method public void onAppCallbackDied(int, int);
method public android.os.IBinder onBind(android.content.Intent);
- method public int startGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>, android.telephony.mbms.GroupCallCallback);
+ method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback);
method public void stopGroupCall(int, long);
- method public void updateGroupCall(int, long, java.util.List<java.lang.Integer>, java.util.List<java.lang.Integer>);
+ method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>);
}
public class MbmsStreamingServiceBase extends android.os.Binder {
@@ -2714,7 +2766,7 @@ package android.view {
}
public final class Display {
- method public boolean supportsSystemDecorations();
+ method public boolean hasAccess(int);
}
public class FocusFinder {
@@ -2786,6 +2838,7 @@ package android.view {
method public default void setShouldShowIme(int, boolean);
method public default void setShouldShowSystemDecors(int, boolean);
method public default void setShouldShowWithInsecureKeyguard(int, boolean);
+ method public default boolean shouldShowSystemDecors(int);
}
public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
@@ -2980,7 +3033,7 @@ package android.view.inspector {
method public abstract String value();
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface InspectableProperty {
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface InspectableProperty {
method public abstract int attributeId() default android.content.res.Resources.ID_NULL;
method public abstract android.view.inspector.InspectableProperty.EnumMap[] enumMapping() default {};
method public abstract android.view.inspector.InspectableProperty.FlagMap[] flagMapping() default {};
diff --git a/cmds/hid/hid b/cmds/hid/hid
index 2359fcd738dd..3931da1e2a85 100755
--- a/cmds/hid/hid
+++ b/cmds/hid/hid
@@ -5,4 +5,10 @@
#
base=/system
export CLASSPATH=$base/framework/hid.jar
+
+# Preload the native portion libhidcommand_jni.so to bypass the dependency
+# checks in the Java classloader, which prohibit dependencies that aren't
+# listed in system/core/rootdir/etc/public.libraries.android.txt.
+export LD_PRELOAD=libhidcommand_jni.so
+
exec app_process $base/bin com.android.commands.hid.Hid "$@"
diff --git a/cmds/incident_helper/src/ih_util.cpp b/cmds/incident_helper/src/ih_util.cpp
index 012310cc277a..77a56e55045b 100644
--- a/cmds/incident_helper/src/ih_util.cpp
+++ b/cmds/incident_helper/src/ih_util.cpp
@@ -142,7 +142,7 @@ record_t parseRecordByColumns(const std::string& line, const std::vector<int>& i
}
if (lineSize - lastIndex > 0) {
int beginning = lastIndex;
- if (record.size() == indices.size()) {
+ if (record.size() == indices.size() && !record.empty()) {
// We've already encountered all of the columns...put whatever is
// left in the last column.
record.pop_back();
diff --git a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
index 21ced9cb485c..5d525e6c7f3e 100644
--- a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
+++ b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp
@@ -65,8 +65,9 @@ CpuInfoParser::Parse(const int in, const int out) const
if (line.empty()) continue;
nline++;
-
- if (stripPrefix(&line, "Tasks:")) {
+ // The format changes from time to time in toybox/toys/posix/ps.c
+ // With -H, it prints Threads instead of Tasks (FLAG(H)?"Thread":"Task")
+ if (stripPrefix(&line, "Threads:")) {
writeSuffixLine(&proto, CpuInfoProto::TASK_STATS, line, COMMA_DELIMITER,
CpuInfoProto::TaskStats::_FIELD_COUNT,
CpuInfoProto::TaskStats::_FIELD_NAMES,
diff --git a/cmds/incident_helper/testdata/cpuinfo.txt b/cmds/incident_helper/testdata/cpuinfo.txt
index ec4a83960698..aa3afc33ad6a 100644
--- a/cmds/incident_helper/testdata/cpuinfo.txt
+++ b/cmds/incident_helper/testdata/cpuinfo.txt
@@ -1,8 +1,8 @@
-Tasks: 2038 total, 1 running,2033 sleeping, 0 stopped, 0 zombie
+Threads: 2038 total, 1 running,2033 sleeping, 0 stopped, 0 zombie
-Mem: 3842668k total, 3761936k used, 80732k free, 220188k buffers
+ Mem: 3842668k total, 3761936k used, 80732k free, 220188k buffers
-Swap: 524284k total, 25892k used, 498392k free, 1316952k cached
+ Swap: 524284k total, 25892k used, 498392k free, 1316952k cached
400%cpu 17%user 0%nice 43%sys 338%idle 0%iow 0%irq 1%sirq 0%host
@@ -12,4 +12,4 @@ Swap: 524284k total, 25892k used, 498392k free, 1316952k cached
29438 29438 rootabcdefghij 20 0 57.9 R 14M 3.8M top test top
916 916 system 18 -2 1.4 S 4.6G 404M fg system_server system_server
28 28 root -2 0 1.4 S 0 0 bg rcuc/3 [rcuc/3]
- 27 27 root RT 0 1.4 S 0 0 ta migration/3 [migration/3] \ No newline at end of file
+ 27 27 root RT 0 1.4 S 0 0 ta migration/3 [migration/3]
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index ca48881ca519..da720021512d 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -68,6 +68,7 @@ cc_defaults {
"src/config/ConfigKey.cpp",
"src/config/ConfigListener.cpp",
"src/config/ConfigManager.cpp",
+ "src/external/GpuStatsPuller.cpp",
"src/external/Perfetto.cpp",
"src/external/Perfprofd.cpp",
"src/external/StatsPuller.cpp",
@@ -122,6 +123,7 @@ cc_defaults {
shared_libs: [
"libbase",
"libbinder",
+ "libgraphicsenv",
"libincident",
"liblog",
"libutils",
diff --git a/cmds/statsd/OWNERS b/cmds/statsd/OWNERS
index deebd4e3cd3b..13157505fc28 100644
--- a/cmds/statsd/OWNERS
+++ b/cmds/statsd/OWNERS
@@ -1,7 +1,6 @@
bookatz@google.com
cjyu@google.com
dwchen@google.com
-gaillard@google.com
jinyithu@google.com
joeo@google.com
kwekua@google.com
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 69fbf1f9d881..9ac888ba2eb5 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -1229,70 +1229,81 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra
hardware::Return<void> StatsService::reportSpeakerImpedance(
const SpeakerImpedance& speakerImpedance) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), speakerImpedance);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::SPEAKER_IMPEDANCE_REPORTED,
+ speakerImpedance.speakerLocation, speakerImpedance.milliOhms);
return hardware::Void();
}
hardware::Return<void> StatsService::reportHardwareFailed(const HardwareFailed& hardwareFailed) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), hardwareFailed);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::HARDWARE_FAILED, int32_t(hardwareFailed.hardwareType),
+ hardwareFailed.hardwareLocation, int32_t(hardwareFailed.errorCode));
return hardware::Void();
}
hardware::Return<void> StatsService::reportPhysicalDropDetected(
const PhysicalDropDetected& physicalDropDetected) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), physicalDropDetected);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::PHYSICAL_DROP_DETECTED,
+ int32_t(physicalDropDetected.confidencePctg), physicalDropDetected.accelPeak,
+ physicalDropDetected.freefallDuration);
return hardware::Void();
}
hardware::Return<void> StatsService::reportChargeCycles(const ChargeCycles& chargeCycles) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), chargeCycles);
- mProcessor->OnLogEvent(&event);
+ std::vector<int32_t> buckets = chargeCycles.cycleBucket;
+ int initialSize = buckets.size();
+ for (int i = 0; i < 10 - initialSize; i++) {
+ buckets.push_back(-1); // Push -1 for buckets that do not exist.
+ }
+ android::util::stats_write(android::util::CHARGE_CYCLES_REPORTED, buckets[0], buckets[1],
+ buckets[2], buckets[3], buckets[4], buckets[5], buckets[6], buckets[7], buckets[8],
+ buckets[9]);
return hardware::Void();
}
hardware::Return<void> StatsService::reportBatteryHealthSnapshot(
const BatteryHealthSnapshotArgs& batteryHealthSnapshotArgs) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(),
- batteryHealthSnapshotArgs);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::BATTERY_HEALTH_SNAPSHOT,
+ int32_t(batteryHealthSnapshotArgs.type), batteryHealthSnapshotArgs.temperatureDeciC,
+ batteryHealthSnapshotArgs.voltageMicroV, batteryHealthSnapshotArgs.currentMicroA,
+ batteryHealthSnapshotArgs.openCircuitVoltageMicroV,
+ batteryHealthSnapshotArgs.resistanceMicroOhm, batteryHealthSnapshotArgs.levelPercent);
return hardware::Void();
}
hardware::Return<void> StatsService::reportSlowIo(const SlowIo& slowIo) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), slowIo);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::SLOW_IO, int32_t(slowIo.operation), slowIo.count);
return hardware::Void();
}
hardware::Return<void> StatsService::reportBatteryCausedShutdown(
const BatteryCausedShutdown& batteryCausedShutdown) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), batteryCausedShutdown);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::BATTERY_CAUSED_SHUTDOWN,
+ batteryCausedShutdown.voltageMicroV);
return hardware::Void();
}
hardware::Return<void> StatsService::reportUsbPortOverheatEvent(
const UsbPortOverheatEvent& usbPortOverheatEvent) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), usbPortOverheatEvent);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::USB_PORT_OVERHEAT_EVENT_REPORTED,
+ usbPortOverheatEvent.plugTemperatureDeciC, usbPortOverheatEvent.maxTemperatureDeciC,
+ usbPortOverheatEvent.timeToOverheat, usbPortOverheatEvent.timeToHysteresis,
+ usbPortOverheatEvent.timeToInactive);
return hardware::Void();
}
hardware::Return<void> StatsService::reportSpeechDspStat(
const SpeechDspStat& speechDspStat) {
- LogEvent event(getWallClockSec() * NS_PER_SEC, getElapsedRealtimeNs(), speechDspStat);
- mProcessor->OnLogEvent(&event);
+ android::util::stats_write(android::util::SPEECH_DSP_STAT_REPORTED,
+ speechDspStat.totalUptimeMillis, speechDspStat.totalDowntimeMillis,
+ speechDspStat.totalCrashCount, speechDspStat.totalRecoverCount);
return hardware::Void();
}
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index b6474001deba..a983b2705d14 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -149,7 +149,7 @@ message Atom {
WTFOccurred wtf_occurred = 80;
LowMemReported low_mem_reported = 81;
GenericAtom generic_atom = 82;
- KeyValuePairsAtom key_value_pairs_atom = 83;
+ KeyValuePairsAtom key_value_pairs_atom = 83 [(allow_from_any_uid) = true];
VibratorStateChanged vibrator_state_changed = 84;
DeferredJobStatsReported deferred_job_stats_reported = 85;
ThermalThrottlingStateChanged thermal_throttling = 86;
@@ -252,7 +252,7 @@ message Atom {
}
// Pulled events will start at field 10000.
- // Next: 10048
+ // Next: 10056
oneof pulled {
WifiBytesTransfer wifi_bytes_transfer = 10000;
WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001;
@@ -308,6 +308,8 @@ message Atom {
TrainInfo train_info = 10051;
TimeZoneDataInfo time_zone_data_info = 10052;
SDCardInfo sdcard_info = 10053;
+ GpuStatsGlobalInfo gpu_stats_global_info = 10054;
+ GpuStatsAppInfo gpu_stats_app_info = 10055;
}
// DO NOT USE field numbers above 100,000 in AOSP.
@@ -1566,6 +1568,7 @@ message WatchdogRollbackOccurred {
ROLLBACK_INITIATE = 1;
ROLLBACK_SUCCESS = 2;
ROLLBACK_FAILURE = 3;
+ ROLLBACK_ROOT_TRIGGERED = 4;
}
optional RollbackType rollback_type = 1;
@@ -5688,3 +5691,55 @@ message TimeZoneDataInfo {
// A version identifier for the data set on device. e.g. "2018i"
optional string tzdb_version = 1;
}
+
+/*
+ * Logs the GPU stats global health information.
+ *
+ * Logged from:
+ * frameworks/native/services/gpuservice/gpustats/
+ */
+message GpuStatsGlobalInfo {
+ // Package name of the gpu driver.
+ optional string driver_package_name = 1;
+
+ // Version name of the gpu driver.
+ optional string driver_version_name = 2;
+
+ // Version code of the gpu driver.
+ optional int64 driver_version_code = 3;
+
+ // Build time of the gpu driver in UTC as seconds since January 1, 1970.
+ optional int64 driver_build_time = 4;
+
+ // Total count of the gl driver gets loaded.
+ optional int64 gl_loading_count = 5;
+
+ // Total count of the gl driver fails to be loaded.
+ optional int64 gl_loading_failure_count = 6;
+
+ // Total count of the Vulkan driver gets loaded.
+ optional int64 vk_loading_count = 7;
+
+ // Total count of the Vulkan driver fails to be loaded.
+ optional int64 vk_loading_failure_count = 8;
+}
+
+/*
+ * Logs the GPU stats per app health information.
+ *
+ * Logged from:
+ * frameworks/native/services/gpuservice/gpustats/
+ */
+message GpuStatsAppInfo {
+ // Package name of the application that loads the gpu driver.
+ optional string app_package_name = 1;
+
+ // Version code of the gpu driver this app loads.
+ optional int64 driver_version_code = 2;
+
+ // List of all the gl driver loading times for this app.
+ repeated int64 gl_driver_loading_time = 3;
+
+ // List of all the Vulkan driver laoding times for this app.
+ repeated int64 vk_driver_loading_time = 4;
+}
diff --git a/cmds/statsd/src/external/GpuStatsPuller.cpp b/cmds/statsd/src/external/GpuStatsPuller.cpp
new file mode 100644
index 000000000000..844580321719
--- /dev/null
+++ b/cmds/statsd/src/external/GpuStatsPuller.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "GpuStatsPuller.h"
+
+#include <binder/IServiceManager.h>
+#include <graphicsenv/GpuStatsInfo.h>
+#include <graphicsenv/IGpuService.h>
+
+#include "logd/LogEvent.h"
+
+#include "stats_log_util.h"
+#include "statslog.h"
+
+namespace android {
+namespace os {
+namespace statsd {
+
+GpuStatsPuller::GpuStatsPuller(const int tagId) : StatsPuller(tagId) {
+}
+
+static sp<IGpuService> getGpuService() {
+ const sp<IBinder> binder = defaultServiceManager()->checkService(String16("gpu"));
+ if (!binder) {
+ ALOGE("Failed to get gpu service");
+ return nullptr;
+ }
+
+ return interface_cast<IGpuService>(binder);
+}
+
+static bool pullGpuStatsGlobalInfo(const sp<IGpuService>& gpuService,
+ std::vector<std::shared_ptr<LogEvent>>* data) {
+ std::vector<GpuStatsGlobalInfo> stats;
+ status_t status = gpuService->getGpuStatsGlobalInfo(&stats);
+ if (status != OK) {
+ return false;
+ }
+
+ data->clear();
+ data->reserve(stats.size());
+ for (const auto& info : stats) {
+ std::shared_ptr<LogEvent> event = make_shared<LogEvent>(
+ android::util::GPU_STATS_GLOBAL_INFO, getWallClockNs(), getElapsedRealtimeNs());
+ if (!event->write(info.driverPackageName)) return false;
+ if (!event->write(info.driverVersionName)) return false;
+ if (!event->write((int64_t)info.driverVersionCode)) return false;
+ if (!event->write(info.driverBuildTime)) return false;
+ if (!event->write((int64_t)info.glLoadingCount)) return false;
+ if (!event->write((int64_t)info.glLoadingFailureCount)) return false;
+ if (!event->write((int64_t)info.vkLoadingCount)) return false;
+ if (!event->write((int64_t)info.vkLoadingFailureCount)) return false;
+ event->init();
+ data->emplace_back(event);
+ }
+
+ return true;
+}
+
+bool GpuStatsPuller::PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) {
+ const sp<IGpuService> gpuService = getGpuService();
+ if (!gpuService) {
+ return false;
+ }
+
+ switch (mTagId) {
+ case android::util::GPU_STATS_GLOBAL_INFO:
+ return pullGpuStatsGlobalInfo(gpuService, data);
+ default:
+ break;
+ }
+
+ return false;
+}
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/src/external/GpuStatsPuller.h b/cmds/statsd/src/external/GpuStatsPuller.h
new file mode 100644
index 000000000000..4c7a4d604252
--- /dev/null
+++ b/cmds/statsd/src/external/GpuStatsPuller.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "StatsPuller.h"
+
+namespace android {
+namespace os {
+namespace statsd {
+
+/**
+ * Pull GpuStats from GpuService.
+ */
+class GpuStatsPuller : public StatsPuller {
+public:
+ explicit GpuStatsPuller(const int tagId);
+ bool PullInternal(std::vector<std::shared_ptr<LogEvent>>* data) override;
+};
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index 1513834b6724..924704ba6db5 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -27,6 +27,7 @@
#include "../logd/LogEvent.h"
#include "../stats_log_util.h"
#include "../statscompanion_util.h"
+#include "GpuStatsPuller.h"
#include "PowerStatsPuller.h"
#include "ResourceHealthManagerPuller.h"
#include "StatsCallbackPuller.h"
@@ -240,6 +241,9 @@ std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
// SDCardInfo
{android::util::SDCARD_INFO,
{.puller = new StatsCompanionServicePuller(android::util::SDCARD_INFO)}},
+ // GpuStatsGlobalInfo
+ {android::util::GPU_STATS_GLOBAL_INFO,
+ {.puller = new GpuStatsPuller(android::util::GPU_STATS_GLOBAL_INFO)}},
};
StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp
index dec36b54a1ce..0430e4ec9a2d 100644
--- a/cmds/statsd/src/logd/LogEvent.cpp
+++ b/cmds/statsd/src/logd/LogEvent.cpp
@@ -21,6 +21,7 @@
#include "statslog.h"
#include <binder/IPCThreadState.h>
+#include <private/android_filesystem_config.h>
namespace android {
namespace os {
@@ -202,140 +203,11 @@ LogEvent::LogEvent(const string& trainName, int64_t trainVersionCode, bool requi
}
LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const SpeakerImpedance& speakerImpedance) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::SPEAKER_IMPEDANCE_REPORTED;
-
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(1)), Value(speakerImpedance.speakerLocation)));
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(2)), Value(speakerImpedance.milliOhms)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const HardwareFailed& hardwareFailed) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::HARDWARE_FAILED;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(int32_t(hardwareFailed.hardwareType))));
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(2)), Value(hardwareFailed.hardwareLocation)));
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(3)), Value(int32_t(hardwareFailed.errorCode))));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const PhysicalDropDetected& physicalDropDetected) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::PHYSICAL_DROP_DETECTED;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(int32_t(physicalDropDetected.confidencePctg))));
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(2)), Value(physicalDropDetected.accelPeak)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(3)),
- Value(physicalDropDetected.freefallDuration)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const ChargeCycles& chargeCycles) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::CHARGE_CYCLES_REPORTED;
-
- for (size_t i = 0; i < chargeCycles.cycleBucket.size(); i++) {
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(i + 1)),
- Value(chargeCycles.cycleBucket[i])));
- }
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const BatteryHealthSnapshotArgs& batteryHealthSnapshotArgs) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::BATTERY_HEALTH_SNAPSHOT;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(int32_t(batteryHealthSnapshotArgs.type))));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(2)),
- Value(batteryHealthSnapshotArgs.temperatureDeciC)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(3)),
- Value(batteryHealthSnapshotArgs.voltageMicroV)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)),
- Value(batteryHealthSnapshotArgs.currentMicroA)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(5)),
- Value(batteryHealthSnapshotArgs.openCircuitVoltageMicroV)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(6)),
- Value(batteryHealthSnapshotArgs.resistanceMicroOhm)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(7)),
- Value(batteryHealthSnapshotArgs.levelPercent)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, const SlowIo& slowIo) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::SLOW_IO;
-
- int pos[] = {1};
- mValues.push_back(
- FieldValue(Field(mTagId, getSimpleField(1)), Value(int32_t(slowIo.operation))));
- pos[0]++;
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(2)), Value(slowIo.count)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const SpeechDspStat& speechDspStat) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::SPEECH_DSP_STAT_REPORTED;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(speechDspStat.totalUptimeMillis)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(2)),
- Value(speechDspStat.totalDowntimeMillis)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(3)),
- Value(speechDspStat.totalCrashCount)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)),
- Value(speechDspStat.totalRecoverCount)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const BatteryCausedShutdown& batteryCausedShutdown) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::BATTERY_CAUSED_SHUTDOWN;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(batteryCausedShutdown.voltageMicroV)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const UsbPortOverheatEvent& usbPortOverheatEvent) {
- mLogdTimestampNs = wallClockTimestampNs;
- mElapsedTimestampNs = elapsedTimestampNs;
- mTagId = android::util::USB_PORT_OVERHEAT_EVENT_REPORTED;
-
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(1)),
- Value(usbPortOverheatEvent.plugTemperatureDeciC)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(2)),
- Value(usbPortOverheatEvent.maxTemperatureDeciC)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(3)),
- Value(usbPortOverheatEvent.timeToOverheat)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)),
- Value(usbPortOverheatEvent.timeToHysteresis)));
- mValues.push_back(FieldValue(Field(mTagId, getSimpleField(5)),
- Value(usbPortOverheatEvent.timeToInactive)));
-}
-
-LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
const VendorAtom& vendorAtom) {
mLogdTimestampNs = wallClockTimestampNs;
mElapsedTimestampNs = elapsedTimestampNs;
mTagId = vendorAtom.atomId;
+ mLogUid = AID_STATSD;
mValues.push_back(
FieldValue(Field(mTagId, getSimpleField(1)), Value(vendorAtom.reverseDomainName)));
diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h
index 111a619760df..2fde8b4c027d 100644
--- a/cmds/statsd/src/logd/LogEvent.h
+++ b/cmds/statsd/src/logd/LogEvent.h
@@ -108,33 +108,6 @@ public:
const std::vector<uint8_t>& experimentIds, int32_t userId);
explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const SpeakerImpedance& speakerImpedance);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const HardwareFailed& hardwareFailed);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const PhysicalDropDetected& physicalDropDetected);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const ChargeCycles& chargeCycles);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const BatteryHealthSnapshotArgs& batteryHealthSnapshotArgs);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const SlowIo& slowIo);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const BatteryCausedShutdown& batteryCausedShutdown);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const UsbPortOverheatEvent& usbPortOverheatEvent);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
- const SpeechDspStat& speechDspStat);
-
- explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
const VendorAtom& vendorAtom);
explicit LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index e6ba40deb16c..46a956cab1a8 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -36,18 +36,7 @@ Landroid/app/ActivityThread$H;-><init>(Landroid/app/ActivityThread;)V
Landroid/app/admin/IDevicePolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/admin/IDevicePolicyManager;
Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_packageHasActiveAdmins:I
Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_removeActiveAdmin:I
-Landroid/app/admin/IDevicePolicyManager;->packageHasActiveAdmins(Ljava/lang/String;I)Z
Landroid/app/backup/IBackupManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupManager;
-Landroid/app/backup/IBackupManager;->acknowledgeFullBackupOrRestore(IZLjava/lang/String;Ljava/lang/String;Landroid/app/backup/IFullBackupRestoreObserver;)V
-Landroid/app/backup/IBackupManager;->clearBackupData(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/app/backup/IBackupManager;->dataChanged(Ljava/lang/String;)V
-Landroid/app/backup/IBackupManager;->getCurrentTransport()Ljava/lang/String;
-Landroid/app/backup/IBackupManager;->isBackupEnabled()Z
-Landroid/app/backup/IBackupManager;->isBackupServiceActive(I)Z
-Landroid/app/backup/IBackupManager;->listAllTransports()[Ljava/lang/String;
-Landroid/app/backup/IBackupManager;->selectBackupTransport(Ljava/lang/String;)Ljava/lang/String;
-Landroid/app/backup/IBackupManager;->setAutoRestore(Z)V
-Landroid/app/backup/IBackupManager;->setBackupEnabled(Z)V
Landroid/app/backup/IFullBackupRestoreObserver$Stub;-><init>()V
Landroid/app/backup/IRestoreObserver$Stub;-><init>()V
Landroid/app/DownloadManager;->restartDownload([J)V
@@ -215,19 +204,12 @@ Landroid/app/job/IJobCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/job/IJobCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/app/job/IJobCallback$Stub;-><init>()V
Landroid/app/job/IJobCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobCallback;
-Landroid/app/job/IJobCallback;->acknowledgeStartMessage(IZ)V
-Landroid/app/job/IJobCallback;->acknowledgeStopMessage(IZ)V
-Landroid/app/job/IJobCallback;->completeWork(II)Z
-Landroid/app/job/IJobCallback;->dequeueWork(I)Landroid/app/job/JobWorkItem;
-Landroid/app/job/IJobCallback;->jobFinished(IZ)V
Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
Landroid/app/job/IJobService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/job/IJobService$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/app/job/IJobService$Stub;-><init>()V
Landroid/app/job/IJobService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobService;
-Landroid/app/job/IJobService;->startJob(Landroid/app/job/JobParameters;)V
-Landroid/app/job/IJobService;->stopJob(Landroid/app/job/JobParameters;)V
Landroid/app/PackageDeleteObserver;-><init>()V
Landroid/app/PackageInstallObserver;-><init>()V
Landroid/app/ReceiverRestrictedContext;-><init>(Landroid/content/Context;)V
@@ -237,10 +219,6 @@ Landroid/app/TaskStackListener;-><init>()V
Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/app/UiAutomationConnection;-><init>()V
Landroid/app/usage/IUsageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IUsageStatsManager;
-Landroid/app/usage/IUsageStatsManager;->isAppInactive(Ljava/lang/String;I)Z
-Landroid/app/usage/IUsageStatsManager;->queryConfigurationStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
-Landroid/app/usage/IUsageStatsManager;->queryUsageStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
-Landroid/app/usage/IUsageStatsManager;->setAppInactive(Ljava/lang/String;ZI)V
Landroid/app/UserSwitchObserver;-><init>()V
Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
@@ -284,22 +262,14 @@ Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V
Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V
Landroid/companion/IFindDeviceCallback;->onSuccess(Landroid/app/PendingIntent;)V
-Landroid/content/ContentProviderProxy;->mRemote:Landroid/os/IBinder;
Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard;
Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IContentService$Stub;-><init>()V
Landroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService;
-Landroid/content/IContentService;->cancelSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)V
-Landroid/content/IContentService;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
-Landroid/content/IContentService;->getMasterSyncAutomatically()Z
-Landroid/content/IContentService;->getSyncAdapterTypes()[Landroid/content/SyncAdapterType;
-Landroid/content/IContentService;->isSyncActive(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)Z
-Landroid/content/IContentService;->setMasterSyncAutomatically(Z)V
Landroid/content/IIntentReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IIntentReceiver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/IIntentReceiver$Stub;-><init>()V
-Landroid/content/IIntentReceiver;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
Landroid/content/IOnPrimaryClipChangedListener$Stub;-><init>()V
Landroid/content/IOnPrimaryClipChangedListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IOnPrimaryClipChangedListener;
Landroid/content/IRestrictionsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IRestrictionsManager;
@@ -307,29 +277,20 @@ Landroid/content/ISyncAdapter$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/ISyncAdapter$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/ISyncAdapter$Stub;-><init>()V
Landroid/content/ISyncAdapter$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncAdapter;
-Landroid/content/ISyncAdapter;->cancelSync(Landroid/content/ISyncContext;)V
-Landroid/content/ISyncAdapter;->onUnsyncableAccount(Landroid/content/ISyncAdapterUnsyncableAccountCallback;)V
-Landroid/content/ISyncAdapter;->startSync(Landroid/content/ISyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V
Landroid/content/ISyncContext$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/ISyncContext$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/ISyncContext$Stub;-><init>()V
Landroid/content/ISyncContext$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncContext;
Landroid/content/ISyncServiceAdapter$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncServiceAdapter;
-Landroid/content/ISyncServiceAdapter;->cancelSync(Landroid/content/ISyncContext;)V
-Landroid/content/ISyncServiceAdapter;->startSync(Landroid/content/ISyncContext;Landroid/os/Bundle;)V
Landroid/content/ISyncStatusObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/ISyncStatusObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/ISyncStatusObserver$Stub;-><init>()V
Landroid/content/ISyncStatusObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncStatusObserver;
-Landroid/content/ISyncStatusObserver;->onStatusChanged(I)V
Landroid/content/om/IOverlayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/om/IOverlayManager;
-Landroid/content/om/IOverlayManager;->getAllOverlays(I)Ljava/util/Map;
-Landroid/content/om/IOverlayManager;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
Landroid/content/pm/IPackageDataObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageDataObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageDataObserver$Stub;-><init>()V
Landroid/content/pm/IPackageDataObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDataObserver;
-Landroid/content/pm/IPackageDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V
Landroid/content/pm/IPackageDeleteObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageDeleteObserver$Stub;-><init>()V
Landroid/content/pm/IPackageDeleteObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDeleteObserver;
@@ -337,17 +298,9 @@ Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;-><init>(Landroid/os/IBin
Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageDeleteObserver2$Stub;-><init>()V
Landroid/content/pm/IPackageDeleteObserver2$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDeleteObserver2;
-Landroid/content/pm/IPackageDeleteObserver2;->onPackageDeleted(Ljava/lang/String;ILjava/lang/String;)V
-Landroid/content/pm/IPackageDeleteObserver;->packageDeleted(Ljava/lang/String;I)V
-Landroid/content/pm/IPackageInstaller;->uninstall(Landroid/content/pm/VersionedPackage;Ljava/lang/String;ILandroid/content/IntentSender;I)V
Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageInstallerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerCallback;
-Landroid/content/pm/IPackageInstallerCallback;->onSessionActiveChanged(IZ)V
-Landroid/content/pm/IPackageInstallerCallback;->onSessionBadgingChanged(I)V
-Landroid/content/pm/IPackageInstallerCallback;->onSessionCreated(I)V
-Landroid/content/pm/IPackageInstallerCallback;->onSessionFinished(IZ)V
-Landroid/content/pm/IPackageInstallerCallback;->onSessionProgressChanged(IF)V
Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageInstallerSession$Stub;-><init>()V
@@ -356,8 +309,6 @@ Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;-><init>(Landroid/os/IBi
Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageInstallObserver2$Stub;-><init>()V
Landroid/content/pm/IPackageInstallObserver2$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallObserver2;
-Landroid/content/pm/IPackageInstallObserver2;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
-Landroid/content/pm/IPackageInstallObserver2;->onUserActionRequired(Landroid/content/Intent;)V
Landroid/content/pm/IPackageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageManager$Stub$Proxy;->checkUidPermission(Ljava/lang/String;I)I
Landroid/content/pm/IPackageManager$Stub$Proxy;->getAppOpPermissionPackages(Ljava/lang/String;)[Ljava/lang/String;
@@ -369,69 +320,12 @@ Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang
Landroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String;
Landroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager;
Landroid/content/pm/IPackageManager$Stub;->TRANSACTION_getApplicationInfo:I
-Landroid/content/pm/IPackageManager;->addPermission(Landroid/content/pm/PermissionInfo;)Z
-Landroid/content/pm/IPackageManager;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z
-Landroid/content/pm/IPackageManager;->canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
-Landroid/content/pm/IPackageManager;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/content/pm/IPackageManager;->checkUidSignatures(II)I
-Landroid/content/pm/IPackageManager;->clearPackagePreferredActivities(Ljava/lang/String;)V
-Landroid/content/pm/IPackageManager;->currentToCanonicalPackageNames([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->deleteApplicationCacheFiles(Ljava/lang/String;Landroid/content/pm/IPackageDataObserver;)V
-Landroid/content/pm/IPackageManager;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
-Landroid/content/pm/IPackageManager;->getApplicationEnabledSetting(Ljava/lang/String;I)I
-Landroid/content/pm/IPackageManager;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
-Landroid/content/pm/IPackageManager;->getAppOpPermissionPackages(Ljava/lang/String;)[Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getBlockUninstallForUser(Ljava/lang/String;I)Z
-Landroid/content/pm/IPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
-Landroid/content/pm/IPackageManager;->getFlagsForUid(I)I
-Landroid/content/pm/IPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
-Landroid/content/pm/IPackageManager;->getInstalledApplications(II)Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/IPackageManager;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/IPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getInstallLocation()I
-Landroid/content/pm/IPackageManager;->getInstrumentationInfo(Landroid/content/ComponentName;I)Landroid/content/pm/InstrumentationInfo;
-Landroid/content/pm/IPackageManager;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;
-Landroid/content/pm/IPackageManager;->getNameForUid(I)Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
-Landroid/content/pm/IPackageManager;->getPackageInstaller()Landroid/content/pm/IPackageInstaller;
-Landroid/content/pm/IPackageManager;->getPackagesForUid(I)[Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getPackageUid(Ljava/lang/String;II)I
-Landroid/content/pm/IPackageManager;->getPermissionControllerPackageName()Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getPermissionGroupInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionGroupInfo;
-Landroid/content/pm/IPackageManager;->getPreferredActivities(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)I
-Landroid/content/pm/IPackageManager;->getProviderInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ProviderInfo;
-Landroid/content/pm/IPackageManager;->getReceiverInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
-Landroid/content/pm/IPackageManager;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
-Landroid/content/pm/IPackageManager;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getSharedSystemSharedLibraryPackageName()Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getSystemSharedLibraryNames()[Ljava/lang/String;
-Landroid/content/pm/IPackageManager;->getUidForSharedUser(Ljava/lang/String;)I
-Landroid/content/pm/IPackageManager;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;I)V
-Landroid/content/pm/IPackageManager;->hasSystemUidErrors()Z
-Landroid/content/pm/IPackageManager;->isPackageAvailable(Ljava/lang/String;I)Z
-Landroid/content/pm/IPackageManager;->isSafeMode()Z
-Landroid/content/pm/IPackageManager;->isStorageLow()Z
-Landroid/content/pm/IPackageManager;->isUidPrivileged(I)Z
-Landroid/content/pm/IPackageManager;->queryInstrumentation(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/IPackageManager;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/IPackageManager;->querySyncProviders(Ljava/util/List;Ljava/util/List;)V
-Landroid/content/pm/IPackageManager;->removePermission(Ljava/lang/String;)V
-Landroid/content/pm/IPackageManager;->replacePreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
-Landroid/content/pm/IPackageManager;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
-Landroid/content/pm/IPackageManager;->setApplicationEnabledSetting(Ljava/lang/String;IIILjava/lang/String;)V
-Landroid/content/pm/IPackageManager;->setApplicationHiddenSettingAsUser(Ljava/lang/String;ZI)Z
-Landroid/content/pm/IPackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V
-Landroid/content/pm/IPackageManager;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/content/pm/IPackageManager;->setLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/IntentFilter;ILandroid/content/ComponentName;)V
-Landroid/content/pm/IPackageManager;->setPackageStoppedState(Ljava/lang/String;ZI)V
Landroid/content/pm/IPackageMoveObserver$Stub;-><init>()V
Landroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver;
Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
Landroid/content/pm/IPackageStatsObserver$Stub;-><init>()V
Landroid/content/pm/IPackageStatsObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageStatsObserver;
-Landroid/content/pm/IPackageStatsObserver;->onGetStatsCompleted(Landroid/content/pm/PackageStats;Z)V
Landroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IShortcutService;
Landroid/content/res/ConfigurationBoundResourceCache;-><init>()V
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 2e82e620fac8..91df05f35295 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -43,6 +43,8 @@ import android.os.SystemProperties;
import android.os.UserManager;
import android.provider.Settings;
import android.util.ArrayMap;
+import android.util.LongSparseArray;
+import android.util.LongSparseLongArray;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -55,8 +57,10 @@ import com.android.internal.app.IAppOpsService;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
@@ -64,9 +68,11 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* API for interacting with "application operation" tracking.
@@ -227,7 +233,7 @@ public class AppOpsManager {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(flag = true, prefix = { "UID_STATE_" }, value = {
+ @IntDef(prefix = { "UID_STATE_" }, value = {
UID_STATE_PERSISTENT,
UID_STATE_TOP,
UID_STATE_FOREGROUND_SERVICE_LOCATION,
@@ -239,78 +245,322 @@ public class AppOpsManager {
public @interface UidState {}
/**
- * Invalid UID state.
+ * Uid state: The UID is a foreground persistent app.
* @hide
*/
- public static final int UID_STATE_INVALID = -1;
+ @TestApi
+ @SystemApi
+ public static final int UID_STATE_PERSISTENT = 100;
+
+ /**
+ * Uid state: The UID is top foreground app.
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final int UID_STATE_TOP = 200;
+
+ /**
+ * Uid state: The UID is running a foreground service of location type.
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300;
/**
- * Metrics about an op when its uid is persistent.
+ * Uid state: The UID is running a foreground service.
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_PERSISTENT = 0;
+ public static final int UID_STATE_FOREGROUND_SERVICE = 400;
/**
- * Metrics about an op when its uid is at the top.
+ * The max, which is min priority, UID state for which any app op
+ * would be considered as performed in the foreground.
+ * @hide
+ */
+ public static final int UID_STATE_MAX_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE;
+
+ /**
+ * Uid state: The UID is a foreground app.
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_TOP = 1;
+ public static final int UID_STATE_FOREGROUND = 500;
+
+ /**
+ * Uid state: The UID is a background app.
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final int UID_STATE_BACKGROUND = 600;
+
+ /**
+ * Uid state: The UID is a cached app.
+ * @hide
+ */
+ @TestApi
+ @SystemApi
+ public static final int UID_STATE_CACHED = 700;
+
+ /**
+ * Uid state: The UID state with the highest priority.
+ * @hide
+ */
+ public static final int MAX_PRIORITY_UID_STATE = UID_STATE_PERSISTENT;
+
+ /**
+ * Uid state: The UID state with the lowest priority.
+ * @hide
+ */
+ public static final int MIN_PRIORITY_UID_STATE = UID_STATE_CACHED;
+
+ /**
+ * Resolves the first unrestricted state given an app op. Location is
+ * special as we want to allow its access only if a dedicated location
+ * foreground service is running. For other ops we consider any foreground
+ * service as a foreground state.
+ *
+ * @param op The op to resolve.
+ * @return The last restricted UID state.
+ *
+ * @hide
+ */
+ public static int resolveFirstUnrestrictedUidState(int op) {
+ switch (op) {
+ case OP_FINE_LOCATION:
+ case OP_COARSE_LOCATION: {
+ return UID_STATE_FOREGROUND_SERVICE_LOCATION;
+ }
+ }
+ return UID_STATE_FOREGROUND_SERVICE;
+ }
+
+ /**
+ * Resolves the last restricted state given an app op. Location is
+ * special as we want to allow its access only if a dedicated location
+ * foreground service is running. For other ops we consider any foreground
+ * service as a foreground state.
+ *
+ * @param op The op to resolve.
+ * @return The last restricted UID state.
+ *
+ * @hide
+ */
+ public static int resolveLastRestrictedUidState(int op) {
+ switch (op) {
+ case OP_FINE_LOCATION:
+ case OP_COARSE_LOCATION: {
+ return UID_STATE_FOREGROUND_SERVICE;
+ }
+ }
+ return UID_STATE_FOREGROUND;
+ }
+
+ /** @hide Note: Keep these sorted */
+ public static final int[] UID_STATES = {
+ UID_STATE_PERSISTENT,
+ UID_STATE_TOP,
+ UID_STATE_FOREGROUND_SERVICE_LOCATION,
+ UID_STATE_FOREGROUND_SERVICE,
+ UID_STATE_FOREGROUND,
+ UID_STATE_BACKGROUND,
+ UID_STATE_CACHED
+ };
+
+ /** @hide */
+ public static String getUidStateName(@UidState int uidState) {
+ switch (uidState) {
+ case UID_STATE_PERSISTENT:
+ return "pers";
+ case UID_STATE_TOP:
+ return "top";
+ case UID_STATE_FOREGROUND_SERVICE_LOCATION:
+ return "fgsvcl";
+ case UID_STATE_FOREGROUND_SERVICE:
+ return "fgsvc";
+ case UID_STATE_FOREGROUND:
+ return "fg";
+ case UID_STATE_BACKGROUND:
+ return "bg";
+ case UID_STATE_CACHED:
+ return "cch";
+ default:
+ return "unknown";
+ }
+ }
/**
- * Metrics about an op when its uid is running a foreground service with location type.
+ * Flag: non proxy operations. These are operations
+ * performed on behalf of the app itself and not on behalf of
+ * another one.
+ *
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2;
+ public static final int OP_FLAG_SELF = 0x1;
/**
- * Metrics about an op when its uid is running a foreground service.
+ * Flag: trusted proxy operations. These are operations
+ * performed on behalf of another app by a trusted app.
+ * Which is work a trusted app blames on another app.
+ *
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_FOREGROUND_SERVICE = 3;
+ public static final int OP_FLAG_TRUSTED_PROXY = 0x2;
/**
- * Last UID state in which we don't restrict what an op can do.
+ * Flag: untrusted proxy operations. These are operations
+ * performed on behalf of another app by an untrusted app.
+ * Which is work an untrusted app blames on another app.
+ *
* @hide
*/
- public static final int UID_STATE_LAST_NON_RESTRICTED = UID_STATE_FOREGROUND_SERVICE_LOCATION;
+ @TestApi
+ @SystemApi
+ public static final int OP_FLAG_UNTRUSTED_PROXY = 0x4;
/**
- * Metrics about an op when its uid is in the foreground for any other reasons.
+ * Flag: trusted proxied operations. These are operations
+ * performed by a trusted other app on behalf of an app.
+ * Which is work an app was blamed for by a trusted app.
+ *
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_FOREGROUND = 4;
+ public static final int OP_FLAG_TRUSTED_PROXIED = 0x8;
/**
- * Metrics about an op when its uid is in the background for any reason.
+ * Flag: untrusted proxied operations. These are operations
+ * performed by an untrusted other app on behalf of an app.
+ * Which is work an app was blamed for by an untrusted app.
+ *
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_BACKGROUND = 5;
+ public static final int OP_FLAG_UNTRUSTED_PROXIED = 0x10;
/**
- * Metrics about an op when its uid is cached.
+ * Flags: all operations. These include operations matched
+ * by {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}.
+ *
* @hide
*/
@TestApi
@SystemApi
- public static final int UID_STATE_CACHED = 6;
+ public static final int OP_FLAGS_ALL =
+ OP_FLAG_SELF
+ | OP_FLAG_TRUSTED_PROXY
+ | OP_FLAG_UNTRUSTED_PROXY
+ | OP_FLAG_TRUSTED_PROXIED
+ | OP_FLAG_UNTRUSTED_PROXIED;
/**
- * Number of uid states we track.
+ * Flags: all trusted operations which is ones either the app did {@link #OP_FLAG_SELF},
+ * or it was blamed for by a trusted app {@link #OP_FLAG_TRUSTED_PROXIED}, or ones the
+ * app if untrusted blamed on other apps {@link #OP_FLAG_UNTRUSTED_PROXY}.
+ *
* @hide
*/
- public static final int _NUM_UID_STATE = 7;
+ @SystemApi
+ public static final int OP_FLAGS_ALL_TRUSTED = AppOpsManager.OP_FLAG_SELF
+ | AppOpsManager.OP_FLAG_UNTRUSTED_PROXY
+ | AppOpsManager.OP_FLAG_TRUSTED_PROXIED;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, prefix = { "FLAG_" }, value = {
+ OP_FLAG_SELF,
+ OP_FLAG_TRUSTED_PROXY,
+ OP_FLAG_UNTRUSTED_PROXY,
+ OP_FLAG_TRUSTED_PROXIED,
+ OP_FLAG_UNTRUSTED_PROXIED
+ })
+ public @interface OpFlags {}
+
+
+ /** @hide */
+ public static final String getFlagName(@OpFlags int flag) {
+ switch (flag) {
+ case OP_FLAG_SELF:
+ return "s";
+ case OP_FLAG_TRUSTED_PROXY:
+ return "tp";
+ case OP_FLAG_UNTRUSTED_PROXY:
+ return "up";
+ case OP_FLAG_TRUSTED_PROXIED:
+ return "tpd";
+ case OP_FLAG_UNTRUSTED_PROXIED:
+ return "upd";
+ default:
+ return "unknown";
+ }
+ }
+
+ private static final int UID_STATE_OFFSET = 31;
+ private static final int FLAGS_MASK = 0xFFFFFFFF;
+
+ /**
+ * Key for a data bucket storing app op state. The bucket
+ * is composed of the uid state and state flags. This way
+ * we can query data for given uid state and a set of flags where
+ * the flags control which type of data to get. For example,
+ * one can get the ops an app did on behalf of other apps
+ * while in the background.
+ *
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+ public @interface DataBucketKey {
+ }
+
+ /** @hide */
+ public static String keyToString(@DataBucketKey long key) {
+ final int uidState = extractUidStateFromKey(key);
+ final int flags = extractFlagsFromKey(key);
+ return "[" + getUidStateName(uidState) + "-" + flagsToString(flags) + "]";
+ }
+
+ /** @hide */
+ public static @DataBucketKey long makeKey(@UidState int uidState, @OpFlags int flags) {
+ return ((long) uidState << UID_STATE_OFFSET) | flags;
+ }
+
+ /** @hide */
+ public static int extractUidStateFromKey(@DataBucketKey long key) {
+ return (int) (key >> UID_STATE_OFFSET);
+ }
+
+ /** @hide */
+ public static int extractFlagsFromKey(@DataBucketKey long key) {
+ return (int) (key & FLAGS_MASK);
+ }
+
+ /** @hide */
+ public static String flagsToString(@OpFlags int flags) {
+ final StringBuilder flagsBuilder = new StringBuilder();
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ if (flagsBuilder.length() > 0) {
+ flagsBuilder.append('|');
+ }
+ flagsBuilder.append(getFlagName(flag));
+ }
+ return flagsBuilder.toString();
+ }
// when adding one of these:
// - increment _NUM_OP
@@ -551,7 +801,7 @@ public class AppOpsManager {
@UnsupportedAppUsage
public static final int OP_MANAGE_IPSEC_TUNNELS = 75;
/** @hide Any app start foreground service. */
- @UnsupportedAppUsage
+ @TestApi
public static final int OP_START_FOREGROUND = 76;
/** @hide */
@UnsupportedAppUsage
@@ -1947,14 +2197,23 @@ public class AppOpsManager {
mEntries = entries;
}
- public String getPackageName() {
+ /**
+ * @return The name of the package.
+ */
+ public @NonNull String getPackageName() {
return mPackageName;
}
+ /**
+ * @return The uid of the package.
+ */
public int getUid() {
return mUid;
}
+ /**
+ * @return The ops of the package.
+ */
public List<OpEntry> getOps() {
return mEntries;
}
@@ -1999,57 +2258,59 @@ public class AppOpsManager {
* Class holding the information about one unique operation of an application.
* @hide
*/
+ @TestApi
+ @Immutable
@SystemApi
public static final class OpEntry implements Parcelable {
private final int mOp;
- private final @Mode int mMode;
- private final long[] mTimes;
- private final long[] mRejectTimes;
- private final int mDuration;
- private final int mProxyUid;
private final boolean mRunning;
- private final String mProxyPackageName;
+ private final @Mode int mMode;
+ private final @Nullable LongSparseLongArray mAccessTimes;
+ private final @Nullable LongSparseLongArray mRejectTimes;
+ private final @Nullable LongSparseLongArray mDurations;
+ private final @Nullable LongSparseLongArray mProxyUids;
+ private final @Nullable LongSparseArray<String> mProxyPackageNames;
/**
* @hide
*/
- public OpEntry(int op, @Mode int mode, long time, long rejectTime, int duration,
- int proxyUid, String proxyPackage) {
+ public OpEntry(int op, boolean running, @Mode int mode,
+ @Nullable LongSparseLongArray accessTimes, @Nullable LongSparseLongArray rejectTimes,
+ @Nullable LongSparseLongArray durations, @Nullable LongSparseLongArray proxyUids,
+ @Nullable LongSparseArray<String> proxyPackageNames) {
mOp = op;
+ mRunning = running;
mMode = mode;
- mTimes = new long[_NUM_UID_STATE];
- mRejectTimes = new long[_NUM_UID_STATE];
- mTimes[0] = time;
- mRejectTimes[0] = rejectTime;
- mDuration = duration;
- mRunning = duration == -1;
- mProxyUid = proxyUid;
- mProxyPackageName = proxyPackage;
+ mAccessTimes = accessTimes;
+ mRejectTimes = rejectTimes;
+ mDurations = durations;
+ mProxyUids = proxyUids;
+ mProxyPackageNames = proxyPackageNames;
}
/**
* @hide
*/
- public OpEntry(int op, @Mode int mode, long[] times, long[] rejectTimes, int duration,
- boolean running, int proxyUid, String proxyPackage) {
+ public OpEntry(int op, @Mode int mode) {
mOp = op;
mMode = mode;
- mTimes = new long[_NUM_UID_STATE];
- mRejectTimes = new long[_NUM_UID_STATE];
- System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE);
- System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE);
- mDuration = duration;
- mRunning = running;
- mProxyUid = proxyUid;
- mProxyPackageName = proxyPackage;
+ mRunning = false;
+ mAccessTimes = null;
+ mRejectTimes = null;
+ mDurations = null;
+ mProxyUids = null;
+ mProxyPackageNames = null;
}
/**
- * @hide
- */
- public OpEntry(int op, @Mode int mode, long[] times, long[] rejectTimes, int duration,
- int proxyUid, String proxyPackage) {
- this(op, mode, times, rejectTimes, duration, duration == -1, proxyUid, proxyPackage);
+ * Returns all keys for which we have mapped state in any of the data buckets -
+ * access time, reject time, duration.
+ * @hide */
+ public @Nullable LongSparseArray<Object> collectKeys() {
+ LongSparseArray<Object> result = AppOpsManager.collectKeys(mAccessTimes, null);
+ result = AppOpsManager.collectKeys(mRejectTimes, result);
+ result = AppOpsManager.collectKeys(mDurations, result);
+ return result;
}
/**
@@ -2061,14 +2322,14 @@ public class AppOpsManager {
}
/**
- * Return this entry's op string name, such as {@link #OPSTR_COARSE_LOCATION}.
+ * @return This entry's op string name, such as {@link #OPSTR_COARSE_LOCATION}.
*/
- public String getOpStr() {
+ public @NonNull String getOpStr() {
return sOpToString[mOp];
}
/**
- * Return this entry's current mode, such as {@link #MODE_ALLOWED}.
+ * @return this entry's current mode, such as {@link #MODE_ALLOWED}.
*/
public @Mode int getMode() {
return mMode;
@@ -2079,89 +2340,331 @@ public class AppOpsManager {
*/
@UnsupportedAppUsage
public long getTime() {
- return maxTime(mTimes, 0, _NUM_UID_STATE);
+ return getLastAccessTime(OP_FLAGS_ALL);
}
/**
- * Return the last wall clock time this op was accessed by the app.
+ * Return the last wall clock time in milliseconds this op was accessed.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last access time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastAccessForegroundTime(int)
+ * @see #getLastAccessBackgroundTime(int)
+ * @see #getLastAccessTime(int, int, int)
*/
- public long getLastAccessTime() {
- return maxTime(mTimes, 0, _NUM_UID_STATE);
+ public long getLastAccessTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mAccessTimes, MAX_PRIORITY_UID_STATE,
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * Return the last wall clock time this op was accessed by the app while in the foreground.
+ * Return the last wall clock time in milliseconds this op was accessed
+ * by the app while in the foreground.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last foreground access time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastAccessBackgroundTime(int)
+ * @see #getLastAccessTime(int)
+ * @see #getLastAccessTime(int, int, int)
*/
- public long getLastAccessForegroundTime() {
- return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ public long getLastAccessForegroundTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mAccessTimes, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
}
/**
- * Return the last wall clock time this op was accessed by the app while in the background.
+ * Return the last wall clock time in milliseconds this op was accessed
+ * by the app while in the background.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last foreground access time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastAccessForegroundTime(int)
+ * @see #getLastAccessTime(int)
+ * @see #getLastAccessTime(int, int, int)
*/
- public long getLastAccessBackgroundTime() {
- return maxTime(mTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ public long getLastAccessBackgroundTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mAccessTimes, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * @hide
+ * Return the last wall clock time in milliseconds this op was accessed
+ * by the app for a given range of UID states.
+ *
+ * @param fromUidState 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}.
+ * @param toUidState The UID state for which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ *
+ * @return the last foreground access time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastAccessForegroundTime(int)
+ * @see #getLastAccessBackgroundTime(int)
+ * @see #getLastAccessTime(int)
*/
- public long getLastTimeFor(int uidState) {
- return mTimes[uidState];
+ public long getLastAccessTime(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return maxForFlagsInStates(mAccessTimes, fromUidState, toUidState, flags);
}
/**
* @hide
*/
public long getRejectTime() {
- return maxTime(mRejectTimes, 0, _NUM_UID_STATE);
+ return getLastRejectTime(OP_FLAGS_ALL);
}
/**
- * Return the last wall clock time the app made an attempt to access this op but
- * was rejected.
+ * Return the last wall clock time in milliseconds the app made an attempt
+ * to access this op but was rejected.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last reject time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastRejectBackgroundTime(int)
+ * @see #getLastRejectForegroundTime(int)
+ * @see #getLastRejectTime(int, int, int)
*/
- public long getLastRejectTime() {
- return maxTime(mRejectTimes, 0, _NUM_UID_STATE);
+ public long getLastRejectTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mRejectTimes, MAX_PRIORITY_UID_STATE,
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * Return the last wall clock time the app made an attempt to access this op while in
- * the foreground but was rejected.
+ * Return the last wall clock time in milliseconds the app made an attempt
+ * to access this op while in the foreground but was rejected.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last foreground reject time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastRejectBackgroundTime(int)
+ * @see #getLastRejectTime(int, int, int)
+ * @see #getLastRejectTime(int)
*/
- public long getLastRejectForegroundTime() {
- return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ public long getLastRejectForegroundTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mRejectTimes, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
}
/**
- * Return the last wall clock time the app made an attempt to access this op while in
- * the background but was rejected.
+ * Return the last wall clock time in milliseconds the app made an attempt
+ * to access this op while in the background but was rejected.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last background reject time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastRejectForegroundTime(int)
+ * @see #getLastRejectTime(int, int, int)
+ * @see #getLastRejectTime(int)
*/
- public long getLastRejectBackgroundTime() {
- return maxTime(mRejectTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ public long getLastRejectBackgroundTime(@OpFlags int flags) {
+ return maxForFlagsInStates(mRejectTimes, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * @hide
+ * Return the last wall clock time state in milliseconds the app made an
+ * attempt to access this op for a given range of UID states.
+ *
+ * @param fromUidState The UID state from 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}.
+ * @param toUidState The UID state to which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the last foreground access time in milliseconds since
+ * epoch start (January 1, 1970 00:00:00.000 GMT - Gregorian).
+ *
+ * @see #getLastRejectForegroundTime(int)
+ * @see #getLastRejectBackgroundTime(int)
+ * @see #getLastRejectTime(int)
*/
- public long getLastRejectTimeFor(int uidState) {
- return mRejectTimes[uidState];
+ public long getLastRejectTime(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return maxForFlagsInStates(mRejectTimes, fromUidState, toUidState, flags);
}
+ /**
+ * @return Whether the operation is running.
+ */
public boolean isRunning() {
return mRunning;
}
- public int getDuration() {
- return mDuration;
+ /**
+ * @return The duration of the operation in milliseconds.
+ */
+ public long getDuration() {
+ return getLastDuration(MAX_PRIORITY_UID_STATE, MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL);
+ }
+
+ /**
+ * Return the duration in milliseconds the app accessed this op while
+ * in the foreground.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the foreground access duration in milliseconds.
+ *
+ * @see #getLastBackgroundDuration(int)
+ * @see #getLastDuration(int, int, int)
+ */
+ public long getLastForegroundDuration(@OpFlags int flags) {
+ return sumForFlagsInStates(mDurations, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
+ }
+
+ /**
+ * Return the duration in milliseconds the app accessed this op while
+ * in the background.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the background access duration in milliseconds.
+ *
+ * @see #getLastForegroundDuration(int)
+ * @see #getLastDuration(int, int, int)
+ */
+ public long getLastBackgroundDuration(@OpFlags int flags) {
+ return sumForFlagsInStates(mDurations, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
+ /**
+ * Return the duration in milliseconds the app accessed this op for
+ * a given range of UID states.
+ *
+ * @param fromUidState 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}.
+ * @param toUidState The UID state for which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return the access duration in milliseconds.
+ */
+ public long getLastDuration(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return sumForFlagsInStates(mDurations, fromUidState, toUidState, flags);
+ }
+
+ /**
+ * Gets the UID of the app that performed the op on behalf of this app and
+ * as a result blamed the op on this app or {@link Process#INVALID_UID} if
+ * there is no proxy.
+ *
+ * @return The proxy UID.
+ */
public int getProxyUid() {
- return mProxyUid;
+ return (int) findFirstNonNegativeForFlagsInStates(mDurations,
+ MAX_PRIORITY_UID_STATE, MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL);
}
- public String getProxyPackageName() {
- return mProxyPackageName;
+ /**
+ * Gets the UID of the app that performed the op on behalf of this app and
+ * as a result blamed the op on this app or {@link Process#INVALID_UID} if
+ * there is no proxy.
+ *
+ * @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}.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ *
+ * @return The proxy UID.
+ */
+ public int getProxyUid(@UidState int uidState, @OpFlags int flags) {
+ return (int) findFirstNonNegativeForFlagsInStates(mDurations,
+ uidState, uidState, flags);
+ }
+
+ /**
+ * Gets the package name of the app that performed the op on behalf of this
+ * app and as a result blamed the op on this app or {@code null}
+ * if there is no proxy.
+ *
+ * @return The proxy package name.
+ */
+ public @Nullable String getProxyPackageName() {
+ return findFirstNonNullForFlagsInStates(mProxyPackageNames, MAX_PRIORITY_UID_STATE,
+ MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL);
+ }
+
+ /**
+ * Gets the package name of the app that performed the op on behalf of this
+ * app and as a result blamed the op on this app for a UID state or
+ * {@code null} if there is no proxy.
+ *
+ * @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}.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return The proxy package name.
+ */
+ public @Nullable String getProxyPackageName(@UidState int uidState, @OpFlags int flags) {
+ return findFirstNonNullForFlagsInStates(mProxyPackageNames, uidState, uidState, flags);
}
@Override
@@ -2173,23 +2676,23 @@ public class AppOpsManager {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mOp);
dest.writeInt(mMode);
- dest.writeLongArray(mTimes);
- dest.writeLongArray(mRejectTimes);
- dest.writeInt(mDuration);
dest.writeBoolean(mRunning);
- dest.writeInt(mProxyUid);
- dest.writeString(mProxyPackageName);
+ writeLongSparseLongArrayToParcel(mAccessTimes, dest);
+ writeLongSparseLongArrayToParcel(mRejectTimes, dest);
+ writeLongSparseLongArrayToParcel(mDurations, dest);
+ writeLongSparseLongArrayToParcel(mProxyUids, dest);
+ writeLongSparseStringArrayToParcel(mProxyPackageNames, dest);
}
OpEntry(Parcel source) {
mOp = source.readInt();
mMode = source.readInt();
- mTimes = source.createLongArray();
- mRejectTimes = source.createLongArray();
- mDuration = source.readInt();
mRunning = source.readBoolean();
- mProxyUid = source.readInt();
- mProxyPackageName = source.readString();
+ mAccessTimes = readLongSparseLongArrayFromParcel(source);
+ mRejectTimes = readLongSparseLongArrayFromParcel(source);
+ mDurations = readLongSparseLongArrayFromParcel(source);
+ mProxyUids = readLongSparseLongArrayFromParcel(source);
+ mProxyPackageNames = readLongSparseStringArrayFromParcel(source);
}
public static final @android.annotation.NonNull Creator<OpEntry> CREATOR = new Creator<OpEntry>() {
@@ -2226,14 +2729,17 @@ public class AppOpsManager {
private final @Nullable List<String> mOpNames;
private final long mBeginTimeMillis;
private final long mEndTimeMillis;
+ private final @OpFlags int mFlags;
private HistoricalOpsRequest(int uid, @Nullable String packageName,
- @Nullable List<String> opNames, long beginTimeMillis, long endTimeMillis) {
+ @Nullable List<String> opNames, long beginTimeMillis, long endTimeMillis,
+ @OpFlags int flags) {
mUid = uid;
mPackageName = packageName;
mOpNames = opNames;
mBeginTimeMillis = beginTimeMillis;
mEndTimeMillis = endTimeMillis;
+ mFlags = flags;
}
/**
@@ -2249,6 +2755,7 @@ public class AppOpsManager {
private @Nullable List<String> mOpNames;
private final long mBeginTimeMillis;
private final long mEndTimeMillis;
+ private @OpFlags int mFlags = OP_FLAGS_ALL;
/**
* Creates a new builder.
@@ -2311,11 +2818,28 @@ public class AppOpsManager {
}
/**
+ * Sets the op flags to query for. The flags specify the type of
+ * op data being queried.
+ *
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
+ * @return This builder.
+ */
+ public @NonNull Builder setFlags(@OpFlags int flags) {
+ Preconditions.checkFlagsArgument(flags, OP_FLAGS_ALL);
+ mFlags = flags;
+ return this;
+ }
+
+ /**
* @return a new {@link HistoricalOpsRequest}.
*/
public @NonNull HistoricalOpsRequest build() {
return new HistoricalOpsRequest(mUid, mPackageName, mOpNames,
- mBeginTimeMillis, mEndTimeMillis);
+ mBeginTimeMillis, mEndTimeMillis, mFlags);
}
}
}
@@ -2521,25 +3045,25 @@ public class AppOpsManager {
/** @hide */
@TestApi
public void increaseAccessCount(int opCode, int uid, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalUidOps(uid).increaseAccessCount(opCode,
- packageName, uidState, increment);
+ packageName, uidState, flags, increment);
}
/** @hide */
@TestApi
public void increaseRejectCount(int opCode, int uid, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalUidOps(uid).increaseRejectCount(opCode,
- packageName, uidState, increment);
+ packageName, uidState, flags, increment);
}
/** @hide */
@TestApi
public void increaseAccessDuration(int opCode, int uid, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalUidOps(uid).increaseAccessDuration(opCode,
- packageName, uidState, increment);
+ packageName, uidState, flags, increment);
}
/** @hide */
@@ -2834,21 +3358,21 @@ public class AppOpsManager {
}
private void increaseAccessCount(int opCode, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalPackageOps(packageName).increaseAccessCount(
- opCode, uidState, increment);
+ opCode, uidState, flags, increment);
}
private void increaseRejectCount(int opCode, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalPackageOps(packageName).increaseRejectCount(
- opCode, uidState, increment);
+ opCode, uidState, flags, increment);
}
private void increaseAccessDuration(int opCode, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
getOrCreateHistoricalPackageOps(packageName).increaseAccessDuration(
- opCode, uidState, increment);
+ opCode, uidState, flags, increment);
}
/**
@@ -3070,16 +3594,19 @@ public class AppOpsManager {
return true;
}
- private void increaseAccessCount(int opCode, @UidState int uidState, long increment) {
- getOrCreateHistoricalOp(opCode).increaseAccessCount(uidState, increment);
+ private void increaseAccessCount(int opCode, @UidState int uidState,
+ @OpFlags int flags, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseAccessCount(uidState, flags, increment);
}
- private void increaseRejectCount(int opCode, @UidState int uidState, long increment) {
- getOrCreateHistoricalOp(opCode).increaseRejectCount(uidState, increment);
+ private void increaseRejectCount(int opCode, @UidState int uidState,
+ @OpFlags int flags, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseRejectCount(uidState, flags, increment);
}
- private void increaseAccessDuration(int opCode, @UidState int uidState, long increment) {
- getOrCreateHistoricalOp(opCode).increaseAccessDuration(uidState, increment);
+ private void increaseAccessDuration(int opCode, @UidState int uidState,
+ @OpFlags int flags, long increment) {
+ getOrCreateHistoricalOp(opCode).increaseAccessDuration(uidState, flags, increment);
}
/**
@@ -3095,7 +3622,6 @@ public class AppOpsManager {
* Gets number historical app ops.
*
* @return The number historical app ops.
- *
* @see #getOpAt(int)
*/
public int getOpCount() {
@@ -3109,9 +3635,7 @@ public class AppOpsManager {
* Gets the historical op at a given index.
*
* @param index The index to lookup.
- *
* @return The op at the given index.
- *
* @see #getOpCount()
*/
public @NonNull HistoricalOp getOpAt(int index) {
@@ -3125,7 +3649,6 @@ public class AppOpsManager {
* Gets the historical entry for a given op name.
*
* @param opName The op name.
- *
* @return The historical entry for that op name.
*/
public @Nullable HistoricalOp getOp(@NonNull String opName) {
@@ -3219,39 +3742,33 @@ public class AppOpsManager {
@SystemApi
public static final class HistoricalOp implements Parcelable {
private final int mOp;
- private @Nullable long[] mAccessCount;
- private @Nullable long[] mRejectCount;
- private @Nullable long[] mAccessDuration;
+ private @Nullable LongSparseLongArray mAccessCount;
+ private @Nullable LongSparseLongArray mRejectCount;
+ private @Nullable LongSparseLongArray mAccessDuration;
/** @hide */
public HistoricalOp(int op) {
mOp = op;
- mAccessCount = new long[_NUM_UID_STATE];
- mRejectCount = new long[_NUM_UID_STATE];
- mAccessDuration = new long[_NUM_UID_STATE];
}
private HistoricalOp(@NonNull HistoricalOp other) {
mOp = other.mOp;
if (other.mAccessCount != null) {
- System.arraycopy(other.mAccessCount, 0, getOrCreateAccessCount(),
- 0, other.mAccessCount.length);
+ mAccessCount = other.mAccessCount.clone();
}
if (other.mRejectCount != null) {
- System.arraycopy(other.mRejectCount, 0, getOrCreateRejectCount(),
- 0, other.mRejectCount.length);
+ mRejectCount = other.mRejectCount.clone();
}
if (other.mAccessDuration != null) {
- System.arraycopy(other.mAccessDuration, 0, getOrCreateAccessDuration(),
- 0, other.mAccessDuration.length);
+ mAccessDuration = other.mAccessDuration.clone();
}
}
private HistoricalOp(@NonNull Parcel parcel) {
mOp = parcel.readInt();
- mAccessCount = parcel.createLongArray();
- mRejectCount = parcel.createLongArray();
- mAccessDuration = parcel.createLongArray();
+ mAccessCount = readLongSparseLongArrayFromParcel(parcel);
+ mRejectCount = readLongSparseLongArrayFromParcel(parcel);
+ mAccessDuration = readLongSparseLongArrayFromParcel(parcel);
}
private void filter(double scaleFactor) {
@@ -3266,90 +3783,64 @@ public class AppOpsManager {
&& !hasData(mAccessDuration);
}
- private boolean hasData(@NonNull long[] array) {
- for (long value : array) {
- if (value != 0) {
- return true;
- }
- }
- return false;
+ private boolean hasData(@NonNull LongSparseLongArray array) {
+ return (array != null && array.size() > 0);
}
private @Nullable HistoricalOp splice(double fractionToRemove) {
- HistoricalOp splice = null;
- if (mAccessCount != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- final long spliceAccessCount = Math.round(
- mAccessCount[i] * fractionToRemove);
- if (spliceAccessCount > 0) {
- if (splice == null) {
- splice = new HistoricalOp(mOp);
- }
- splice.getOrCreateAccessCount()[i] = spliceAccessCount;
- mAccessCount[i] -= spliceAccessCount;
- }
- }
- }
-
- if (mRejectCount != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- final long spliceRejectCount = Math.round(
- mRejectCount[i] * fractionToRemove);
-
- if (spliceRejectCount > 0) {
- if (splice == null) {
- splice = new HistoricalOp(mOp);
- }
- splice.getOrCreateRejectCount()[i] = spliceRejectCount;
- mRejectCount[i] -= spliceRejectCount;
- }
- }
- }
+ final HistoricalOp splice = new HistoricalOp(mOp);
+ splice(mAccessCount, splice::getOrCreateAccessCount, fractionToRemove);
+ splice(mRejectCount, splice::getOrCreateRejectCount, fractionToRemove);
+ splice(mAccessDuration, splice::getOrCreateAccessDuration, fractionToRemove);
+ return splice;
+ }
- if (mAccessDuration != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- final long spliceAccessDuration = Math.round(
- mAccessDuration[i] * fractionToRemove);
- if (spliceAccessDuration > 0) {
- if (splice == null) {
- splice = new HistoricalOp(mOp);
- }
- splice.getOrCreateAccessDuration()[i] = spliceAccessDuration;
- mAccessDuration[i] -= spliceAccessDuration;
+ private static void splice(@Nullable LongSparseLongArray sourceContainer,
+ @NonNull Supplier<LongSparseLongArray> destContainerProvider,
+ double fractionToRemove) {
+ if (sourceContainer != null) {
+ final int size = sourceContainer.size();
+ for (int i = 0; i < size; i++) {
+ final long key = sourceContainer.keyAt(i);
+ final long value = sourceContainer.valueAt(i);
+ final long removedFraction = Math.round(value * fractionToRemove);
+ if (removedFraction > 0) {
+ destContainerProvider.get().put(key, removedFraction);
+ sourceContainer.put(key, value - removedFraction);
}
}
}
- return splice;
}
private void merge(@NonNull HistoricalOp other) {
- if (other.mAccessCount != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- getOrCreateAccessCount()[i] += other.mAccessCount[i];
- }
- }
- if (other.mRejectCount != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- getOrCreateRejectCount()[i] += other.mRejectCount[i];
- }
- }
- if (other.mAccessDuration != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- getOrCreateAccessDuration()[i] += other.mAccessDuration[i];
- }
- }
+ merge(this::getOrCreateAccessCount, other.mAccessCount);
+ merge(this::getOrCreateRejectCount, other.mRejectCount);
+ merge(this::getOrCreateAccessDuration, other.mAccessDuration);
+ }
+
+ private void increaseAccessCount(@UidState int uidState, @OpFlags int flags,
+ long increment) {
+ increaseCount(getOrCreateAccessCount(), uidState, flags, increment);
}
- private void increaseAccessCount(@UidState int uidState, long increment) {
- getOrCreateAccessCount()[uidState] += increment;
+ private void increaseRejectCount(@UidState int uidState, @OpFlags int flags,
+ long increment) {
+ increaseCount(getOrCreateRejectCount(), uidState, flags, increment);
}
- private void increaseRejectCount(@UidState int uidState, long increment) {
- getOrCreateRejectCount()[uidState] += increment;
+ private void increaseAccessDuration(@UidState int uidState, @OpFlags int flags,
+ long increment) {
+ increaseCount(getOrCreateAccessDuration(), uidState, flags, increment);
}
- private void increaseAccessDuration(@UidState int uidState, long increment) {
- getOrCreateAccessDuration()[uidState] += increment;
+ private void increaseCount(@NonNull LongSparseLongArray counts,
+ @UidState int uidState, @OpFlags int flags, long increment) {
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ final long key = makeKey(uidState, flag);
+ counts.put(key, counts.get(key) + increment);
+ }
}
/**
@@ -3369,154 +3860,186 @@ public class AppOpsManager {
/**
* Gets the number times the op was accessed (performed) in the foreground.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The times the op was accessed in the foreground.
*
- * @see #getBackgroundAccessCount()
- * @see #getAccessCount(int)
+ * @see #getBackgroundAccessCount(int)
+ * @see #getAccessCount(int, int, int)
*/
- public long getForegroundAccessCount() {
- if (mAccessCount == null) {
- return 0;
- }
- return sum(mAccessCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ public long getForegroundAccessCount(@OpFlags int flags) {
+ return sumForFlagsInStates(mAccessCount, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
}
/**
* Gets the number times the op was accessed (performed) in the background.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The times the op was accessed in the background.
*
- * @see #getForegroundAccessCount()
- * @see #getAccessCount(int)
+ * @see #getForegroundAccessCount(int)
+ * @see #getAccessCount(int, int, int)
*/
- public long getBackgroundAccessCount() {
- if (mAccessCount == null) {
- return 0;
- }
- return sum(mAccessCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ public long getBackgroundAccessCount(@OpFlags int flags) {
+ return sumForFlagsInStates(mAccessCount, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * Gets the number times the op was accessed (performed) for a given uid state.
+ * Gets the number times the op was accessed (performed) for a
+ * range of uid states.
*
- * @param uidState The UID state for which to query. Could be one of
+ * @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
* {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ * @param toUidState The UID state to which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
*
* @return The times the op was accessed for the given UID state.
*
- * @see #getForegroundAccessCount()
- * @see #getBackgroundAccessCount()
+ * @see #getForegroundAccessCount(int)
+ * @see #getBackgroundAccessCount(int)
*/
- public long getAccessCount(@UidState int uidState) {
- if (mAccessCount == null) {
- return 0;
- }
- return mAccessCount[uidState];
+ public long getAccessCount(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return sumForFlagsInStates(mAccessCount, fromUidState, toUidState, flags);
}
/**
* Gets the number times the op was rejected in the foreground.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The times the op was rejected in the foreground.
*
- * @see #getBackgroundRejectCount()
- * @see #getRejectCount(int)
+ * @see #getBackgroundRejectCount(int)
+ * @see #getRejectCount(int, int, int)
*/
- public long getForegroundRejectCount() {
- if (mRejectCount == null) {
- return 0;
- }
- return sum(mRejectCount, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ public long getForegroundRejectCount(@OpFlags int flags) {
+ return sumForFlagsInStates(mRejectCount, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
}
/**
* Gets the number times the op was rejected in the background.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The times the op was rejected in the background.
*
- * @see #getForegroundRejectCount()
- * @see #getRejectCount(int)
+ * @see #getForegroundRejectCount(int)
+ * @see #getRejectCount(int, int, int)
*/
- public long getBackgroundRejectCount() {
- if (mRejectCount == null) {
- return 0;
- }
- return sum(mRejectCount, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ public long getBackgroundRejectCount(@OpFlags int flags) {
+ return sumForFlagsInStates(mRejectCount, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * Gets the number times the op was rejected for a given uid state.
+ * Gets the number times the op was rejected for a given range of UID states.
*
- * @param uidState The UID state for which to query. Could be one of
+ * @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
* {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ * @param toUidState The UID state to which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
*
* @return The times the op was rejected for the given UID state.
*
- * @see #getForegroundRejectCount()
- * @see #getBackgroundRejectCount()
+ * @see #getForegroundRejectCount(int)
+ * @see #getBackgroundRejectCount(int)
*/
- public long getRejectCount(@UidState int uidState) {
- if (mRejectCount == null) {
- return 0;
- }
- return mRejectCount[uidState];
+ public long getRejectCount(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return sumForFlagsInStates(mRejectCount, fromUidState, toUidState, flags);
}
/**
* Gets the total duration the app op was accessed (performed) in the foreground.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The total duration the app op was accessed in the foreground.
*
- * @see #getBackgroundAccessDuration()
- * @see #getAccessDuration(int)
+ * @see #getBackgroundAccessDuration(int)
+ * @see #getAccessDuration(int, int, int)
*/
- public long getForegroundAccessDuration() {
- if (mAccessDuration == null) {
- return 0;
- }
- return sum(mAccessDuration, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
+ public long getForegroundAccessDuration(@OpFlags int flags) {
+ return sumForFlagsInStates(mAccessDuration, MAX_PRIORITY_UID_STATE,
+ resolveFirstUnrestrictedUidState(mOp), flags);
}
/**
* Gets the total duration the app op was accessed (performed) in the background.
*
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
* @return The total duration the app op was accessed in the background.
*
- * @see #getForegroundAccessDuration()
- * @see #getAccessDuration(int)
+ * @see #getForegroundAccessDuration(int)
+ * @see #getAccessDuration(int, int, int)
*/
- public long getBackgroundAccessDuration() {
- if (mAccessDuration == null) {
- return 0;
- }
- return sum(mAccessDuration, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
+ public long getBackgroundAccessDuration(@OpFlags int flags) {
+ return sumForFlagsInStates(mAccessDuration, resolveLastRestrictedUidState(mOp),
+ MIN_PRIORITY_UID_STATE, flags);
}
/**
- * Gets the total duration the app op was accessed (performed) for a given UID state.
+ * Gets the total duration the app op was accessed (performed) for a given
+ * range of UID states.
*
- * @param uidState The UID state for which to query. Could be one of
+ * @param fromUidState The UID state from which to query. Could be one of
* {@link #UID_STATE_PERSISTENT}, {@link #UID_STATE_TOP},
* {@link #UID_STATE_FOREGROUND_SERVICE_LOCATION},
* {@link #UID_STATE_FOREGROUND_SERVICE}, {@link #UID_STATE_FOREGROUND},
* {@link #UID_STATE_BACKGROUND}, {@link #UID_STATE_CACHED}.
+ * @param toUidState The UID state from which to query.
+ * @param flags The flags which are any combination of
+ * {@link #OP_FLAG_SELF}, {@link #OP_FLAG_TRUSTED_PROXY},
+ * {@link #OP_FLAG_UNTRUSTED_PROXY}, {@link #OP_FLAG_TRUSTED_PROXIED},
+ * {@link #OP_FLAG_UNTRUSTED_PROXIED}. You can use {@link #OP_FLAGS_ALL}
+ * for any flag.
*
* @return The total duration the app op was accessed for the given UID state.
*
- * @see #getForegroundAccessDuration()
- * @see #getBackgroundAccessDuration()
+ * @see #getForegroundAccessDuration(int)
+ * @see #getBackgroundAccessDuration(int)
*/
- public long getAccessDuration(@UidState int uidState) {
- if (mAccessDuration == null) {
- return 0;
- }
- return mAccessDuration[uidState];
+ public long getAccessDuration(@UidState int fromUidState, @UidState int toUidState,
+ @OpFlags int flags) {
+ return sumForFlagsInStates(mAccessDuration, fromUidState, toUidState, flags);
}
@Override
@@ -3527,69 +4050,113 @@ public class AppOpsManager {
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mOp);
- parcel.writeLongArray(mAccessCount);
- parcel.writeLongArray(mRejectCount);
- parcel.writeLongArray(mAccessDuration);
+ writeLongSparseLongArrayToParcel(mAccessCount, parcel);
+ writeLongSparseLongArrayToParcel(mRejectCount, parcel);
+ writeLongSparseLongArrayToParcel(mAccessDuration, parcel);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final HistoricalOp other = (HistoricalOp) obj;
+ if (mOp != other.mOp) {
+ return false;
+ }
+ if (!Objects.equals(mAccessCount, other.mAccessCount)) {
+ return false;
+ }
+ if (!Objects.equals(mRejectCount, other.mRejectCount)) {
+ return false;
+ }
+ return Objects.equals(mAccessDuration, other.mAccessDuration);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mOp;
+ result = 31 * result + Objects.hashCode(mAccessCount);
+ result = 31 * result + Objects.hashCode(mRejectCount);
+ result = 31 * result + Objects.hashCode(mAccessDuration);
+ return result;
}
private void accept(@NonNull HistoricalOpsVisitor visitor) {
visitor.visitHistoricalOp(this);
}
- private @NonNull long[] getOrCreateAccessCount() {
+ private @NonNull LongSparseLongArray getOrCreateAccessCount() {
if (mAccessCount == null) {
- mAccessCount = new long[_NUM_UID_STATE];
+ mAccessCount = new LongSparseLongArray();
}
return mAccessCount;
}
- private @NonNull long[] getOrCreateRejectCount() {
+ private @NonNull LongSparseLongArray getOrCreateRejectCount() {
if (mRejectCount == null) {
- mRejectCount = new long[_NUM_UID_STATE];
+ mRejectCount = new LongSparseLongArray();
}
return mRejectCount;
}
- private @NonNull long[] getOrCreateAccessDuration() {
+ private @NonNull LongSparseLongArray getOrCreateAccessDuration() {
if (mAccessDuration == null) {
- mAccessDuration = new long[_NUM_UID_STATE];
+ mAccessDuration = new LongSparseLongArray();
}
return mAccessDuration;
}
/**
+ * Multiplies the entries in the array with the passed in scale factor and
+ * rounds the result at up 0.5 boundary.
*
- * 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.
+ * @param data The data to scale.
+ * @param scaleFactor The scale factor.
*/
- private static long sum(@NonNull long[] counts, int start, int end) {
- long totalCount = 0;
- for (int i = start; i < end; i++) {
- totalCount += counts[i];
+ private static void scale(@NonNull LongSparseLongArray data, double scaleFactor) {
+ if (data != null) {
+ final int size = data.size();
+ for (int i = 0; i < size; i++) {
+ data.put(data.keyAt(i), (long) HistoricalOps.round(
+ (double) data.valueAt(i) * scaleFactor));
+ }
}
- return totalCount;
}
/**
- * Multiplies the entries in the array with the passed in scale factor and
- * rounds the result at up 0.5 boundary.
+ * Merges two arrays while lazily acquiring the destination.
*
- * @param data The data to scale.
- * @param scaleFactor The scale factor.
+ * @param thisSupplier The destination supplier.
+ * @param other The array to merge in.
*/
- private static void scale(@NonNull long[] data, double scaleFactor) {
- if (data != null) {
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- data[i] = (long) HistoricalOps.round((double) data[i] * scaleFactor);
+ private static void merge(@NonNull Supplier<LongSparseLongArray> thisSupplier,
+ @Nullable LongSparseLongArray other) {
+ if (other != null) {
+ final int otherSize = other.size();
+ for (int i = 0; i < otherSize; i++) {
+ final LongSparseLongArray that = thisSupplier.get();
+ final long otherKey = other.keyAt(i);
+ final long otherValue = other.valueAt(i);
+ that.put(otherKey, that.get(otherKey) + otherValue);
}
}
}
- public static final @android.annotation.NonNull Creator<HistoricalOp> CREATOR = new Creator<HistoricalOp>() {
+ /** @hide */
+ public @Nullable LongSparseArray<Object> collectKeys() {
+ LongSparseArray<Object> result = AppOpsManager.collectKeys(mAccessCount,
+ null /*result*/);
+ result = AppOpsManager.collectKeys(mRejectCount, result);
+ result = AppOpsManager.collectKeys(mAccessDuration, result);
+ return result;
+ }
+
+ public static final @android.annotation.NonNull Creator<HistoricalOp> CREATOR =
+ new Creator<HistoricalOp>() {
@Override
public @NonNull HistoricalOp createFromParcel(@NonNull Parcel source) {
return new HistoricalOp(source);
@@ -3600,36 +4167,101 @@ public class AppOpsManager {
return new HistoricalOp[size];
}
};
+ }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null || getClass() != obj.getClass()) {
- return false;
- }
- final HistoricalOp other = (HistoricalOp) obj;
- if (mOp != other.mOp) {
- return false;
- }
- if (!Arrays.equals(mAccessCount, other.mAccessCount)) {
- return false;
+ /**
+ * Computes the sum of the counts for the given flags in between the begin and
+ * end UID states.
+ *
+ * @param counts The data array.
+ * @param beginUidState The beginning UID state (exclusive).
+ * @param endUidState The end UID state.
+ * @param flags The UID flags.
+ * @return The sum.
+ */
+ private static long sumForFlagsInStates(@Nullable LongSparseLongArray counts,
+ @UidState int beginUidState, @UidState int endUidState, @OpFlags int flags) {
+ if (counts == null) {
+ return 0;
+ }
+ long sum = 0;
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ for (int uidState : UID_STATES) {
+ if (uidState < beginUidState || uidState > endUidState) {
+ continue;
+ }
+ final long key = makeKey(uidState, flag);
+ sum += counts.get(key);
}
- if (!Arrays.equals(mRejectCount, other.mRejectCount)) {
- return false;
+ }
+ return sum;
+ }
+
+ /**
+ * Finds the first non-negative value for the given flags in between the begin and
+ * end UID states.
+ *
+ * @param counts The data array.
+ * @param flags The UID flags.
+ * @param beginUidState The beginning UID state (exclusive).
+ * @param endUidState The end UID state.
+ * @return The non-negative value or -1.
+ */
+ private static long findFirstNonNegativeForFlagsInStates(@Nullable LongSparseLongArray counts,
+ @OpFlags int flags, @UidState int beginUidState, @UidState int endUidState) {
+ if (counts == null) {
+ return -1;
+ }
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ for (int uidState : UID_STATES) {
+ if (uidState < beginUidState || uidState > endUidState) {
+ continue;
+ }
+ final long key = makeKey(uidState, flag);
+ final long value = counts.get(key);
+ if (value >= 0) {
+ return value;
+ }
}
- return Arrays.equals(mAccessDuration, other.mAccessDuration);
}
+ return -1;
+ }
- @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;
+ /**
+ * Finds the first non-null value for the given flags in between the begin and
+ * end UID states.
+ *
+ * @param counts The data array.
+ * @param flags The UID flags.
+ * @param beginUidState The beginning UID state (exclusive).
+ * @param endUidState The end UID state.
+ * @return The non-negative value or -1.
+ */
+ private static @Nullable String findFirstNonNullForFlagsInStates(
+ @Nullable LongSparseArray<String> counts, @OpFlags int flags,
+ @UidState int beginUidState, @UidState int endUidState) {
+ if (counts == null) {
+ return null;
}
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ for (int uidState : UID_STATES) {
+ if (uidState < beginUidState || uidState > endUidState) {
+ continue;
+ }
+ final long key = makeKey(uidState, flag);
+ final String value = counts.get(key);
+ if (value != null) {
+ return value;
+ }
+ }
+ }
+ return null;
}
/**
@@ -3800,7 +4432,7 @@ public class AppOpsManager {
Preconditions.checkNotNull(callback, "callback cannot be null");
try {
mService.getHistoricalOps(request.mUid, request.mPackageName, request.mOpNames,
- request.mBeginTimeMillis, request.mEndTimeMillis,
+ request.mBeginTimeMillis, request.mEndTimeMillis, request.mFlags,
new RemoteCallback((result) -> {
final HistoricalOps ops = result.getParcelable(KEY_HISTORICAL_OPS);
final long identity = Binder.clearCallingIdentity();
@@ -3840,7 +4472,7 @@ public class AppOpsManager {
try {
mService.getHistoricalOpsFromDiskRaw(request.mUid, request.mPackageName,
request.mOpNames, request.mBeginTimeMillis, request.mEndTimeMillis,
- new RemoteCallback((result) -> {
+ request.mFlags, new RemoteCallback((result) -> {
final HistoricalOps ops = result.getParcelable(KEY_HISTORICAL_OPS);
final long identity = Binder.clearCallingIdentity();
try {
@@ -4310,7 +4942,20 @@ public class AppOpsManager {
* Like {@link #checkOp} but returns the <em>raw</em> mode associated with the op.
* Does not throw a security exception, does not translate {@link #MODE_FOREGROUND}.
*/
- public int unsafeCheckOpRaw(String op, int uid, String packageName) {
+ public int unsafeCheckOpRaw(@NonNull String op, int uid, String packageName) {
+ try {
+ return mService.checkOperationRaw(strOpToOp(op), uid, packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Like {@link #unsafeCheckOpNoThrow(String, int, String)} but returns the <em>raw</em>
+ * mode associated with the op. Does not throw a security exception, does not translate
+ * {@link #MODE_FOREGROUND}.
+ */
+ public int unsafeCheckOpRawNoThrow(@NonNull String op, int uid, @NonNull String packageName) {
try {
return mService.checkOperationRaw(strOpToOp(op), uid, packageName);
} catch (RemoteException e) {
@@ -4375,8 +5020,7 @@ public class AppOpsManager {
}
/**
- * Like {@link #noteProxyOp(String, String)} but instead
- * of throwing a {@link SecurityException} it returns {@link #MODE_ERRORED}.
+ * Like {@link #noteProxyOpNoThrow(String, String)} but allows to specify the proxied uid.
*
* <p>This API requires package with the {@code proxiedPackageName} to belong to
* {@code proxiedUid}.
@@ -4385,10 +5029,7 @@ public class AppOpsManager {
* @param proxiedPackageName The package to note the op for or {@code null} if the op should be
* noted for the "android" package
* @param proxiedUid The uid the package belongs to
- *
- * @hide
*/
- @SystemApi
public int noteProxyOpNoThrow(@NonNull String op, @Nullable String proxiedPackageName,
int proxiedUid) {
return noteProxyOpNoThrow(strOpToOp(op), proxiedPackageName, proxiedUid);
@@ -4903,16 +5544,110 @@ public class AppOpsManager {
}
/**
- * @hide
+ * Computes the max for the given flags in between the begin and
+ * end UID states.
+ *
+ * @param counts The data array.
+ * @param flags The UID flags.
+ * @param beginUidState The beginning UID state (exclusive).
+ * @param endUidState The end UID state.
+ * @return The sum.
+ */
+ private static long maxForFlagsInStates(@Nullable LongSparseLongArray counts,
+ @UidState int beginUidState, @UidState int endUidState,
+ @OpFlags int flags) {
+ if (counts == null) {
+ return 0;
+ }
+ long max = 0;
+ while (flags != 0) {
+ final int flag = 1 << Integer.numberOfTrailingZeros(flags);
+ flags &= ~flag;
+ for (int uidState : UID_STATES) {
+ if (uidState < beginUidState || uidState > endUidState) {
+ continue;
+ }
+ final long key = makeKey(uidState, flag);
+ max = Math.max(max, counts.get(key));
+ }
+ }
+ return max;
+ }
+
+
+ private static void writeLongSparseLongArrayToParcel(
+ @Nullable LongSparseLongArray array, @NonNull Parcel parcel) {
+ if (array != null) {
+ final int size = array.size();
+ parcel.writeInt(size);
+ for (int i = 0; i < size; i++) {
+ parcel.writeLong(array.keyAt(i));
+ parcel.writeLong(array.valueAt(i));
+ }
+ } else {
+ parcel.writeInt(-1);
+ }
+ }
+
+ private static @Nullable LongSparseLongArray readLongSparseLongArrayFromParcel(
+ @NonNull Parcel parcel) {
+ final int size = parcel.readInt();
+ if (size < 0) {
+ return null;
+ }
+ final LongSparseLongArray array = new LongSparseLongArray(size);
+ for (int i = 0; i < size; i++) {
+ array.append(parcel.readLong(), parcel.readLong());
+ }
+ return array;
+ }
+
+ private static void writeLongSparseStringArrayToParcel(
+ @Nullable LongSparseArray<String> array, @NonNull Parcel parcel) {
+ if (array != null) {
+ final int size = array.size();
+ parcel.writeInt(size);
+ for (int i = 0; i < size; i++) {
+ parcel.writeLong(array.keyAt(i));
+ parcel.writeString(array.valueAt(i));
+ }
+ } else {
+ parcel.writeInt(-1);
+ }
+ }
+
+ private static @Nullable LongSparseArray<String> readLongSparseStringArrayFromParcel(
+ @NonNull Parcel parcel) {
+ final int size = parcel.readInt();
+ if (size < 0) {
+ return null;
+ }
+ final LongSparseArray<String> array = new LongSparseArray<>(size);
+ for (int i = 0; i < size; i++) {
+ array.append(parcel.readLong(), parcel.readString());
+ }
+ return array;
+ }
+
+ /**
+ * Collects the keys from an array to the result creating the result if needed.
+ *
+ * @param array The array whose keys to collect.
+ * @param result The optional result store collected keys.
+ * @return The result collected keys array.
*/
- public static long maxTime(long[] times, int start, int end) {
- long time = 0;
- for (int i = start; i < end; i++) {
- if (times[i] > time) {
- time = times[i];
+ private static LongSparseArray<Object> collectKeys(@Nullable LongSparseLongArray array,
+ @Nullable LongSparseArray<Object> result) {
+ if (array != null) {
+ if (result == null) {
+ result = new LongSparseArray<>();
+ }
+ final int accessSize = array.size();
+ for (int i = 0; i < accessSize; i++) {
+ result.put(array.keyAt(i), null);
}
}
- return time;
+ return result;
}
/** @hide */
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index e252f789a1ae..6ad6e3842de4 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -465,7 +465,7 @@ public class NotificationManager {
* show the user. Must not be null.
*/
public void notifyAsPackage(@NonNull String targetPackage, @NonNull String tag, int id,
- Notification notification) {
+ @NonNull Notification notification) {
INotificationManager service = getService();
String sender = mContext.getPackageName();
@@ -638,7 +638,7 @@ public class NotificationManager {
*
* See {@link #setNotificationDelegate(String)}.
*/
- public boolean canNotifyAsPackage(String pkg) {
+ public boolean canNotifyAsPackage(@NonNull String pkg) {
INotificationManager service = getService();
try {
return service.canNotifyAsPackage(mContext.getPackageName(), pkg);
@@ -1008,7 +1008,7 @@ public class NotificationManager {
* @param id The id of the rule whose state should change
* @param condition The new state of this rule
*/
- public void setAutomaticZenRuleState(String id, Condition condition) {
+ public void setAutomaticZenRuleState(@NonNull String id, @NonNull Condition condition) {
INotificationManager service = getService();
try {
service.setAutomaticZenRuleState(id, condition);
@@ -1169,7 +1169,7 @@ public class NotificationManager {
* TODO: STOPSHIP: Add correct intent
* {@link android.provider.Settings#ACTION_MANAGE_DEFAULT_APPS_SETTINGS}.
*/
- public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
+ public boolean isNotificationAssistantAccessGranted(@NonNull ComponentName assistant) {
INotificationManager service = getService();
try {
return service.isNotificationAssistantAccessGranted(assistant);
diff --git a/core/java/android/app/TEST_MAPPING b/core/java/android/app/TEST_MAPPING
index 65859c76a42a..ad614b1047ed 100644
--- a/core/java/android/app/TEST_MAPPING
+++ b/core/java/android/app/TEST_MAPPING
@@ -1,18 +1,37 @@
{
- "imports": [
- {
- "path": "frameworks/base/services/core/java/com/android/server/am"
- },
- {
- "path": "frameworks/base/services/core/java/com/android/server/wm"
- }
- ],
- "presubmit": [
- {
- "name": "CtsFragmentTestCases"
- },
- {
- "name": "CtsFragmentTestCasesSdk26"
- }
- ]
+ "imports": [
+ {
+ "path": "frameworks/base/services/core/java/com/android/server/am"
+ },
+ {
+ "path": "frameworks/base/services/core/java/com/android/server/wm"
+ }
+ ],
+ "presubmit": [
+ {
+ "name": "CtsFragmentTestCases"
+ },
+ {
+ "name": "CtsFragmentTestCasesSdk26"
+ },
+ {
+ "file_patterns": ["(/|^)AppOpsManager.java"],
+ "name": "CtsAppOpsTestCases"
+ },
+ {
+ "file_patterns": ["(/|^)AppOpsManager.java"],
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.appop.AppOpsUpgradeTest"
+ },
+ {
+ "include-filter": "com.android.server.appop.AppOpsServiceTest"
+ },
+ {
+ "include-filter": "com.android.server.appop.AppOpsActiveWatcherTest"
+ }
+ ]
+ }
+ ]
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index d593ad1fd0cd..efbd09844977 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3153,7 +3153,7 @@ public class DevicePolicyManager {
* {@link #PASSWORD_QUALITY_ALPHANUMERIC} with {@link #setPasswordQuality}.
* <p>
* On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
- * password is always treated as empty.
+ * password history length is always 0.
* <p>
* The calling device admin must have requested
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
@@ -3191,6 +3191,9 @@ public class DevicePolicyManager {
* <p>
* To disable password expiration, a value of 0 may be used for timeout.
* <p>
+ * On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password expiration is always disabled.
+ * <p>
* The calling device admin must have requested
* {@link DeviceAdminInfo#USES_POLICY_EXPIRE_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
@@ -3230,6 +3233,9 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password expiration is always disabled and this method always returns 0.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
* @return The timeout for the given admin or the minimum of all timeouts
*/
@@ -3255,6 +3261,9 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* the password expiration for the parent profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password expiration is always disabled and this method always returns 0.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate all admins.
* @return The password expiration time, in milliseconds since epoch.
*/
@@ -3279,6 +3288,9 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password history length is always 0.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate
* all admins.
* @return The length of the password history
@@ -3306,7 +3318,7 @@ public class DevicePolicyManager {
* Return the maximum password length that the device supports for a
* particular password quality.
* <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
- * password is always empty.
+ * password is always empty and this method always returns 0.
* @param quality The quality being interrogated.
* @return Returns the maximum length that the user can enter.
*/
@@ -3362,7 +3374,7 @@ public class DevicePolicyManager {
* #getParentProfileInstance}.
*
* <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
- * password is always treated as empty.
+ * password is always empty and this method returns {@link #PASSWORD_COMPLEXITY_NONE}.
*
* @throws IllegalStateException if the user is not unlocked.
* @throws SecurityException if the calling application does not have the permission
@@ -3437,6 +3449,8 @@ public class DevicePolicyManager {
* <p>
* The calling device admin must have requested {@link DeviceAdminInfo#USES_POLICY_WATCH_LOGIN}
* to be able to call this method; if it has not, a security exception will be thrown.
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password is always empty and this method always returns 0.
*
* @return The number of times user has entered an incorrect password since the last correct
* password entry.
@@ -3503,6 +3517,8 @@ public class DevicePolicyManager {
* This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent
* profile.
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password is always empty and this method has no effect - i.e. the policy is not set.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param num The number of failed password attempts at which point the device or profile will
@@ -3532,6 +3548,10 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* the value for the parent profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * password is always empty and this method returns a default value (0) indicating that the
+ * policy is not set.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate
* all admins.
*/
@@ -3619,6 +3639,8 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#N} and later for managed profiles, or for device admins
* that are not device owner or profile owner. Once set, the password cannot be changed to null
* or empty except by these admins.</em>
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, this
+ * methods does nothing.
* <p>
* The calling device admin must have requested
* {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} to be able to call this method; if it has
@@ -3669,6 +3691,8 @@ public class DevicePolicyManager {
* will be stored on your server and who will need access to them. Tokens may be the subject of
* legal access requests.
* </em>
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the
+ * reset token is not set and this method returns false.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param token a secure token a least 32-byte long, which must be generated by a
@@ -3693,6 +3717,10 @@ public class DevicePolicyManager {
/**
* Called by a profile or device owner to revoke the current password reset token.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, this
+ * method has no effect - the reset token should not have been set in the first place - and
+ * false is returned.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @return true if the operation is successful, false otherwise.
* @throws SecurityException if admin is not a device or profile owner.
@@ -3713,6 +3741,9 @@ public class DevicePolicyManager {
/**
* Called by a profile or device owner to check if the current reset password token is active.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature,
+ * false is always returned.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @return true if the token is active, false otherwise.
* @throws SecurityException if admin is not a device or profile owner.
@@ -3748,6 +3779,8 @@ public class DevicePolicyManager {
* <p>
* Calling with a {@code null} or empty password will clear any existing PIN, pattern or
* password if the current password constraints allow it.
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature,
+ * calling this methods has no effect - the password is always empty - and false is returned.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param password The new password for the user. {@code null} or empty clears the password.
@@ -3855,6 +3888,9 @@ public class DevicePolicyManager {
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature,
+ * calling this methods has no effect - i.e. the timeout is not set.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param timeoutMs The new timeout in milliseconds, after which the user will have to unlock
* with strong authentication method. A value of 0 means the admin is not participating
@@ -3887,6 +3923,9 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature,
+ * 0 is returned to indicate that no timeout is configured.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate
* across all participating admins.
* @return The timeout in milliseconds or 0 if not configured for the provided admin.
@@ -6617,6 +6656,9 @@ public class DevicePolicyManager {
* This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set the configuration for
* the parent profile.
+ * <p>
+ * On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, calling
+ * this method has no effect - no trust agent configuration will be set.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param target Component name of the agent to be configured.
@@ -6646,6 +6688,9 @@ public class DevicePolicyManager {
* This method can be called on the {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to retrieve the configuration set
* on the parent profile.
+ * <p>
+ * On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, null is
+ * always returned.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with. If null,
* this function returns a list of configurations for all admins that declare
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 9478a3c83d23..3c389e4aa38c 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -124,6 +124,7 @@ interface IDevicePolicyManager {
void setActiveAdmin(in ComponentName policyReceiver, boolean refreshing, int userHandle);
boolean isAdminActive(in ComponentName policyReceiver, int userHandle);
List<ComponentName> getActiveAdmins(int userHandle);
+ @UnsupportedAppUsage
boolean packageHasActiveAdmins(String packageName, int userHandle);
void getRemoveWarning(in ComponentName policyReceiver, in RemoteCallback result, int userHandle);
void removeActiveAdmin(in ComponentName policyReceiver, int userHandle);
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 8386c72e3406..70ecdae92652 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -54,6 +54,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.dataChangedForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
void dataChanged(String packageName);
/**
@@ -73,6 +74,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.clearBackupDataForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
void clearBackupData(String transportName, String packageName);
/**
@@ -155,6 +157,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.setBackupEnabledForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
void setBackupEnabled(boolean isEnabled);
/**
@@ -178,6 +181,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.setAutoRestoreForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
void setAutoRestore(boolean doAutoRestore);
/**
@@ -194,6 +198,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.isBackupEnabledForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
boolean isBackupEnabled();
/**
@@ -322,6 +327,7 @@ interface IBackupManager {
* {@link android.app.backup.IBackupManager.acknowledgeFullBackupOrRestoreForUser} for the
* calling user id.
*/
+ @UnsupportedAppUsage
void acknowledgeFullBackupOrRestore(int token, boolean allow,
in String curPassword, in String encryptionPassword,
IFullBackupRestoreObserver observer);
@@ -371,6 +377,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.getCurrentTransportForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
String getCurrentTransport();
/**
@@ -397,6 +404,7 @@ interface IBackupManager {
/**
* {@link android.app.backup.IBackupManager.listAllTransportsForUser} for the calling user id.
*/
+ @UnsupportedAppUsage
String[] listAllTransports();
/**
@@ -434,6 +442,7 @@ interface IBackupManager {
* {@link android.app.backup.IBackupManager.selectBackupTransportForUser} for the calling user
* id.
*/
+ @UnsupportedAppUsage
String selectBackupTransport(String transport);
/**
@@ -590,6 +599,7 @@ interface IBackupManager {
* @param whichUser User handle of the defined user whose backup active state
* is being queried.
*/
+ @UnsupportedAppUsage
boolean isBackupServiceActive(int whichUser);
/**
diff --git a/core/java/android/app/contentsuggestions/ClassificationsRequest.java b/core/java/android/app/contentsuggestions/ClassificationsRequest.java
index 1b50015ffc71..2051a55e1c2f 100644
--- a/core/java/android/app/contentsuggestions/ClassificationsRequest.java
+++ b/core/java/android/app/contentsuggestions/ClassificationsRequest.java
@@ -54,10 +54,10 @@ public final class ClassificationsRequest implements Parcelable {
}
/**
- * Return the request extras or {@code null} if there are none.
+ * Return the request extras, can be an empty bundle.
*/
- public @Nullable Bundle getExtras() {
- return mExtras;
+ public @NonNull Bundle getExtras() {
+ return mExtras == null ? new Bundle() : mExtras;
}
@Override
@@ -103,7 +103,7 @@ public final class ClassificationsRequest implements Parcelable {
/**
* Sets the request extras.
*/
- public Builder setExtras(@NonNull Bundle extras) {
+ public @NonNull Builder setExtras(@NonNull Bundle extras) {
mExtras = extras;
return this;
}
@@ -111,7 +111,7 @@ public final class ClassificationsRequest implements Parcelable {
/**
* Builds a new request instance.
*/
- public ClassificationsRequest build() {
+ public @NonNull ClassificationsRequest build() {
return new ClassificationsRequest(mSelections, mExtras);
}
}
diff --git a/core/java/android/app/contentsuggestions/SelectionsRequest.java b/core/java/android/app/contentsuggestions/SelectionsRequest.java
index 257f98d5d7d6..84f33b552893 100644
--- a/core/java/android/app/contentsuggestions/SelectionsRequest.java
+++ b/core/java/android/app/contentsuggestions/SelectionsRequest.java
@@ -63,10 +63,10 @@ public final class SelectionsRequest implements Parcelable {
}
/**
- * Return the request extras or {@code null} if there aren't any.
+ * Return the request extras, may be an empty bundle if there aren't any.
*/
- public @Nullable Bundle getExtras() {
- return mExtras;
+ public @NonNull Bundle getExtras() {
+ return mExtras == null ? new Bundle() : mExtras;
}
@Override
@@ -118,7 +118,7 @@ public final class SelectionsRequest implements Parcelable {
/**
* Sets the request extras.
*/
- public Builder setExtras(@NonNull Bundle extras) {
+ public @NonNull Builder setExtras(@NonNull Bundle extras) {
mExtras = extras;
return this;
}
@@ -126,7 +126,7 @@ public final class SelectionsRequest implements Parcelable {
/**
* Sets the request interest point.
*/
- public Builder setInterestPoint(@NonNull Point interestPoint) {
+ public @NonNull Builder setInterestPoint(@NonNull Point interestPoint) {
mInterestPoint = interestPoint;
return this;
}
@@ -134,7 +134,7 @@ public final class SelectionsRequest implements Parcelable {
/**
* Builds a new request instance.
*/
- public SelectionsRequest build() {
+ public @NonNull SelectionsRequest build() {
return new SelectionsRequest(mTaskId, mInterestPoint, mExtras);
}
}
diff --git a/core/java/android/app/job/IJobCallback.aidl b/core/java/android/app/job/IJobCallback.aidl
index e7695e2e747f..d281da037fde 100644
--- a/core/java/android/app/job/IJobCallback.aidl
+++ b/core/java/android/app/job/IJobCallback.aidl
@@ -36,6 +36,7 @@ interface IJobCallback {
* @param ongoing True to indicate that the client is processing the job. False if the job is
* complete
*/
+ @UnsupportedAppUsage
void acknowledgeStartMessage(int jobId, boolean ongoing);
/**
* Immediate callback to the system after sending a stop signal, used to quickly detect ANR.
@@ -43,14 +44,17 @@ interface IJobCallback {
* @param jobId Unique integer used to identify this job.
* @param reschedule Whether or not to reschedule this job.
*/
+ @UnsupportedAppUsage
void acknowledgeStopMessage(int jobId, boolean reschedule);
/*
* Called to deqeue next work item for the job.
*/
+ @UnsupportedAppUsage
JobWorkItem dequeueWork(int jobId);
/*
* Called to report that job has completed processing a work item.
*/
+ @UnsupportedAppUsage
boolean completeWork(int jobId, int workId);
/*
* Tell the job manager that the client is done with its execution, so that it can go on to
@@ -59,5 +63,6 @@ interface IJobCallback {
* @param jobId Unique integer used to identify this job.
* @param reschedule Whether or not to reschedule this job.
*/
+ @UnsupportedAppUsage
void jobFinished(int jobId, boolean reschedule);
}
diff --git a/core/java/android/app/job/IJobService.aidl b/core/java/android/app/job/IJobService.aidl
index 7f55d29e87ed..22ad252b9639 100644
--- a/core/java/android/app/job/IJobService.aidl
+++ b/core/java/android/app/job/IJobService.aidl
@@ -26,7 +26,9 @@ import android.app.job.JobParameters;
*/
oneway interface IJobService {
/** Begin execution of application's job. */
+ @UnsupportedAppUsage
void startJob(in JobParameters jobParams);
/** Stop execution of application's job. */
+ @UnsupportedAppUsage
void stopJob(in JobParameters jobParams);
}
diff --git a/core/java/android/app/role/OnRoleHoldersChangedListener.java b/core/java/android/app/role/OnRoleHoldersChangedListener.java
index 5958debc86dd..d6f76794da20 100644
--- a/core/java/android/app/role/OnRoleHoldersChangedListener.java
+++ b/core/java/android/app/role/OnRoleHoldersChangedListener.java
@@ -18,6 +18,7 @@ package android.app.role;
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.UserHandle;
/**
@@ -26,6 +27,7 @@ import android.os.UserHandle;
* @hide
*/
@SystemApi
+@TestApi
public interface OnRoleHoldersChangedListener {
/**
diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java
index 7ec21f637e0c..c665cb238028 100644
--- a/core/java/android/app/role/RoleManager.java
+++ b/core/java/android/app/role/RoleManager.java
@@ -467,6 +467,7 @@ public final class RoleManager {
*/
@RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS)
@SystemApi
+ @TestApi
public void addOnRoleHoldersChangedListenerAsUser(@CallbackExecutor @NonNull Executor executor,
@NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) {
Preconditions.checkNotNull(executor, "executor cannot be null");
@@ -512,6 +513,7 @@ public final class RoleManager {
*/
@RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS)
@SystemApi
+ @TestApi
public void removeOnRoleHoldersChangedListenerAsUser(
@NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) {
Preconditions.checkNotNull(listener, "listener cannot be null");
@@ -553,6 +555,7 @@ public final class RoleManager {
*/
@RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER)
@SystemApi
+ @TestApi
public void setRoleNamesFromController(@NonNull List<String> roleNames) {
Preconditions.checkNotNull(roleNames, "roleNames cannot be null");
try {
@@ -583,6 +586,7 @@ public final class RoleManager {
*/
@RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER)
@SystemApi
+ @TestApi
public boolean addRoleHolderFromController(@NonNull String roleName,
@NonNull String packageName) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
@@ -615,6 +619,7 @@ public final class RoleManager {
*/
@RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER)
@SystemApi
+ @TestApi
public boolean removeRoleHolderFromController(@NonNull String roleName,
@NonNull String packageName) {
Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");
@@ -634,9 +639,10 @@ public final class RoleManager {
*
* @hide
*/
+ @NonNull
@RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER)
@SystemApi
- @NonNull
+ @TestApi
public List<String> getHeldRolesFromController(@NonNull String packageName) {
Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
try {
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index b1500c193820..62b24e9995e8 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -28,8 +28,10 @@ import java.util.Map;
* {@hide}
*/
interface IUsageStatsManager {
+ @UnsupportedAppUsage
ParceledListSlice queryUsageStats(int bucketType, long beginTime, long endTime,
String callingPackage);
+ @UnsupportedAppUsage
ParceledListSlice queryConfigurationStats(int bucketType, long beginTime, long endTime,
String callingPackage);
ParceledListSlice queryEventStats(int bucketType, long beginTime, long endTime,
@@ -38,7 +40,9 @@ interface IUsageStatsManager {
UsageEvents queryEventsForPackage(long beginTime, long endTime, String callingPackage);
UsageEvents queryEventsForUser(long beginTime, long endTime, int userId, String callingPackage);
UsageEvents queryEventsForPackageForUser(long beginTime, long endTime, int userId, String pkg, String callingPackage);
+ @UnsupportedAppUsage
void setAppInactive(String packageName, boolean inactive, int userId);
+ @UnsupportedAppUsage
boolean isAppInactive(String packageName, int userId);
void whitelistAppTemporarily(String packageName, long duration, int userId);
void onCarrierPrivilegedAppsChanged();
@@ -56,7 +60,7 @@ interface IUsageStatsManager {
in PendingIntent sessionEndCallbackIntent, String callingPackage);
void unregisterUsageSessionObserver(int sessionObserverId, String callingPackage);
void registerAppUsageLimitObserver(int observerId, in String[] packages, long timeLimitMs,
- in PendingIntent callback, String callingPackage);
+ long timeRemainingMs, in PendingIntent callback, String callingPackage);
void unregisterAppUsageLimitObserver(int observerId, String callingPackage);
void reportUsageStart(in IBinder activity, String token, String callingPackage);
void reportPastUsageStart(in IBinder activity, String token, long timeAgoMs,
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index d34e6d3836b8..cee6b87fd3f1 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -35,6 +35,7 @@ import android.util.ArrayMap;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -738,6 +739,23 @@ public final class UsageStatsManager {
}
/**
+ * @deprecated use
+ * {@link #registerAppUsageLimitObserver(int, String[], Duration, Duration, PendingIntent)}.
+ *
+ * @removed
+ * @hide
+ */
+ @Deprecated
+ @UnsupportedAppUsage
+ // STOPSHIP b/126917290: remove this method once ag/6591106 is merged and it's not being used.
+ public void registerAppUsageLimitObserver(int observerId, @NonNull String[] observedEntities,
+ long timeLimit, @NonNull TimeUnit timeUnit, @Nullable PendingIntent callbackIntent) {
+ final Duration timeLimitDuration = Duration.ofMillis(timeUnit.toMillis(timeLimit));
+ registerAppUsageLimitObserver(observerId, observedEntities,
+ timeLimitDuration, timeLimitDuration, callbackIntent);
+ }
+
+ /**
* Register a usage limit observer that receives a callback on the provided intent when the
* sum of usages of apps and tokens in the provided {@code observedEntities} array exceeds the
* {@code timeLimit} specified. The structure of a token is a {@link String} with the reporting
@@ -759,19 +777,21 @@ public final class UsageStatsManager {
* @see android.content.pm.LauncherApps#getAppUsageLimit
*
* @param observerId A unique id associated with the group of apps to be monitored. There can
- * be multiple groups with common packages and different time limits.
+ * be multiple groups with common packages and different time limits.
* @param observedEntities The list of packages and token to observe for usage time. Cannot be
* null and must include at least one package or token.
* @param timeLimit The total time the set of apps can be in the foreground before the
- * callbackIntent is delivered. Must be at least one minute. Note: a limit of
- * 0 can be set to indicate that the user has already exhausted the limit for
- * a group, in which case, the given {@code callbackIntent} will be ignored.
- * @param timeUnit The unit for time specified in {@code timeLimit}. Cannot be null.
+ * {@code callbackIntent} is delivered. Must be at least one minute.
+ * @param timeRemaining The remaining time the set of apps can be in the foreground before the
+ * {@code callbackIntent} is delivered. Must be greater than
+ * {@code timeLimit}. Note: a limit of 0 can be set to indicate that the
+ * user has already exhausted the limit for a group, in which case,
+ * the given {@code callbackIntent} will be ignored.
* @param callbackIntent The PendingIntent that will be dispatched when the usage 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 {@code null} unless the observer is
- * being registered with a {@code timeLimit} of 0.
+ * being registered with a {@code timeRemaining} of 0.
* @throws SecurityException if the caller doesn't have both SUSPEND_APPS and OBSERVE_APP_USAGE
* permissions.
* @hide
@@ -781,10 +801,12 @@ public final class UsageStatsManager {
android.Manifest.permission.SUSPEND_APPS,
android.Manifest.permission.OBSERVE_APP_USAGE})
public void registerAppUsageLimitObserver(int observerId, @NonNull String[] observedEntities,
- long timeLimit, @NonNull TimeUnit timeUnit, @Nullable PendingIntent callbackIntent) {
+ @NonNull Duration timeLimit, @NonNull Duration timeRemaining,
+ @Nullable PendingIntent callbackIntent) {
try {
mService.registerAppUsageLimitObserver(observerId, observedEntities,
- timeUnit.toMillis(timeLimit), callbackIntent, mContext.getOpPackageName());
+ timeLimit.toMillis(), timeRemaining.toMillis(), callbackIntent,
+ mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/companion/BluetoothDeviceFilterUtils.java b/core/java/android/companion/BluetoothDeviceFilterUtils.java
index bd507a6b8bcc..75e726bfad0d 100644
--- a/core/java/android/companion/BluetoothDeviceFilterUtils.java
+++ b/core/java/android/companion/BluetoothDeviceFilterUtils.java
@@ -30,6 +30,7 @@ import android.os.Parcelable;
import android.util.Log;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
@@ -78,11 +79,12 @@ public class BluetoothDeviceFilterUtils {
static boolean matchesServiceUuid(ParcelUuid serviceUuid, ParcelUuid serviceUuidMask,
BluetoothDevice device) {
+ ParcelUuid[] uuids = device.getUuids();
final boolean result = serviceUuid == null ||
ScanFilter.matchesServiceUuids(
serviceUuid,
serviceUuidMask,
- Arrays.asList(device.getUuids()));
+ uuids == null ? Collections.emptyList() : Arrays.asList(uuids));
if (DEBUG) debugLogMatchResult(result, device, serviceUuid);
return result;
}
diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java
index ca657b150f9c..994833866f40 100644
--- a/core/java/android/content/ContentProviderNative.java
+++ b/core/java/android/content/ContentProviderNative.java
@@ -800,5 +800,6 @@ final class ContentProviderProxy implements IContentProvider
}
}
+ @UnsupportedAppUsage
private IBinder mRemote;
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 29added9aa51..beb1fb68d218 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -770,6 +770,7 @@ public abstract class Context {
* <p>
* This is not generally intended for third party application developers.
*/
+ @NonNull
public String getOpPackageName() {
throw new RuntimeException("Not implemented. Must override in a subclass.");
}
@@ -1741,7 +1742,8 @@ public abstract class Context {
*/
@RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
@SystemApi
- public void startActivityAsUser(@RequiresPermission Intent intent, UserHandle user) {
+ public void startActivityAsUser(@RequiresPermission @NonNull Intent intent,
+ @NonNull UserHandle user) {
throw new RuntimeException("Not implemented. Must override in a subclass.");
}
@@ -2981,7 +2983,7 @@ public abstract class Context {
*
* @see #bindService
*/
- public boolean bindIsolatedService(@RequiresPermission Intent service,
+ public boolean bindIsolatedService(@RequiresPermission @NonNull Intent service,
@NonNull ServiceConnection conn, @BindServiceFlags int flags,
@NonNull String instanceName) {
throw new RuntimeException("Not implemented. Must override in a subclass.");
diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl
index 9f6e236306e0..a34a9951671c 100644
--- a/core/java/android/content/IContentService.aidl
+++ b/core/java/android/content/IContentService.aidl
@@ -61,6 +61,7 @@ interface IContentService {
*/
void sync(in SyncRequest request, String callingPackage);
void syncAsUser(in SyncRequest request, int userId, String callingPackage);
+ @UnsupportedAppUsage
void cancelSync(in Account account, String authority, in ComponentName cname);
void cancelSyncAsUser(in Account account, String authority, in ComponentName cname, int userId);
@@ -118,6 +119,7 @@ interface IContentService {
* Check if this account/provider is syncable.
* @return >0 if it is syncable, 0 if not, and <0 if the state isn't known yet.
*/
+ @UnsupportedAppUsage
int getIsSyncable(in Account account, String providerName);
int getIsSyncableAsUser(in Account account, String providerName, int userId);
@@ -128,9 +130,11 @@ interface IContentService {
void setIsSyncable(in Account account, String providerName, int syncable);
void setIsSyncableAsUser(in Account account, String providerName, int syncable, int userId);
+ @UnsupportedAppUsage
void setMasterSyncAutomatically(boolean flag);
void setMasterSyncAutomaticallyAsUser(boolean flag, int userId);
+ @UnsupportedAppUsage
boolean getMasterSyncAutomatically();
boolean getMasterSyncAutomaticallyAsUser(int userId);
@@ -141,6 +145,7 @@ interface IContentService {
* Returns the types of the SyncAdapters that are registered with the system.
* @return Returns the types of the SyncAdapters that are registered with the system.
*/
+ @UnsupportedAppUsage
SyncAdapterType[] getSyncAdapterTypes();
SyncAdapterType[] getSyncAdapterTypesAsUser(int userId);
@@ -154,6 +159,7 @@ interface IContentService {
* @param cname component to identify sync service, must be null if account/providerName are
* non-null.
*/
+ @UnsupportedAppUsage
boolean isSyncActive(in Account account, String authority, in ComponentName cname);
/**
diff --git a/core/java/android/content/IIntentReceiver.aidl b/core/java/android/content/IIntentReceiver.aidl
index 3d9272388e03..2b45021db90e 100644
--- a/core/java/android/content/IIntentReceiver.aidl
+++ b/core/java/android/content/IIntentReceiver.aidl
@@ -27,6 +27,7 @@ import android.os.Bundle;
* {@hide}
*/
oneway interface IIntentReceiver {
+ @UnsupportedAppUsage
void performReceive(in Intent intent, int resultCode, String data,
in Bundle extras, boolean ordered, boolean sticky, int sendingUser);
}
diff --git a/core/java/android/content/ISyncAdapter.aidl b/core/java/android/content/ISyncAdapter.aidl
index 0eb581e6b585..9242d0289cfa 100644
--- a/core/java/android/content/ISyncAdapter.aidl
+++ b/core/java/android/content/ISyncAdapter.aidl
@@ -32,6 +32,7 @@ oneway interface ISyncAdapter {
*
* @param cb If called back with {@code false} accounts are not synced.
*/
+ @UnsupportedAppUsage
void onUnsyncableAccount(ISyncAdapterUnsyncableAccountCallback cb);
/**
@@ -44,6 +45,7 @@ oneway interface ISyncAdapter {
* @param account the account that should be synced
* @param extras SyncAdapter-specific parameters
*/
+ @UnsupportedAppUsage
void startSync(ISyncContext syncContext, String authority,
in Account account, in Bundle extras);
@@ -52,5 +54,6 @@ oneway interface ISyncAdapter {
* after the ISyncContext.onFinished() for that sync was called.
* @param syncContext the ISyncContext that was passed to {@link #startSync}
*/
+ @UnsupportedAppUsage
void cancelSync(ISyncContext syncContext);
}
diff --git a/core/java/android/content/ISyncServiceAdapter.aidl b/core/java/android/content/ISyncServiceAdapter.aidl
index d419307e7fa2..29f3a406e5a9 100644
--- a/core/java/android/content/ISyncServiceAdapter.aidl
+++ b/core/java/android/content/ISyncServiceAdapter.aidl
@@ -35,11 +35,13 @@ oneway interface ISyncServiceAdapter {
* @param extras SyncAdapter-specific parameters.
*
*/
+ @UnsupportedAppUsage
void startSync(ISyncContext syncContext, in Bundle extras);
/**
* Cancel the currently ongoing sync.
*/
+ @UnsupportedAppUsage
void cancelSync(ISyncContext syncContext);
}
diff --git a/core/java/android/content/ISyncStatusObserver.aidl b/core/java/android/content/ISyncStatusObserver.aidl
index eb2684544abf..64bf3bd355e4 100644
--- a/core/java/android/content/ISyncStatusObserver.aidl
+++ b/core/java/android/content/ISyncStatusObserver.aidl
@@ -20,5 +20,6 @@ package android.content;
* @hide
*/
oneway interface ISyncStatusObserver {
+ @UnsupportedAppUsage
void onStatusChanged(int which);
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 0589f43aaa13..d3b8e29d7399 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -27,6 +27,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -1902,6 +1903,7 @@ public class Intent implements Parcelable, Cloneable {
* @hide
*/
@SystemApi
+ @TestApi
public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME";
/**
diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl
index 5b3c9dd93370..722c128c0502 100644
--- a/core/java/android/content/om/IOverlayManager.aidl
+++ b/core/java/android/content/om/IOverlayManager.aidl
@@ -37,6 +37,7 @@ interface IOverlayManager {
* mapped to lists of overlays; if no overlays exist for the
* requested user, an empty map is returned.
*/
+ @UnsupportedAppUsage
Map getAllOverlays(in int userId);
/**
@@ -60,6 +61,7 @@ interface IOverlayManager {
* @return The OverlayInfo for the overlay package; or null if no such
* overlay package exists.
*/
+ @UnsupportedAppUsage
OverlayInfo getOverlayInfo(in String packageName, in int userId);
/**
diff --git a/core/java/android/content/pm/IPackageDataObserver.aidl b/core/java/android/content/pm/IPackageDataObserver.aidl
index d010ee432752..926ecda04ba8 100644
--- a/core/java/android/content/pm/IPackageDataObserver.aidl
+++ b/core/java/android/content/pm/IPackageDataObserver.aidl
@@ -24,5 +24,6 @@ package android.content.pm;
* {@hide}
*/
oneway interface IPackageDataObserver {
+ @UnsupportedAppUsage
void onRemoveCompleted(in String packageName, boolean succeeded);
}
diff --git a/core/java/android/content/pm/IPackageDeleteObserver.aidl b/core/java/android/content/pm/IPackageDeleteObserver.aidl
index 2e2d16ebd7fb..faae81e3254b 100644
--- a/core/java/android/content/pm/IPackageDeleteObserver.aidl
+++ b/core/java/android/content/pm/IPackageDeleteObserver.aidl
@@ -23,6 +23,7 @@ package android.content.pm;
* {@hide}
*/
oneway interface IPackageDeleteObserver {
+ @UnsupportedAppUsage
void packageDeleted(in String packageName, in int returnCode);
}
diff --git a/core/java/android/content/pm/IPackageDeleteObserver2.aidl b/core/java/android/content/pm/IPackageDeleteObserver2.aidl
index bff3baa55768..ea8096755e5c 100644
--- a/core/java/android/content/pm/IPackageDeleteObserver2.aidl
+++ b/core/java/android/content/pm/IPackageDeleteObserver2.aidl
@@ -21,5 +21,6 @@ import android.content.Intent;
/** {@hide} */
oneway interface IPackageDeleteObserver2 {
void onUserActionRequired(in Intent intent);
+ @UnsupportedAppUsage
void onPackageDeleted(String packageName, int returnCode, String msg);
}
diff --git a/core/java/android/content/pm/IPackageInstallObserver2.aidl b/core/java/android/content/pm/IPackageInstallObserver2.aidl
index bb5f22a2faa1..ed2eb7dceff5 100644
--- a/core/java/android/content/pm/IPackageInstallObserver2.aidl
+++ b/core/java/android/content/pm/IPackageInstallObserver2.aidl
@@ -25,6 +25,7 @@ import android.os.Bundle;
* @hide
*/
oneway interface IPackageInstallObserver2 {
+ @UnsupportedAppUsage
void onUserActionRequired(in Intent intent);
/**
@@ -42,5 +43,6 @@ oneway interface IPackageInstallObserver2 {
* </tr>
* </table>
*/
+ @UnsupportedAppUsage
void onPackageInstalled(String basePackageName, int returnCode, String msg, in Bundle extras);
}
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl
index 0cf83fd4655b..8e840796e953 100644
--- a/core/java/android/content/pm/IPackageInstaller.aidl
+++ b/core/java/android/content/pm/IPackageInstaller.aidl
@@ -47,6 +47,7 @@ interface IPackageInstaller {
void registerCallback(IPackageInstallerCallback callback, int userId);
void unregisterCallback(IPackageInstallerCallback callback);
+ @UnsupportedAppUsage
void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags,
in IntentSender statusReceiver, int userId);
diff --git a/core/java/android/content/pm/IPackageInstallerCallback.aidl b/core/java/android/content/pm/IPackageInstallerCallback.aidl
index 974eb1ede5b2..ee265007b39d 100644
--- a/core/java/android/content/pm/IPackageInstallerCallback.aidl
+++ b/core/java/android/content/pm/IPackageInstallerCallback.aidl
@@ -18,9 +18,14 @@ package android.content.pm;
/** {@hide} */
oneway interface IPackageInstallerCallback {
+ @UnsupportedAppUsage
void onSessionCreated(int sessionId);
+ @UnsupportedAppUsage
void onSessionBadgingChanged(int sessionId);
+ @UnsupportedAppUsage
void onSessionActiveChanged(int sessionId, boolean active);
+ @UnsupportedAppUsage
void onSessionProgressChanged(int sessionId, float progress);
+ @UnsupportedAppUsage
void onSessionFinished(int sessionId, boolean success);
}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index dcbb4ac2d5f3..fd3529b05c35 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -63,45 +63,60 @@ import android.content.IntentSender;
*/
interface IPackageManager {
void checkPackageStartable(String packageName, int userId);
+ @UnsupportedAppUsage
boolean isPackageAvailable(String packageName, int userId);
+ @UnsupportedAppUsage
PackageInfo getPackageInfo(String packageName, int flags, int userId);
PackageInfo getPackageInfoVersioned(in VersionedPackage versionedPackage,
int flags, int userId);
+ @UnsupportedAppUsage
int getPackageUid(String packageName, int flags, int userId);
int[] getPackageGids(String packageName, int flags, int userId);
+ @UnsupportedAppUsage
String[] currentToCanonicalPackageNames(in String[] names);
+ @UnsupportedAppUsage
String[] canonicalToCurrentPackageNames(in String[] names);
PermissionInfo getPermissionInfo(String name, String packageName, int flags);
ParceledListSlice queryPermissionsByGroup(String group, int flags);
+ @UnsupportedAppUsage
PermissionGroupInfo getPermissionGroupInfo(String name, int flags);
ParceledListSlice getAllPermissionGroups(int flags);
+ @UnsupportedAppUsage
ApplicationInfo getApplicationInfo(String packageName, int flags ,int userId);
+ @UnsupportedAppUsage
ActivityInfo getActivityInfo(in ComponentName className, int flags, int userId);
boolean activitySupportsIntent(in ComponentName className, in Intent intent,
String resolvedType);
+ @UnsupportedAppUsage
ActivityInfo getReceiverInfo(in ComponentName className, int flags, int userId);
+ @UnsupportedAppUsage
ServiceInfo getServiceInfo(in ComponentName className, int flags, int userId);
+ @UnsupportedAppUsage
ProviderInfo getProviderInfo(in ComponentName className, int flags, int userId);
+ @UnsupportedAppUsage
int checkPermission(String permName, String pkgName, int userId);
int checkUidPermission(String permName, int uid);
+ @UnsupportedAppUsage
boolean addPermission(in PermissionInfo info);
+ @UnsupportedAppUsage
void removePermission(String name);
+ @UnsupportedAppUsage
void grantRuntimePermission(String packageName, String permissionName, int userId);
void revokeRuntimePermission(String packageName, String permissionName, int userId);
@@ -120,33 +135,43 @@ interface IPackageManager {
boolean isProtectedBroadcast(String actionName);
+ @UnsupportedAppUsage
int checkSignatures(String pkg1, String pkg2);
+ @UnsupportedAppUsage
int checkUidSignatures(int uid1, int uid2);
List<String> getAllPackages();
+ @UnsupportedAppUsage
String[] getPackagesForUid(int uid);
+ @UnsupportedAppUsage
String getNameForUid(int uid);
String[] getNamesForUids(in int[] uids);
+ @UnsupportedAppUsage
int getUidForSharedUser(String sharedUserName);
+ @UnsupportedAppUsage
int getFlagsForUid(int uid);
int getPrivateFlagsForUid(int uid);
+ @UnsupportedAppUsage
boolean isUidPrivileged(int uid);
+ @UnsupportedAppUsage
String[] getAppOpPermissionPackages(String permissionName);
+ @UnsupportedAppUsage
ResolveInfo resolveIntent(in Intent intent, String resolvedType, int flags, int userId);
ResolveInfo findPersistentPreferredActivity(in Intent intent, int userId);
boolean canForwardTo(in Intent intent, String resolvedType, int sourceUserId, int targetUserId);
+ @UnsupportedAppUsage
ParceledListSlice queryIntentActivities(in Intent intent,
String resolvedType, int flags, int userId);
@@ -173,6 +198,7 @@ interface IPackageManager {
* limit that kicks in when flags are included that bloat up the data
* returned.
*/
+ @UnsupportedAppUsage
ParceledListSlice getInstalledPackages(int flags, in int userId);
/**
@@ -190,6 +216,7 @@ interface IPackageManager {
* limit that kicks in when flags are included that bloat up the data
* returned.
*/
+ @UnsupportedAppUsage
ParceledListSlice getInstalledApplications(int flags, int userId);
/**
@@ -210,20 +237,24 @@ interface IPackageManager {
* @param outInfo Filled in with a list of the ProviderInfo for each
* name in 'outNames'.
*/
+ @UnsupportedAppUsage
void querySyncProviders(inout List<String> outNames,
inout List<ProviderInfo> outInfo);
ParceledListSlice queryContentProviders(
String processName, int uid, int flags, String metaDataKey);
+ @UnsupportedAppUsage
InstrumentationInfo getInstrumentationInfo(
in ComponentName className, int flags);
+ @UnsupportedAppUsage
ParceledListSlice queryInstrumentation(
String targetPackage, int flags);
void finishPackageInstall(int token, boolean didLaunch);
+ @UnsupportedAppUsage
void setInstallerPackageName(in String targetPackage, in String installerPackageName);
void setApplicationCategoryHint(String packageName, int categoryHint, String callerPackageName);
@@ -243,24 +274,30 @@ interface IPackageManager {
void deletePackageVersioned(in VersionedPackage versionedPackage,
IPackageDeleteObserver2 observer, int userId, int flags);
+ @UnsupportedAppUsage
String getInstallerPackageName(in String packageName);
void resetApplicationPreferences(int userId);
+ @UnsupportedAppUsage
ResolveInfo getLastChosenActivity(in Intent intent,
String resolvedType, int flags);
+ @UnsupportedAppUsage
void setLastChosenActivity(in Intent intent, String resolvedType, int flags,
in IntentFilter filter, int match, in ComponentName activity);
void addPreferredActivity(in IntentFilter filter, int match,
in ComponentName[] set, in ComponentName activity, int userId);
+ @UnsupportedAppUsage
void replacePreferredActivity(in IntentFilter filter, int match,
in ComponentName[] set, in ComponentName activity, int userId);
+ @UnsupportedAppUsage
void clearPackagePreferredActivities(String packageName);
+ @UnsupportedAppUsage
int getPreferredActivities(out List<IntentFilter> outFilters,
out List<ComponentName> outActivities, String packageName);
@@ -300,6 +337,7 @@ interface IPackageManager {
* Report the set of 'Home' activity candidates, plus (if any) which of them
* is the current "always use this one" setting.
*/
+ @UnsupportedAppUsage
ComponentName getHomeActivities(out List<ResolveInfo> outHomeCandidates);
void setHomeActivity(in ComponentName className, int userId);
@@ -307,23 +345,27 @@ interface IPackageManager {
/**
* As per {@link android.content.pm.PackageManager#setComponentEnabledSetting}.
*/
+ @UnsupportedAppUsage
void setComponentEnabledSetting(in ComponentName componentName,
in int newState, in int flags, int userId);
/**
* As per {@link android.content.pm.PackageManager#getComponentEnabledSetting}.
*/
+ @UnsupportedAppUsage
int getComponentEnabledSetting(in ComponentName componentName, int userId);
/**
* As per {@link android.content.pm.PackageManager#setApplicationEnabledSetting}.
*/
+ @UnsupportedAppUsage
void setApplicationEnabledSetting(in String packageName, in int newState, int flags,
int userId, String callingPackage);
/**
* As per {@link android.content.pm.PackageManager#getApplicationEnabledSetting}.
*/
+ @UnsupportedAppUsage
int getApplicationEnabledSetting(in String packageName, int userId);
/**
@@ -341,6 +383,7 @@ interface IPackageManager {
* Set whether the given package should be considered stopped, making
* it not visible to implicit intents that filter out stopped packages.
*/
+ @UnsupportedAppUsage
void setPackageStoppedState(String packageName, boolean stopped, int userId);
/**
@@ -396,6 +439,7 @@ interface IPackageManager {
* files need to be deleted
* @param observer a callback used to notify when the deletion is finished.
*/
+ @UnsupportedAppUsage
void deleteApplicationCacheFiles(in String packageName, IPackageDataObserver observer);
/**
@@ -436,6 +480,7 @@ interface IPackageManager {
* Get a list of shared libraries that are available on the
* system.
*/
+ @UnsupportedAppUsage
String[] getSystemSharedLibraryNames();
/**
@@ -447,8 +492,10 @@ interface IPackageManager {
boolean hasSystemFeature(String name, int version);
void enterSafeMode();
+ @UnsupportedAppUsage
boolean isSafeMode();
void systemReady();
+ @UnsupportedAppUsage
boolean hasSystemUidErrors();
/**
@@ -570,9 +617,11 @@ interface IPackageManager {
int movePackage(in String packageName, in String volumeUuid);
int movePrimaryStorage(in String volumeUuid);
+ @UnsupportedAppUsage
boolean addPermissionAsync(in PermissionInfo info);
boolean setInstallLocation(int loc);
+ @UnsupportedAppUsage
int getInstallLocation();
int installExistingPackageAsUser(String packageName, int userId, int installFlags,
@@ -600,17 +649,21 @@ interface IPackageManager {
boolean isPermissionEnforced(String permission);
/** Reflects current DeviceStorageMonitorService state */
+ @UnsupportedAppUsage
boolean isStorageLow();
+ @UnsupportedAppUsage
boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden, int userId);
boolean getApplicationHiddenSettingAsUser(String packageName, int userId);
void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden);
boolean setSystemAppInstallState(String packageName, boolean installed, int userId);
+ @UnsupportedAppUsage
IPackageInstaller getPackageInstaller();
boolean setBlockUninstallForUser(String packageName, boolean blockUninstall, int userId);
+ @UnsupportedAppUsage
boolean getBlockUninstallForUser(String packageName, int userId);
KeySet getKeySetByAlias(String packageName, String alias);
@@ -631,6 +684,7 @@ interface IPackageManager {
boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId);
+ @UnsupportedAppUsage
String getPermissionControllerPackageName();
ParceledListSlice getInstantApps(int userId);
@@ -647,7 +701,9 @@ interface IPackageManager {
*/
void setUpdateAvailable(String packageName, boolean updateAvaialble);
+ @UnsupportedAppUsage
String getServicesSystemSharedLibraryPackageName();
+ @UnsupportedAppUsage
String getSharedSystemSharedLibraryPackageName();
ChangedPackages getChangedPackages(int sequenceNumber, int userId);
diff --git a/core/java/android/content/pm/IPackageStatsObserver.aidl b/core/java/android/content/pm/IPackageStatsObserver.aidl
index ede4d1d9a791..559a0355de17 100644
--- a/core/java/android/content/pm/IPackageStatsObserver.aidl
+++ b/core/java/android/content/pm/IPackageStatsObserver.aidl
@@ -26,5 +26,6 @@ import android.content.pm.PackageStats;
*/
oneway interface IPackageStatsObserver {
+ @UnsupportedAppUsage
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index a2ae994f7b0f..c855d45f519e 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -1782,10 +1782,16 @@ public class Resources {
* @param explicitStyleRes A resource identifier of an explicit style resource.
* @return ordered list of resource ID that are considered when resolving attribute values.
*/
+ @NonNull
public int[] getAttributeResolutionStack(@AttrRes int defStyleAttr,
@StyleRes int defStyleRes, @StyleRes int explicitStyleRes) {
- return mThemeImpl.getAttributeResolutionStack(
+ int[] stack = mThemeImpl.getAttributeResolutionStack(
defStyleAttr, defStyleRes, explicitStyleRes);
+ if (stack == null) {
+ return new int[0];
+ } else {
+ return stack;
+ }
}
}
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index da064c956fcc..565cd3375c32 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -1507,6 +1507,7 @@ public class ResourcesImpl {
* @param explicitStyleRes A resource identifier of an explicit style resource.
* @return ordered list of resource ID that are considered when resolving attribute values.
*/
+ @Nullable
public int[] getAttributeResolutionStack(@AttrRes int defStyleAttr,
@StyleRes int defStyleRes, @StyleRes int explicitStyleRes) {
synchronized (mKey) {
diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java
index 2788f821e9f5..c043491e599b 100644
--- a/core/java/android/content/rollback/RollbackManager.java
+++ b/core/java/android/content/rollback/RollbackManager.java
@@ -187,7 +187,8 @@ public final class RollbackManager {
/**
* Expire the rollback data for a given package.
* This API is meant to facilitate testing of rollback logic for
- * expiring rollback data.
+ * expiring rollback data. Removes rollback data for available and
+ * recently committed rollbacks that contain the given package.
*
* @param packageName the name of the package to expire data for.
* @throws SecurityException if the caller does not have the
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index dffbd89c33d2..caf3e9337b92 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -2655,26 +2655,24 @@ public final class SQLiteDatabase extends SQLiteClosable {
* Sets the maximum number of milliseconds that SQLite connection is allowed to be idle
* before it is closed and removed from the pool.
*
- * <p>DO NOT USE this method unless you fully understand the implication
- * of what it does.
- * A connection timeout allows the system to internally close a connection to a SQLite
- * database after a given timeout.
- * This is good for reducing app's memory consumption, but it has
- * side effects that are hard to predict. For example, SQLite internally maintains
- * a lot of "per-connection" states that apps can typically modify with a {@code PRAGMA}
- * statement, and such states will be reset once the connection is closed.
- * The system does not provide a callback that would allow apps to
- * reconfigure a newly created connection and thus there's no way to re-configure
- * connections when they're re-made internally. Do not use it unless you're sure
- * your app uses no per-connection states.
+ * <p><b>DO NOT USE</b> this method.
+ * This feature has negative side effects that are very hard to foresee.
+ * <p>A connection timeout allows the system to internally close a connection to
+ * a SQLite database after a given timeout, which is good for reducing app's memory
+ * consumption.
+ * <b>However</b> the side effect is it <b>will reset all of SQLite's per-connection
+ * states</b>, which are typically modified with a {@code PRAGMA} statement, and
+ * these states <b>will not be restored</b> when a connection is re-established
+ * internally, and the system does not provide a callback for an app to reconfigure a
+ * connection.
+ * This feature may only be used if an app relies on none of such per-connection states.
*
* @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE}
* to allow unlimited idle connections.
*
* @see SQLiteOpenHelper#setIdleConnectionTimeout(long)
*
- * @deprecated DO NOT USE this method unless you fully understand the implication
- * of what it does.
+ * @deprecated DO NOT USE this method. See the javadoc for the details.
*/
@NonNull
@Deprecated
diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java
index 8163c4d412a7..62cec0e1aa92 100644
--- a/core/java/android/database/sqlite/SQLiteOpenHelper.java
+++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java
@@ -267,8 +267,8 @@ public abstract class SQLiteOpenHelper implements AutoCloseable {
* <p>This method should be called from the constructor of the subclass,
* before opening the database
*
- * <p>DO NOT USE this method unless you fully understand the implication
- * of what it does.
+ * <p><b>DO NOT USE</b> this method.
+ * This feature has negative side effects that are very hard to foresee.
* See the javadoc of
* {@link SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)}
* for the details.
@@ -278,8 +278,9 @@ public abstract class SQLiteOpenHelper implements AutoCloseable {
*
* @see SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)
*
- * @deprecated DO NOT USE this method unless you fully understand the implication
- * of what it does.
+ * @deprecated DO NOT USE this method. See the javadoc of
+ * {@link SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)}
+ * for the details.
*/
@Deprecated
public void setIdleConnectionTimeout(@IntRange(from = 0) final long idleConnectionTimeoutMs) {
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index f7b7ef2f0d58..a25bbdb8bf89 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -297,10 +297,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>Each key is only listed once in the list. The order of the keys is undefined.</p>
*
* @return List of camera characteristic keys that require the
- * {@link android.Manifest.permission#CAMERA} permission. The list can be null in case
+ * {@link android.Manifest.permission#CAMERA} permission. The list can be empty in case
* there are no currently present keys that need additional permission.
*/
- public List<Key<?>> getKeysNeedingPermission() {
+ public @NonNull List<Key<?>> getKeysNeedingPermission() {
if (mKeysNeedingPermission == null) {
Object crKey = CameraCharacteristics.Key.class;
Class<CameraCharacteristics.Key<?>> crKeyTyped =
@@ -308,7 +308,9 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
int[] filterTags = get(REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION);
if (filterTags == null) {
- return null;
+ mKeysNeedingPermission = Collections.unmodifiableList(
+ new ArrayList<CameraCharacteristics.Key<?>> ());
+ return mKeysNeedingPermission;
}
mKeysNeedingPermission =
getAvailableKeyList(CameraCharacteristics.class, crKeyTyped, filterTags,
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 536c2e13389b..234014327150 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -678,6 +678,31 @@ public final class CameraManager {
public void onCameraUnavailable(@NonNull String cameraId) {
// default empty implementation
}
+
+ /**
+ * Notify registered clients about a change in the camera access priorities.
+ *
+ * <p>Notification that camera access priorities have changed and the camera may
+ * now be openable. An application that was previously denied camera access due to
+ * a higher-priority user already using the camera, or that was disconnected from an
+ * active camera session due to a higher-priority user trying to open the camera,
+ * should try to open the camera again if it still wants to use it. Note that
+ * multiple applications may receive this callback at the same time, and only one of
+ * them will succeed in opening the camera in practice, depending on exact access
+ * priority levels and timing. This method is useful in cases where multiple
+ * applications may be in the resumed state at the same time, and the user switches
+ * focus between them, or if the current camera-using application moves between
+ * full-screen and Picture-in-Picture (PiP) states. In such cases, the camera
+ * available/unavailable callbacks will not be invoked, but another application may
+ * now have higher priority for camera access than the current camera-using
+ * application.</p>
+ *
+ * <p>The default implementation of this method does nothing.</p>
+ *
+ */
+ public void onCameraAccessPrioritiesChanged() {
+ // default empty implementation
+ }
}
/**
@@ -1098,6 +1123,22 @@ public final class CameraManager {
}
}
+ private void postSingleAccessPriorityChangeUpdate(final AvailabilityCallback callback,
+ final Executor executor) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ executor.execute(
+ new Runnable() {
+ @Override
+ public void run() {
+ callback.onCameraAccessPrioritiesChanged();
+ }
+ });
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
private void postSingleUpdate(final AvailabilityCallback callback, final Executor executor,
final String id, final int status) {
if (isAvailable(status)) {
@@ -1347,6 +1388,19 @@ public final class CameraManager {
}
}
+ @Override
+ public void onCameraAccessPrioritiesChanged() {
+ synchronized (mLock) {
+ final int callbackCount = mCallbackMap.size();
+ for (int i = 0; i < callbackCount; i++) {
+ Executor executor = mCallbackMap.valueAt(i);
+ final AvailabilityCallback callback = mCallbackMap.keyAt(i);
+
+ postSingleAccessPriorityChangeUpdate(callback, executor);
+ }
+ }
+ }
+
/**
* Try to connect to camera service after some delay if any client registered camera
* availability callback or torch status callback.
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 0900f3b11d4c..53d4dd3d36ee 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -4735,13 +4735,17 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>String containing the ID of the underlying active physical camera.</p>
* <p>The ID of the active physical camera that's backing the logical camera. All camera
* streams and metadata that are not physical camera specific will be originating from this
- * physical camera. This must be one of valid physical IDs advertised in the physicalIds
- * static tag.</p>
+ * physical camera.</p>
* <p>For a logical camera made up of physical cameras where each camera's lenses have
* different characteristics, the camera device may choose to switch between the physical
* cameras when application changes FOCAL_LENGTH or SCALER_CROP_REGION.
* At the time of lens switch, this result metadata reflects the new active physical camera
* ID.</p>
+ * <p>This key will be available if the camera device advertises this key via {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureResultKeys }.
+ * When available, this must be one of valid physical IDs backing this logical multi-camera.
+ * If this key is not available for a logical multi-camera, the camera device implementation
+ * may still switch between different active physical cameras based on use case, but the
+ * current active physical camera information won't be available to the application.</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*/
@PublicKey
diff --git a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
index b8e2d7adcf82..d44b6b5aeb29 100644
--- a/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
+++ b/core/java/android/hardware/camera2/params/MandatoryStreamCombination.java
@@ -19,9 +19,12 @@ package android.hardware.camera2.params;
import static com.android.internal.util.Preconditions.*;
import static android.hardware.camera2.params.StreamConfigurationMap.checkArgumentFormat;
+import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.graphics.ImageFormat;
+import android.graphics.ImageFormat.Format;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraCharacteristics.Key;
import android.hardware.camera2.CameraDevice;
@@ -44,8 +47,9 @@ import java.util.List;
/**
* Immutable class to store the available mandatory stream combination.
*
- * <p>The individual stream combinations are generated according to the guidelines
- * at {@link CameraDevice#createCaptureSession}.</p>
+ * <p>A mandatory stream combination refers to a specific entry in the documented sets of
+ * required stream {@link CameraDevice#createCaptureSession combinations}.
+ * These combinations of streams are required to be supported by the camera device.
*
* <p>The list of stream combinations is available by invoking
* {@link CameraCharacteristics#get} and passing key
@@ -88,7 +92,7 @@ public final class MandatoryStreamCombination {
* ImageFormat/PixelFormat.
* @hide
*/
- public MandatoryStreamInformation(@NonNull List<Size> availableSizes, int format,
+ public MandatoryStreamInformation(@NonNull List<Size> availableSizes, @Format int format,
boolean isInput) {
if (availableSizes.isEmpty()) {
throw new IllegalArgumentException("No available sizes");
@@ -118,7 +122,7 @@ public final class MandatoryStreamCombination {
*
* @return non-modifiable ascending list of available sizes.
*/
- public List<Size> getAvailableSizes() {
+ public @NonNull List<Size> getAvailableSizes() {
return Collections.unmodifiableList(mAvailableSizes);
}
@@ -127,7 +131,7 @@ public final class MandatoryStreamCombination {
*
* @return integer format.
*/
- public int getFormat() {
+ public @Format int getFormat() {
return mFormat;
}
@@ -187,7 +191,7 @@ public final class MandatoryStreamCombination {
* @hide
*/
public MandatoryStreamCombination(@NonNull List<MandatoryStreamInformation> streamsInformation,
- String description, boolean isReprocessable) {
+ @NonNull String description, boolean isReprocessable) {
if (streamsInformation.isEmpty()) {
throw new IllegalArgumentException("Empty stream information");
}
@@ -199,14 +203,16 @@ public final class MandatoryStreamCombination {
/**
* Get the mandatory stream combination description.
*
- * @return String with the mandatory combination description.
+ * @return CharSequence with the mandatory combination description.
*/
- public String getDescription() {
+ public @NonNull CharSequence getDescription() {
return mDescription;
}
/**
- * Indicates whether the mandatory stream combination is reprocessable.
+ * Indicates whether the mandatory stream combination is reprocessable. Reprocessable is defined
+ * as a stream combination that contains one input stream
+ * ({@link MandatoryStreamInformation#isInput} return true).
*
* @return {@code true} in case the mandatory stream combination contains an input,
* {@code false} otherwise.
@@ -221,7 +227,7 @@ public final class MandatoryStreamCombination {
* @return Non-modifiable list of stream information.
*
*/
- public List<MandatoryStreamInformation> getStreamsInformation() {
+ public @NonNull List<MandatoryStreamInformation> getStreamsInformation() {
return Collections.unmodifiableList(mStreamsInformation);
}
@@ -274,7 +280,8 @@ public final class MandatoryStreamCombination {
this(format, sizeThreshold, /*isInput*/false);
}
- public StreamTemplate(int format, SizeThreshold sizeThreshold, boolean isInput) {
+ public StreamTemplate(@Format int format, @NonNull SizeThreshold sizeThreshold,
+ boolean isInput) {
mFormat = format;
mSizeThreshold = sizeThreshold;
mIsInput = isInput;
@@ -286,11 +293,13 @@ public final class MandatoryStreamCombination {
public String mDescription;
public ReprocessType mReprocessType;
- public StreamCombinationTemplate(StreamTemplate[] streamTemplates, String description) {
+ public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
+ @NonNull String description) {
this(streamTemplates, description, /*reprocessType*/ReprocessType.NONE);
}
- public StreamCombinationTemplate(StreamTemplate[] streamTemplates, String description,
+ public StreamCombinationTemplate(@NonNull StreamTemplate[] streamTemplates,
+ @NonNull String description,
ReprocessType reprocessType) {
mStreamTemplates = streamTemplates;
mReprocessType = reprocessType;
@@ -680,7 +689,8 @@ public final class MandatoryStreamCombination {
* null in case device is not backward compatible or the method encounters
* an error.
*/
- public List<MandatoryStreamCombination> getAvailableMandatoryStreamCombinations() {
+ public @Nullable List<MandatoryStreamCombination>
+ getAvailableMandatoryStreamCombinations() {
if (!isColorOutputSupported()) {
Log.v(TAG, "Device is not backward compatible!");
return null;
@@ -767,8 +777,8 @@ public final class MandatoryStreamCombination {
* @return a non-modifiable list of supported mandatory stream combinations or
* null in case of errors.
*/
- private List<MandatoryStreamCombination> generateAvailableCombinations(
- ArrayList<StreamCombinationTemplate> availableTemplates) {
+ private @Nullable List<MandatoryStreamCombination> generateAvailableCombinations(
+ @NonNull ArrayList<StreamCombinationTemplate> availableTemplates) {
if (availableTemplates.isEmpty()) {
Log.e(TAG, "No available stream templates!");
return null;
@@ -873,7 +883,8 @@ public final class MandatoryStreamCombination {
/**
* Helper method to enumerate all available sizes according to size threshold and format.
*/
- private HashMap<Pair<SizeThreshold, Integer>, List<Size>> enumerateAvailableSizes() {
+ private @Nullable HashMap<Pair<SizeThreshold, Integer>, List<Size>>
+ enumerateAvailableSizes() {
final int[] formats = {
ImageFormat.PRIVATE,
ImageFormat.YUV_420_888,
@@ -935,12 +946,8 @@ public final class MandatoryStreamCombination {
* Compile a list of sizes smaller than or equal to given bound.
* Return an empty list if there is no size smaller than or equal to the bound.
*/
- private static List<Size> getSizesWithinBound(Size[] sizes, Size bound) {
- if (sizes == null || sizes.length == 0) {
- Log.e(TAG, "Empty or invalid size array!");
- return null;
- }
-
+ private static @Nullable List<Size> getSizesWithinBound(@NonNull Size[] sizes,
+ @NonNull Size bound) {
ArrayList<Size> ret = new ArrayList<Size>();
for (Size size : sizes) {
if (size.getWidth() <= bound.getWidth() && size.getHeight() <= bound.getHeight()) {
@@ -960,7 +967,7 @@ public final class MandatoryStreamCombination {
*
* @throws IllegalArgumentException if sizes was null or had 0 elements
*/
- public static Size getMaxSize(Size... sizes) {
+ public static @Nullable Size getMaxSize(@NonNull Size... sizes) {
if (sizes == null || sizes.length == 0) {
throw new IllegalArgumentException("sizes was empty");
}
@@ -1089,7 +1096,7 @@ public final class MandatoryStreamCombination {
*
* @return Maximum supported video size.
*/
- private Size getMaxRecordingSize() {
+ private @Nullable Size getMaxRecordingSize() {
int quality =
CamcorderProfile.hasProfile(mCameraId, CamcorderProfile.QUALITY_2160P) ?
CamcorderProfile.QUALITY_2160P :
@@ -1121,7 +1128,7 @@ public final class MandatoryStreamCombination {
*
* @return Maximum supported video size.
*/
- private Size getMaxExternalRecordingSize() {
+ private @NonNull Size getMaxExternalRecordingSize() {
final Size FULLHD = new Size(1920, 1080);
Size[] videoSizeArr = mStreamConfigMap.getOutputSizes(
@@ -1146,7 +1153,7 @@ public final class MandatoryStreamCombination {
return FULLHD; // doesn't matter what size is returned here
}
- private Size getMaxPreviewSize(List<Size> orderedPreviewSizes) {
+ private @NonNull Size getMaxPreviewSize(List<Size> orderedPreviewSizes) {
if (orderedPreviewSizes != null) {
for (Size size : orderedPreviewSizes) {
if ((mDisplaySize.getWidth() >= size.getWidth()) &&
@@ -1181,7 +1188,7 @@ public final class MandatoryStreamCombination {
*/
public static class SizeComparator implements Comparator<Size> {
@Override
- public int compare(Size lhs, Size rhs) {
+ public int compare(@NonNull Size lhs, @NonNull Size rhs) {
return compareSizes(lhs.getWidth(), lhs.getHeight(), rhs.getWidth(),
rhs.getHeight());
}
@@ -1199,12 +1206,8 @@ public final class MandatoryStreamCombination {
* @param ascending True if the order is ascending, otherwise descending order
* @return The ordered list of sizes
*/
- private static List<Size> getAscendingOrderSizes(final List<Size> sizeList,
- boolean ascending) {
- if (sizeList == null) {
- return null;
- }
-
+ private static @NonNull List<Size> getAscendingOrderSizes(
+ @NonNull final List<Size> sizeList, boolean ascending) {
Comparator<Size> comparator = new SizeComparator();
List<Size> sortedSizes = new ArrayList<Size>();
sortedSizes.addAll(sizeList);
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index ac44fe93ac31..ea63776dc5b6 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -185,6 +185,21 @@ public final class DisplayManagerGlobal {
}
/**
+ * Check if specified UID's content is present on display and should be granted access to it.
+ *
+ * @param uid UID to be checked.
+ * @param displayId id of the display where presence of the content is checked.
+ * @return {@code true} if UID is present on display, {@code false} otherwise.
+ */
+ public boolean isUidPresentOnDisplay(int uid, int displayId) {
+ try {
+ return mDm.isUidPresentOnDisplay(uid, displayId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Gets information about a logical display.
*
* The display metrics may be adjusted to provide compatibility
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index 43ea68297136..8231985970aa 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -187,14 +187,6 @@ public abstract class DisplayManagerInternal {
public abstract void setDisplayAccessUIDs(SparseArray<IntArray> displayAccessUIDs);
/**
- * Check if specified UID's content is present on display and should be granted access to it.
- *
- * @param uid UID to be checked.
- * @param displayId id of the display where presence of the content is checked.
- * */
- public abstract boolean isUidPresentOnDisplay(int uid, int displayId);
-
- /**
* Persist brightness slider events and ambient brightness stats.
*/
public abstract void persistBrightnessTrackerState();
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index edd20519bb53..0143c9129b50 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -34,6 +34,8 @@ interface IDisplayManager {
DisplayInfo getDisplayInfo(int displayId);
int[] getDisplayIds();
+ boolean isUidPresentOnDisplay(int uid, int displayId);
+
void registerCallback(in IDisplayManagerCallback callback);
// Requires CONFIGURE_WIFI_DISPLAY permission.
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 56020b24c556..aff385dc23e1 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -19,6 +19,7 @@ package android.hardware.hdmi;
import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
@@ -456,7 +457,7 @@ public final class HdmiControlManager {
* @hide
*/
@SystemApi
- public void powerOffRemoteDevice(HdmiDeviceInfo deviceInfo) {
+ public void powerOffRemoteDevice(@NonNull HdmiDeviceInfo deviceInfo) {
Preconditions.checkNotNull(deviceInfo);
try {
mService.powerOffRemoteDevice(
@@ -495,7 +496,7 @@ public final class HdmiControlManager {
* @hide
*/
@SystemApi
- public void requestRemoteDeviceToBecomeActiveSource(HdmiDeviceInfo deviceInfo) {
+ public void requestRemoteDeviceToBecomeActiveSource(@NonNull HdmiDeviceInfo deviceInfo) {
Preconditions.checkNotNull(deviceInfo);
try {
mService.askRemoteDeviceToBecomeActiveSource(deviceInfo.getPhysicalAddress());
@@ -566,7 +567,7 @@ public final class HdmiControlManager {
* @hide
*/
@SystemApi
- public boolean isRemoteDeviceConnected(HdmiDeviceInfo targetDevice) {
+ public boolean isRemoteDeviceConnected(@NonNull HdmiDeviceInfo targetDevice) {
Preconditions.checkNotNull(targetDevice);
mPhysicalAddress = getPhysicalAddress();
if (mPhysicalAddress == INVALID_PHYSICAL_ADDRESS) {
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 64ed32266217..1312f18a14ed 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -4293,6 +4293,8 @@ public class ConnectivityManager {
* @return {@code uid} if the connection is found and the app has permission to observe it
* (e.g., if it is associated with the calling VPN app's tunnel) or
* {@link android.os.Process#INVALID_UID} if the connection is not found.
+ * Throws {@link SecurityException} if the caller is not the active VPN for the current user.
+ * Throws {@link IllegalArgumentException} if an unsupported protocol is requested.
*/
public int getConnectionOwnerUid(int protocol, @NonNull InetSocketAddress local,
@NonNull InetSocketAddress remote) {
diff --git a/core/java/android/net/InetAddresses.java b/core/java/android/net/InetAddresses.java
index 8e6c69a97edb..01b795e456fa 100644
--- a/core/java/android/net/InetAddresses.java
+++ b/core/java/android/net/InetAddresses.java
@@ -16,6 +16,8 @@
package android.net;
+import android.annotation.NonNull;
+
import libcore.net.InetAddressUtils;
import java.net.InetAddress;
@@ -40,7 +42,7 @@ public class InetAddresses {
* @param address the address to parse.
* @return true if the supplied address is numeric, false otherwise.
*/
- public static boolean isNumericAddress(String address) {
+ public static boolean isNumericAddress(@NonNull String address) {
return InetAddressUtils.isNumericAddress(address);
}
@@ -57,7 +59,7 @@ public class InetAddresses {
* @return an {@link InetAddress} instance corresponding to the address.
* @throws IllegalArgumentException if {@code address} is not a numeric address.
*/
- public static InetAddress parseNumericAddress(String address) {
+ public static @NonNull InetAddress parseNumericAddress(@NonNull String address) {
return InetAddressUtils.parseNumericAddress(address);
}
}
diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java
index dcf64d538411..78a4e7293947 100644
--- a/core/java/android/net/LinkAddress.java
+++ b/core/java/android/net/LinkAddress.java
@@ -25,6 +25,7 @@ import static android.system.OsConstants.RT_SCOPE_LINK;
import static android.system.OsConstants.RT_SCOPE_SITE;
import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
@@ -177,7 +178,7 @@ public class LinkAddress implements Parcelable {
*/
@SystemApi
@TestApi
- public LinkAddress(InetAddress address, int prefixLength) {
+ public LinkAddress(@NonNull InetAddress address, int prefixLength) {
this(address, prefixLength, 0, 0);
this.scope = scopeForUnicastAddress(address);
}
@@ -196,12 +197,12 @@ public class LinkAddress implements Parcelable {
/**
* Constructs a new {@code LinkAddress} from a string such as "192.0.2.5/24" or
* "2001:db8::1/64". The flags are set to zero and the scope is determined from the address.
- * @param string The string to parse.
+ * @param address The string to parse.
* @hide
*/
@SystemApi
@TestApi
- public LinkAddress(String address) {
+ public LinkAddress(@NonNull String address) {
this(address, 0, 0);
this.scope = scopeForUnicastAddress(this.address);
}
@@ -209,7 +210,7 @@ public class LinkAddress implements Parcelable {
/**
* Constructs a new {@code LinkAddress} from a string such as "192.0.2.5/24" or
* "2001:db8::1/64", with the specified flags and scope.
- * @param string The string to parse.
+ * @param address The string to parse.
* @param flags The address flags.
* @param scope The address scope.
* @hide
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index a17ebcbedd1a..eb0fe33df03a 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -143,6 +143,7 @@ public final class NetworkCapabilities implements Parcelable {
NET_CAPABILITY_NOT_CONGESTED,
NET_CAPABILITY_NOT_SUSPENDED,
NET_CAPABILITY_OEM_PAID,
+ NET_CAPABILITY_MCX
})
public @interface NetCapability { }
@@ -297,8 +298,14 @@ public final class NetworkCapabilities implements Parcelable {
@SystemApi
public static final int NET_CAPABILITY_OEM_PAID = 22;
+ /**
+ * Indicates this is a network that has the ability to reach a carrier's Mission Critical
+ * servers.
+ */
+ public static final int NET_CAPABILITY_MCX = 23;
+
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
- private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_OEM_PAID;
+ private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_MCX;
/**
* Network capabilities that are expected to be mutable, i.e., can change while a particular
@@ -346,7 +353,8 @@ public final class NetworkCapabilities implements Parcelable {
(1 << NET_CAPABILITY_IA) |
(1 << NET_CAPABILITY_IMS) |
(1 << NET_CAPABILITY_RCS) |
- (1 << NET_CAPABILITY_XCAP);
+ (1 << NET_CAPABILITY_XCAP) |
+ (1 << NET_CAPABILITY_MCX);
/**
* Capabilities that force network to be restricted.
@@ -1614,6 +1622,7 @@ public final class NetworkCapabilities implements Parcelable {
case NET_CAPABILITY_NOT_CONGESTED: return "NOT_CONGESTED";
case NET_CAPABILITY_NOT_SUSPENDED: return "NOT_SUSPENDED";
case NET_CAPABILITY_OEM_PAID: return "OEM_PAID";
+ case NET_CAPABILITY_MCX: return "MCX";
default: return Integer.toString(capability);
}
}
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 84368e144320..fdf5321ec8de 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -402,7 +402,7 @@ public abstract class Uri implements Parcelable, Comparable<Uri> {
}
return builder.toString();
} else if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")
- || scheme.equalsIgnoreCase("ftp")) {
+ || scheme.equalsIgnoreCase("ftp") || scheme.equalsIgnoreCase("rtsp")) {
ssp = "//" + ((getHost() != null) ? getHost() : "")
+ ((getPort() != -1) ? (":" + getPort()) : "")
+ "/...";
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index ebb1ae4bb795..870d8b1b7c22 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -20,6 +20,7 @@ import static android.system.OsConstants.AF_INET;
import static android.system.OsConstants.AF_INET6;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
@@ -479,7 +480,8 @@ public class VpnService extends Service {
* system-managed dialogs and notifications. This is recommended
* not required.
*/
- public Builder setSession(String session) {
+ @NonNull
+ public Builder setSession(@NonNull String session) {
mConfig.session = session;
return this;
}
@@ -489,7 +491,8 @@ public class VpnService extends Service {
* configure the VPN connection. If it is not set, the button
* to configure will not be shown in system-managed dialogs.
*/
- public Builder setConfigureIntent(PendingIntent intent) {
+ @NonNull
+ public Builder setConfigureIntent(@NonNull PendingIntent intent) {
mConfig.configureIntent = intent;
return this;
}
@@ -501,6 +504,7 @@ public class VpnService extends Service {
*
* @throws IllegalArgumentException if the value is not positive.
*/
+ @NonNull
public Builder setMtu(int mtu) {
if (mtu <= 0) {
throw new IllegalArgumentException("Bad mtu");
@@ -513,6 +517,7 @@ public class VpnService extends Service {
* Sets an HTTP proxy for the VPN network. This proxy is only a recommendation
* and it is possible that some apps will ignore it.
*/
+ @NonNull
public Builder setHttpProxy(@NonNull ProxyInfo proxyInfo) {
mConfig.proxyInfo = proxyInfo;
return this;
@@ -528,7 +533,8 @@ public class VpnService extends Service {
*
* @throws IllegalArgumentException if the address is invalid.
*/
- public Builder addAddress(InetAddress address, int prefixLength) {
+ @NonNull
+ public Builder addAddress(@NonNull InetAddress address, int prefixLength) {
check(address, prefixLength);
if (address.isAnyLocalAddress()) {
@@ -550,7 +556,8 @@ public class VpnService extends Service {
* @throws IllegalArgumentException if the address is invalid.
* @see #addAddress(InetAddress, int)
*/
- public Builder addAddress(String address, int prefixLength) {
+ @NonNull
+ public Builder addAddress(@NonNull String address, int prefixLength) {
return addAddress(InetAddress.parseNumericAddress(address), prefixLength);
}
@@ -563,7 +570,8 @@ public class VpnService extends Service {
*
* @throws IllegalArgumentException if the route is invalid.
*/
- public Builder addRoute(InetAddress address, int prefixLength) {
+ @NonNull
+ public Builder addRoute(@NonNull InetAddress address, int prefixLength) {
check(address, prefixLength);
int offset = prefixLength / 8;
@@ -591,7 +599,8 @@ public class VpnService extends Service {
* @throws IllegalArgumentException if the route is invalid.
* @see #addRoute(InetAddress, int)
*/
- public Builder addRoute(String address, int prefixLength) {
+ @NonNull
+ public Builder addRoute(@NonNull String address, int prefixLength) {
return addRoute(InetAddress.parseNumericAddress(address), prefixLength);
}
@@ -605,7 +614,8 @@ public class VpnService extends Service {
*
* @throws IllegalArgumentException if the address is invalid.
*/
- public Builder addDnsServer(InetAddress address) {
+ @NonNull
+ public Builder addDnsServer(@NonNull InetAddress address) {
if (address.isLoopbackAddress() || address.isAnyLocalAddress()) {
throw new IllegalArgumentException("Bad address");
}
@@ -627,14 +637,16 @@ public class VpnService extends Service {
* @throws IllegalArgumentException if the address is invalid.
* @see #addDnsServer(InetAddress)
*/
- public Builder addDnsServer(String address) {
+ @NonNull
+ public Builder addDnsServer(@NonNull String address) {
return addDnsServer(InetAddress.parseNumericAddress(address));
}
/**
* Add a search domain to the DNS resolver.
*/
- public Builder addSearchDomain(String domain) {
+ @NonNull
+ public Builder addSearchDomain(@NonNull String domain) {
if (mConfig.searchDomains == null) {
mConfig.searchDomains = new ArrayList<String>();
}
@@ -660,6 +672,7 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining of method calls.
*/
+ @NonNull
public Builder allowFamily(int family) {
if (family == AF_INET) {
mConfig.allowIPv4 = true;
@@ -703,7 +716,8 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining method calls.
*/
- public Builder addAllowedApplication(String packageName)
+ @NonNull
+ public Builder addAllowedApplication(@NonNull String packageName)
throws PackageManager.NameNotFoundException {
if (mConfig.disallowedApplications != null) {
throw new UnsupportedOperationException("addDisallowedApplication already called");
@@ -735,7 +749,8 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining method calls.
*/
- public Builder addDisallowedApplication(String packageName)
+ @NonNull
+ public Builder addDisallowedApplication(@NonNull String packageName)
throws PackageManager.NameNotFoundException {
if (mConfig.allowedApplications != null) {
throw new UnsupportedOperationException("addAllowedApplication already called");
@@ -758,6 +773,7 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining of method calls.
*/
+ @NonNull
public Builder allowBypass() {
mConfig.allowBypass = true;
return this;
@@ -772,6 +788,7 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining method calls.
*/
+ @NonNull
public Builder setBlocking(boolean blocking) {
mConfig.blocking = blocking;
return this;
@@ -786,7 +803,8 @@ public class VpnService extends Service {
*
* @return this {@link Builder} object to facilitate chaining method calls.
*/
- public Builder setUnderlyingNetworks(Network[] networks) {
+ @NonNull
+ public Builder setUnderlyingNetworks(@Nullable Network[] networks) {
mConfig.underlyingNetworks = networks != null ? networks.clone() : null;
return this;
}
@@ -807,6 +825,7 @@ public class VpnService extends Service {
* @see #setUnderlyingNetworks(Networks[])
* @see ConnectivityManager#isActiveNetworkMetered()
*/
+ @NonNull
public Builder setMetered(boolean isMetered) {
mConfig.isMetered = isMetered;
return this;
@@ -855,6 +874,7 @@ public class VpnService extends Service {
* in {@code AndroidManifest.xml}.
* @see VpnService
*/
+ @Nullable
public ParcelFileDescriptor establish() {
mConfig.addresses = mAddresses;
mConfig.routes = mRoutes;
diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java
index 6fcd6ebe148a..01dd08f4ad9c 100644
--- a/core/java/android/net/http/SslCertificate.java
+++ b/core/java/android/net/http/SslCertificate.java
@@ -16,6 +16,7 @@
package android.net.http;
+import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Bundle;
@@ -252,7 +253,7 @@ public class SslCertificate {
* @return The {@code X509Certificate} used to create this {@code SslCertificate} or
* {@code null} if no certificate was provided.
*/
- public X509Certificate getX509Certificate() {
+ public @Nullable X509Certificate getX509Certificate() {
return mX509Certificate;
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 4b32df798e68..c906d33a081e 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -764,8 +764,14 @@ public final class PowerManager {
*/
public static final int LOCATION_MODE_FOREGROUND_ONLY = 3;
+ /**
+ * In this mode, location will not be turned off, but LocationManager will throttle all
+ * requests to providers when the device is non-interactive.
+ */
+ public static final int LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF = 4;
+
static final int MIN_LOCATION_MODE = LOCATION_MODE_NO_CHANGE;
- static final int MAX_LOCATION_MODE = LOCATION_MODE_FOREGROUND_ONLY;
+ static final int MAX_LOCATION_MODE = LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF;
/**
* @hide
@@ -776,9 +782,28 @@ public final class PowerManager {
LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF,
LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF,
LOCATION_MODE_FOREGROUND_ONLY,
+ LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF,
})
public @interface LocationPowerSaveMode {}
+ /** @hide */
+ public static String locationPowerSaveModeToString(@LocationPowerSaveMode int mode) {
+ switch (mode) {
+ case LOCATION_MODE_NO_CHANGE:
+ return "NO_CHANGE";
+ case LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF:
+ return "GPS_DISABLED_WHEN_SCREEN_OFF";
+ case LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF:
+ return "ALL_DISABLED_WHEN_SCREEN_OFF";
+ case LOCATION_MODE_FOREGROUND_ONLY:
+ return "FOREGROUND_ONLY";
+ case LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF:
+ return "THROTTLE_REQUESTS_WHEN_SCREEN_OFF";
+ default:
+ return Integer.toString(mode);
+ }
+ }
+
final Context mContext;
final IPowerManager mService;
final Handler mHandler;
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index cd43b42c8ca5..03fc2a947051 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -529,7 +529,8 @@ public class Process {
return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
- packagesForUid, sandboxId, /*useBlastulaPool=*/ true, zygoteArgs);
+ packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ true,
+ zygoteArgs);
}
/** @hide */
@@ -550,7 +551,8 @@ public class Process {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
- packagesForUid, sandboxId, /*useBlastulaPool=*/ false, zygoteArgs);
+ packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ false,
+ zygoteArgs);
}
/**
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 650232f79738..60f4f06c9617 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -82,9 +82,9 @@ public class ZygoteProcess {
private static final String LOG_TAG = "ZygoteProcess";
/**
- * The default value for enabling the blastula pool.
+ * The default value for enabling the unspecialized app process (USAP) pool.
*/
- private static final String BLASTULA_POOL_ENABLED_DEFAULT = "false";
+ private static final String USAP_POOL_ENABLED_DEFAULT = "false";
/**
* The name of the socket used to communicate with the primary zygote.
@@ -97,14 +97,14 @@ public class ZygoteProcess {
private final LocalSocketAddress mZygoteSecondarySocketAddress;
/**
- * The name of the socket used to communicate with the primary blastula pool.
+ * The name of the socket used to communicate with the primary USAP pool.
*/
- private final LocalSocketAddress mBlastulaPoolSocketAddress;
+ private final LocalSocketAddress mUsapPoolSocketAddress;
/**
- * The name of the socket used to communicate with the secondary (alternate ABI) blastula pool.
+ * The name of the socket used to communicate with the secondary (alternate ABI) USAP pool.
*/
- private final LocalSocketAddress mBlastulaPoolSecondarySocketAddress;
+ private final LocalSocketAddress mUsapPoolSecondarySocketAddress;
public ZygoteProcess() {
mZygoteSocketAddress =
@@ -114,15 +114,15 @@ public class ZygoteProcess {
new LocalSocketAddress(Zygote.SECONDARY_SOCKET_NAME,
LocalSocketAddress.Namespace.RESERVED);
- mBlastulaPoolSocketAddress =
- new LocalSocketAddress(Zygote.BLASTULA_POOL_PRIMARY_SOCKET_NAME,
+ mUsapPoolSocketAddress =
+ new LocalSocketAddress(Zygote.USAP_POOL_PRIMARY_SOCKET_NAME,
LocalSocketAddress.Namespace.RESERVED);
- mBlastulaPoolSecondarySocketAddress =
- new LocalSocketAddress(Zygote.BLASTULA_POOL_SECONDARY_SOCKET_NAME,
+ mUsapPoolSecondarySocketAddress =
+ new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
LocalSocketAddress.Namespace.RESERVED);
- if (fetchBlastulaPoolEnabledProp()) {
- informZygotesOfBlastulaPoolStatus();
+ if (fetchUsapPoolEnabledProp()) {
+ informZygotesOfUsapPoolStatus();
}
}
@@ -131,8 +131,8 @@ public class ZygoteProcess {
mZygoteSocketAddress = primarySocketAddress;
mZygoteSecondarySocketAddress = secondarySocketAddress;
- mBlastulaPoolSocketAddress = null;
- mBlastulaPoolSecondarySocketAddress = null;
+ mUsapPoolSocketAddress = null;
+ mUsapPoolSecondarySocketAddress = null;
}
public LocalSocketAddress getPrimarySocketAddress() {
@@ -144,7 +144,7 @@ public class ZygoteProcess {
*/
public static class ZygoteState {
final LocalSocketAddress mZygoteSocketAddress;
- final LocalSocketAddress mBlastulaSocketAddress;
+ final LocalSocketAddress mUsapSocketAddress;
private final LocalSocket mZygoteSessionSocket;
@@ -156,13 +156,13 @@ public class ZygoteProcess {
private boolean mClosed;
private ZygoteState(LocalSocketAddress zygoteSocketAddress,
- LocalSocketAddress blastulaSocketAddress,
+ LocalSocketAddress usapSocketAddress,
LocalSocket zygoteSessionSocket,
DataInputStream zygoteInputStream,
BufferedWriter zygoteOutputWriter,
List<String> abiList) {
this.mZygoteSocketAddress = zygoteSocketAddress;
- this.mBlastulaSocketAddress = blastulaSocketAddress;
+ this.mUsapSocketAddress = usapSocketAddress;
this.mZygoteSessionSocket = zygoteSessionSocket;
this.mZygoteInputStream = zygoteInputStream;
this.mZygoteOutputWriter = zygoteOutputWriter;
@@ -171,16 +171,16 @@ public class ZygoteProcess {
/**
* Create a new ZygoteState object by connecting to the given Zygote socket and saving the
- * given blastula socket address.
+ * given USAP socket address.
*
* @param zygoteSocketAddress Zygote socket to connect to
- * @param blastulaSocketAddress Blastula socket address to save for later
+ * @param usapSocketAddress USAP socket address to save for later
* @return A new ZygoteState object containing a session socket for the given Zygote socket
* address
* @throws IOException
*/
public static ZygoteState connect(LocalSocketAddress zygoteSocketAddress,
- LocalSocketAddress blastulaSocketAddress)
+ LocalSocketAddress usapSocketAddress)
throws IOException {
DataInputStream zygoteInputStream = null;
@@ -202,16 +202,16 @@ public class ZygoteProcess {
throw ex;
}
- return new ZygoteState(zygoteSocketAddress, blastulaSocketAddress,
+ return new ZygoteState(zygoteSocketAddress, usapSocketAddress,
zygoteSessionSocket, zygoteInputStream, zygoteOutputWriter,
getAbiList(zygoteOutputWriter, zygoteInputStream));
}
- LocalSocket getBlastulaSessionSocket() throws IOException {
- final LocalSocket blastulaSessionSocket = new LocalSocket();
- blastulaSessionSocket.connect(this.mBlastulaSocketAddress);
+ LocalSocket getUsapSessionSocket() throws IOException {
+ final LocalSocket usapSessionSocket = new LocalSocket();
+ usapSessionSocket.connect(this.mUsapSocketAddress);
- return blastulaSessionSocket;
+ return usapSessionSocket;
}
boolean matches(String abi) {
@@ -268,13 +268,13 @@ public class ZygoteProcess {
private ZygoteState secondaryZygoteState;
/**
- * If the blastula pool should be created and used to start applications.
+ * If the USAP pool should be created and used to start applications.
*
- * Setting this value to false will disable the creation, maintenance, and use of the blastula
- * pool. When the blastula pool is disabled the application lifecycle will be identical to
+ * Setting this value to false will disable the creation, maintenance, and use of the USAP
+ * pool. When the USAP pool is disabled the application lifecycle will be identical to
* previous versions of Android.
*/
- private boolean mBlastulaPoolEnabled = false;
+ private boolean mUsapPoolEnabled = false;
/**
* Start a new process.
@@ -328,11 +328,11 @@ public class ZygoteProcess {
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
- boolean useBlastulaPool,
+ boolean useUsapPool,
@Nullable String[] zygoteArgs) {
// TODO (chriswailes): Is there a better place to check this value?
- if (fetchBlastulaPoolEnabledPropWithMinInterval()) {
- informZygotesOfBlastulaPoolStatus();
+ if (fetchUsapPoolEnabledPropWithMinInterval()) {
+ informZygotesOfUsapPoolStatus();
}
try {
@@ -340,7 +340,7 @@ public class ZygoteProcess {
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/false,
packageName, packagesForUid, sandboxId,
- useBlastulaPool, zygoteArgs);
+ useUsapPool, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
@@ -388,7 +388,7 @@ public class ZygoteProcess {
*/
@GuardedBy("mLock")
private Process.ProcessStartResult zygoteSendArgsAndGetResult(
- ZygoteState zygoteState, boolean useBlastulaPool, ArrayList<String> args)
+ ZygoteState zygoteState, boolean useUsapPool, ArrayList<String> args)
throws ZygoteStartFailedEx {
// Throw early if any of the arguments are malformed. This means we can
// avoid writing a partial response to the zygote.
@@ -415,41 +415,41 @@ public class ZygoteProcess {
Process.ProcessStartResult result = new Process.ProcessStartResult();
// TODO (chriswailes): Move branch body into separate function.
- if (useBlastulaPool && mBlastulaPoolEnabled && isValidBlastulaCommand(args)) {
- LocalSocket blastulaSessionSocket = null;
+ if (useUsapPool && mUsapPoolEnabled && isValidUsapCommand(args)) {
+ LocalSocket usapSessionSocket = null;
try {
- blastulaSessionSocket = zygoteState.getBlastulaSessionSocket();
+ usapSessionSocket = zygoteState.getUsapSessionSocket();
- final BufferedWriter blastulaWriter =
+ final BufferedWriter usapWriter =
new BufferedWriter(
- new OutputStreamWriter(blastulaSessionSocket.getOutputStream()),
+ new OutputStreamWriter(usapSessionSocket.getOutputStream()),
Zygote.SOCKET_BUFFER_SIZE);
- final DataInputStream blastulaReader =
- new DataInputStream(blastulaSessionSocket.getInputStream());
+ final DataInputStream usapReader =
+ new DataInputStream(usapSessionSocket.getInputStream());
- blastulaWriter.write(msgStr);
- blastulaWriter.flush();
+ usapWriter.write(msgStr);
+ usapWriter.flush();
- result.pid = blastulaReader.readInt();
- // Blastulas can't be used to spawn processes that need wrappers.
+ result.pid = usapReader.readInt();
+ // USAPs can't be used to spawn processes that need wrappers.
result.usingWrapper = false;
if (result.pid < 0) {
- throw new ZygoteStartFailedEx("Blastula specialization failed");
+ throw new ZygoteStartFailedEx("USAP specialization failed");
}
return result;
} catch (IOException ex) {
- // If there was an IOException using the blastula pool we will log the error and
+ // If there was an IOException using the USAP pool we will log the error and
// attempt to start the process through the Zygote.
- Log.e(LOG_TAG, "IO Exception while communicating with blastula pool - "
+ Log.e(LOG_TAG, "IO Exception while communicating with USAP pool - "
+ ex.getMessage());
} finally {
try {
- blastulaSessionSocket.close();
+ usapSessionSocket.close();
} catch (IOException ex) {
- Log.e(LOG_TAG, "Failed to close blastula session socket: " + ex.getMessage());
+ Log.e(LOG_TAG, "Failed to close USAP session socket: " + ex.getMessage());
}
}
}
@@ -481,9 +481,9 @@ public class ZygoteProcess {
}
/**
- * Flags that may not be passed to a blastula.
+ * Flags that may not be passed to a USAP.
*/
- private static final String[] INVALID_BLASTULA_FLAGS = {
+ private static final String[] INVALID_USAP_FLAGS = {
"--query-abi-list",
"--get-pid",
"--preload-default",
@@ -497,13 +497,13 @@ public class ZygoteProcess {
};
/**
- * Tests a command list to see if it is valid to send to a blastula.
- * @param args Zygote/Blastula command arguments
- * @return True if the command can be passed to a blastula; false otherwise
+ * Tests a command list to see if it is valid to send to a USAP.
+ * @param args Zygote/USAP command arguments
+ * @return True if the command can be passed to a USAP; false otherwise
*/
- private static boolean isValidBlastulaCommand(ArrayList<String> args) {
+ private static boolean isValidUsapCommand(ArrayList<String> args) {
for (String flag : args) {
- for (String badFlag : INVALID_BLASTULA_FLAGS) {
+ for (String badFlag : INVALID_USAP_FLAGS) {
if (flag.startsWith(badFlag)) {
return false;
}
@@ -551,7 +551,7 @@ public class ZygoteProcess {
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
- boolean useBlastulaPool,
+ boolean useUnspecializedAppProcessPool,
@Nullable String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<String>();
@@ -651,41 +651,41 @@ public class ZygoteProcess {
synchronized(mLock) {
return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
- useBlastulaPool,
+ useUnspecializedAppProcessPool,
argsForZygote);
}
}
- private boolean fetchBlastulaPoolEnabledProp() {
- boolean origVal = mBlastulaPoolEnabled;
+ private boolean fetchUsapPoolEnabledProp() {
+ boolean origVal = mUsapPoolEnabled;
final String propertyString =
Zygote.getSystemProperty(
- DeviceConfig.RuntimeNative.BLASTULA_POOL_ENABLED,
- BLASTULA_POOL_ENABLED_DEFAULT);
+ DeviceConfig.RuntimeNative.USAP_POOL_ENABLED,
+ USAP_POOL_ENABLED_DEFAULT);
if (!propertyString.isEmpty()) {
- mBlastulaPoolEnabled =
+ mUsapPoolEnabled =
Zygote.getSystemPropertyBoolean(
- DeviceConfig.RuntimeNative.BLASTULA_POOL_ENABLED,
- Boolean.parseBoolean(BLASTULA_POOL_ENABLED_DEFAULT));
+ DeviceConfig.RuntimeNative.USAP_POOL_ENABLED,
+ Boolean.parseBoolean(USAP_POOL_ENABLED_DEFAULT));
}
- if (origVal != mBlastulaPoolEnabled) {
- Log.i(LOG_TAG, "blastulaPoolEnabled = " + mBlastulaPoolEnabled);
+ if (origVal != mUsapPoolEnabled) {
+ Log.i(LOG_TAG, "usapPoolEnabled = " + mUsapPoolEnabled);
}
- return origVal != mBlastulaPoolEnabled;
+ return origVal != mUsapPoolEnabled;
}
private long mLastPropCheckTimestamp = 0;
- private boolean fetchBlastulaPoolEnabledPropWithMinInterval() {
+ private boolean fetchUsapPoolEnabledPropWithMinInterval() {
final long currentTimestamp = SystemClock.elapsedRealtime();
if (currentTimestamp - mLastPropCheckTimestamp >= Zygote.PROPERTY_CHECK_INTERVAL) {
mLastPropCheckTimestamp = currentTimestamp;
- return fetchBlastulaPoolEnabledProp();
+ return fetchUsapPoolEnabledProp();
}
return false;
@@ -882,7 +882,7 @@ public class ZygoteProcess {
private void attemptConnectionToPrimaryZygote() throws IOException {
if (primaryZygoteState == null || primaryZygoteState.isClosed()) {
primaryZygoteState =
- ZygoteState.connect(mZygoteSocketAddress, mBlastulaPoolSocketAddress);
+ ZygoteState.connect(mZygoteSocketAddress, mUsapPoolSocketAddress);
maybeSetApiBlacklistExemptions(primaryZygoteState, false);
maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
@@ -897,7 +897,7 @@ public class ZygoteProcess {
if (secondaryZygoteState == null || secondaryZygoteState.isClosed()) {
secondaryZygoteState =
ZygoteState.connect(mZygoteSecondarySocketAddress,
- mBlastulaPoolSecondarySocketAddress);
+ mUsapPoolSecondarySocketAddress);
maybeSetApiBlacklistExemptions(secondaryZygoteState, false);
maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState);
@@ -1052,11 +1052,11 @@ public class ZygoteProcess {
}
/**
- * Sends messages to the zygotes telling them to change the status of their blastula pools. If
+ * Sends messages to the zygotes telling them to change the status of their USAP pools. If
* this notification fails the ZygoteProcess will fall back to the previous behavior.
*/
- private void informZygotesOfBlastulaPoolStatus() {
- final String command = "1\n--blastula-pool-enabled=" + mBlastulaPoolEnabled + "\n";
+ private void informZygotesOfUsapPoolStatus() {
+ final String command = "1\n--usap-pool-enabled=" + mUsapPoolEnabled + "\n";
synchronized (mLock) {
try {
@@ -1065,8 +1065,8 @@ public class ZygoteProcess {
primaryZygoteState.mZygoteOutputWriter.write(command);
primaryZygoteState.mZygoteOutputWriter.flush();
} catch (IOException ioe) {
- mBlastulaPoolEnabled = !mBlastulaPoolEnabled;
- Log.w(LOG_TAG, "Failed to inform zygotes of blastula pool status: "
+ mUsapPoolEnabled = !mUsapPoolEnabled;
+ Log.w(LOG_TAG, "Failed to inform zygotes of USAP pool status: "
+ ioe.getMessage());
return;
}
@@ -1082,7 +1082,7 @@ public class ZygoteProcess {
secondaryZygoteState.mZygoteInputStream.readInt();
} catch (IOException ioe) {
throw new IllegalStateException(
- "Blastula pool state change cause an irrecoverable error",
+ "USAP pool state change cause an irrecoverable error",
ioe);
}
} catch (IOException ioe) {
@@ -1096,7 +1096,7 @@ public class ZygoteProcess {
primaryZygoteState.mZygoteInputStream.readInt();
} catch (IOException ioe) {
throw new IllegalStateException(
- "Blastula pool state change cause an irrecoverable error",
+ "USAP pool state change cause an irrecoverable error",
ioe);
}
}
@@ -1150,7 +1150,7 @@ public class ZygoteProcess {
abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
true /* startChildZygote */, null /* packageName */,
null /* packagesForUid */, null /* sandboxId */,
- false /* useBlastulaPool */, extraArgs);
+ false /* useUsapPool */, extraArgs);
} catch (ZygoteStartFailedEx ex) {
throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
}
diff --git a/core/java/android/permission/IPermissionController.aidl b/core/java/android/permission/IPermissionController.aidl
index cb2517e956df..76e911ddaf5a 100644
--- a/core/java/android/permission/IPermissionController.aidl
+++ b/core/java/android/permission/IPermissionController.aidl
@@ -40,6 +40,7 @@ oneway interface IPermissionController {
void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback);
void isApplicationQualifiedForRole(String roleName, String packageName,
in RemoteCallback callback);
+ void isRoleVisible(String roleName, in RemoteCallback callback);
void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, String packageName,
String permission, int grantState, in RemoteCallback callback);
}
diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java
index 9d58064ab6d0..5695e42bef8e 100644
--- a/core/java/android/permission/PermissionControllerManager.java
+++ b/core/java/android/permission/PermissionControllerManager.java
@@ -476,6 +476,26 @@ public final class PermissionControllerManager {
}
/**
+ * Check whether a role should be visible to user.
+ *
+ * @param roleName name of the role to check for
+ * @param executor Executor on which to invoke the callback
+ * @param callback Callback to receive the result
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS)
+ public void isRoleVisible(@NonNull String roleName,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ checkStringNotEmpty(roleName);
+ checkNotNull(executor);
+ checkNotNull(callback);
+
+ mRemoteService.scheduleRequest(new PendingIsRoleVisibleRequest(mRemoteService, roleName,
+ executor, callback));
+ }
+
+ /**
* A connection to the remote service
*/
static final class RemoteService extends
@@ -1222,4 +1242,55 @@ public final class PermissionControllerManager {
}
}
}
+
+ /**
+ * Request for {@link #isRoleVisible}.
+ */
+ private static final class PendingIsRoleVisibleRequest extends
+ AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> {
+
+ private final @NonNull String mRoleName;
+ private final @NonNull Consumer<Boolean> mCallback;
+
+ private final @NonNull RemoteCallback mRemoteCallback;
+
+ private PendingIsRoleVisibleRequest(@NonNull RemoteService service,
+ @NonNull String roleName, @NonNull @CallbackExecutor Executor executor,
+ @NonNull Consumer<Boolean> callback) {
+ super(service);
+
+ mRoleName = roleName;
+ mCallback = callback;
+
+ mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> {
+ long token = Binder.clearCallingIdentity();
+ try {
+ boolean visible;
+ if (result != null) {
+ visible = result.getBoolean(KEY_RESULT);
+ } else {
+ visible = false;
+ }
+ callback.accept(visible);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ finish();
+ }
+ }), null);
+ }
+
+ @Override
+ protected void onTimeout(RemoteService remoteService) {
+ mCallback.accept(false);
+ }
+
+ @Override
+ public void run() {
+ try {
+ getService().getServiceInterface().isRoleVisible(mRoleName, mRemoteCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error checking whether role should be visible", e);
+ }
+ }
+ }
}
diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java
index e883d25ab0bd..d375c10e6d4c 100644
--- a/core/java/android/permission/PermissionControllerService.java
+++ b/core/java/android/permission/PermissionControllerService.java
@@ -179,12 +179,21 @@ public abstract class PermissionControllerService extends Service {
* @param roleName name of the role to check for
* @param packageName package name of the application to check for
*
- * @return whether the application is qualified for the role.
+ * @return whether the application is qualified for the role
*/
public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName,
@NonNull String packageName);
/**
+ * Check whether a role should be visible to user.
+ *
+ * @param roleName name of the role to check for
+ *
+ * @return whether the role should be visible to user
+ */
+ public abstract boolean onIsRoleVisible(@NonNull String roleName);
+
+ /**
* Set the runtime permission state from a device admin.
*
* @param callerPackageName The package name of the admin requesting the change
@@ -197,7 +206,7 @@ public abstract class PermissionControllerService extends Service {
@NonNull String permission, @PermissionGrantState int grantState);
@Override
- public final IBinder onBind(Intent intent) {
+ public final @NonNull IBinder onBind(Intent intent) {
return new IPermissionController.Stub() {
@Override
public void revokeRuntimePermissions(
@@ -344,6 +353,18 @@ public abstract class PermissionControllerService extends Service {
}
@Override
+ public void isRoleVisible(String roleName, RemoteCallback callback) {
+ checkStringNotEmpty(roleName);
+ checkNotNull(callback, "callback");
+
+ enforceCallingPermission(Manifest.permission.MANAGE_ROLE_HOLDERS, null);
+
+ mHandler.sendMessage(obtainMessage(
+ PermissionControllerService::isRoleVisible,
+ PermissionControllerService.this, roleName, callback));
+ }
+
+ @Override
public void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName,
String packageName, String permission, int grantState,
RemoteCallback callback) {
@@ -445,6 +466,13 @@ public abstract class PermissionControllerService extends Service {
callback.sendResult(result);
}
+ private void isRoleVisible(@NonNull String roleName, @NonNull RemoteCallback callback) {
+ boolean visible = onIsRoleVisible(roleName);
+ Bundle result = new Bundle();
+ result.putBoolean(PermissionControllerManager.KEY_RESULT, visible);
+ callback.sendResult(result);
+ }
+
private void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName,
@NonNull String packageName, @NonNull String permission,
@PermissionGrantState int grantState, @NonNull RemoteCallback callback) {
diff --git a/core/java/android/permission/RuntimePermissionPresentationInfo.java b/core/java/android/permission/RuntimePermissionPresentationInfo.java
index d66789fa1ac2..4fce14cef3f0 100644
--- a/core/java/android/permission/RuntimePermissionPresentationInfo.java
+++ b/core/java/android/permission/RuntimePermissionPresentationInfo.java
@@ -21,6 +21,8 @@ import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.util.Preconditions;
+
/**
* This class contains information about how a runtime permission
* is to be presented in the UI. A single runtime permission
@@ -35,7 +37,7 @@ public final class RuntimePermissionPresentationInfo implements Parcelable {
private static final int FLAG_GRANTED = 1 << 0;
private static final int FLAG_STANDARD = 1 << 1;
- private final CharSequence mLabel;
+ private final @NonNull CharSequence mLabel;
private final int mFlags;
/**
@@ -45,8 +47,10 @@ public final class RuntimePermissionPresentationInfo implements Parcelable {
* @param granted Whether the permission is granted.
* @param standard Whether this is a platform-defined permission.
*/
- public RuntimePermissionPresentationInfo(CharSequence label,
+ public RuntimePermissionPresentationInfo(@NonNull CharSequence label,
boolean granted, boolean standard) {
+ Preconditions.checkNotNull(label);
+
mLabel = label;
int flags = 0;
if (granted) {
@@ -58,11 +62,6 @@ public final class RuntimePermissionPresentationInfo implements Parcelable {
mFlags = flags;
}
- private RuntimePermissionPresentationInfo(Parcel parcel) {
- mLabel = parcel.readCharSequence();
- mFlags = parcel.readInt();
- }
-
/**
* @return Whether the permission is granted.
*/
@@ -97,10 +96,14 @@ public final class RuntimePermissionPresentationInfo implements Parcelable {
parcel.writeInt(mFlags);
}
- public static final @android.annotation.NonNull Creator<RuntimePermissionPresentationInfo> CREATOR =
+ public static final @NonNull Creator<RuntimePermissionPresentationInfo> CREATOR =
new Creator<RuntimePermissionPresentationInfo>() {
public RuntimePermissionPresentationInfo createFromParcel(Parcel source) {
- return new RuntimePermissionPresentationInfo(source);
+ CharSequence label = source.readCharSequence();
+ int flags = source.readInt();
+
+ return new RuntimePermissionPresentationInfo(label, (flags & FLAG_GRANTED) != 0,
+ (flags & FLAG_STANDARD) != 0);
}
public RuntimePermissionPresentationInfo[] newArray(int size) {
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index 010e3b1f23ed..5d4539cb62af 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -64,12 +64,14 @@ public final class DeviceConfig {
public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
/**
- * Namespace for all Game Driver features.
+ * Namespace for all activity manager related features that are used at the native level.
+ * These features are applied at reboot.
*
* @hide
*/
@SystemApi
- public static final String NAMESPACE_GAME_DRIVER = "game_driver";
+ public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT =
+ "activity_manager_native_boot";
/**
* Namespace for autofill feature that provides suggestions across all apps when
@@ -92,6 +94,14 @@ public final class DeviceConfig {
public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture";
/**
+ * Namespace for all Game Driver features.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_GAME_DRIVER = "game_driver";
+
+ /**
* Namespace for all input-related features that are used at the native level.
* These features are applied at reboot.
*
@@ -101,6 +111,14 @@ public final class DeviceConfig {
public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
/**
+ * Namespace for all media native related features.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_MEDIA_NATIVE = "media_native";
+
+ /**
* Namespace for all netd related features.
*
* @hide
@@ -109,6 +127,15 @@ public final class DeviceConfig {
public static final String NAMESPACE_NETD_NATIVE = "netd_native";
/**
+ * Namespace for all runtime native boot related features. Boot in this case refers to the
+ * fact that the properties only take affect after rebooting the device.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_RUNTIME_NATIVE_BOOT = "runtime_native_boot";
+
+ /**
* Namespace for System UI related features.
*
* @hide
@@ -145,66 +172,32 @@ public final class DeviceConfig {
*/
/**
- * If {@code true}, enables the blastula pool feature.
+ * If {@code true}, enables the unspecialized app process (USAP) pool feature.
*
* @hide for internal use only
*/
- String BLASTULA_POOL_ENABLED = "blastula_pool_enabled";
+ String USAP_POOL_ENABLED = "usap_pool_enabled";
/**
- * The maximum number of processes to keep in the blastula pool.
+ * The maximum number of processes to keep in the USAP pool.
*
* @hide for internal use only
*/
- String BLASTULA_POOL_SIZE_MAX = "blastula_pool_size_max";
+ String USAP_POOL_SIZE_MAX = "usap_pool_size_max";
/**
- * The minimum number of processes to keep in the blastula pool.
+ * The minimum number of processes to keep in the USAP pool.
*
* @hide for internal use only
*/
- String BLASTULA_POOL_SIZE_MIN = "blastula_pool_size_min";
+ String USAP_POOL_SIZE_MIN = "usap_pool_size_min";
/**
* The threshold used to determine if the pool should be refilled.
*
* @hide for internal use only
*/
- String BLASTULA_POOL_REFILL_THRESHOLD = "blastula_refill_threshold";
- }
-
- /**
- * Namespace for all runtime native boot related features. Boot in this case refers to the
- * fact that the properties only take affect after rebooting the device.
- *
- * @hide
- */
- @SystemApi
- public interface RuntimeNativeBoot {
- String NAMESPACE = "runtime_native_boot";
- }
-
- /**
- * Namespace for all media native related features.
- *
- * @hide
- */
- @SystemApi
- public interface MediaNative {
- /** The flag namespace for media native features. */
- String NAMESPACE = "media_native";
- }
-
- /**
- * Namespace for all activity manager related features that are used at the native level.
- * These features are applied at reboot.
- *
- * @hide
- */
- @SystemApi
- public interface ActivityManagerNativeBoot {
- String NAMESPACE = "activity_manager_native_boot";
- String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled";
+ String USAP_POOL_REFILL_THRESHOLD = "usap_refill_threshold";
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index d395a9f9b61e..45219d6f2e33 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -308,6 +308,22 @@ public final class Settings {
"android.settings.ACCESSIBILITY_SETTINGS";
/**
+ * Activity Action: Show detail settings of a particular accessibility service.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+ * <p>
+ * Input: {@link Intent#EXTRA_COMPONENT_NAME} must specify the accessibility service component
+ * name to be shown.
+ * <p>
+ * Output: Nothing.
+ * @hide
+ **/
+ @SystemApi
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_ACCESSIBILITY_DETAILS_SETTINGS =
+ "android.settings.ACCESSIBILITY_DETAILS_SETTINGS";
+
+ /**
* Activity Action: Show settings to control access to usage information.
* <p>
* In some cases, a matching Activity may not exist, so ensure you
@@ -496,25 +512,16 @@ public final class Settings {
* In some cases, a matching Activity may not exist, so ensure you safeguard
* against this by checking WifiManager.isEasyConnectSupported();
* <p>
- * Input:
- * The following keys in the bundle with their associated value.
- * <ul>
- * <li>"qrCode": Standard Easy Connect (Wi-Fi DPP) URI bootstrapping information as a
- * string.</li>
- * </ul>
+ * Input: The Intent's data URI specifies bootstrapping information for authenticating and
+ * provisioning the peer, with the "DPP" scheme.
* <p>
- * Output: Nothing.
+ * Output: After {@code startActivityForResult}, the callback {@code onActivityResult} will have
+ * resultCode {@link android.app.Activity#RESULT_OK} if Wi-Fi Easy Connect configuration
+ * success and the user clicks 'Done' button.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE =
- "android.settings.PROCESS_WIFI_EASY_CONNECT_QR_CODE";
-
- /**
- * An extra to put in the bundle for {@link #ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE} intents.
- * It must contain properly formatted Easy Connect (Wi-Fi DPP) URI bootstrapping information for
- * the process to proceed.
- */
- public static final String EXTRA_QR_CODE = "android.provider.extra.QR_CODE";
+ public static final String ACTION_PROCESS_WIFI_EASY_CONNECT_URI =
+ "android.settings.PROCESS_WIFI_EASY_CONNECT_URI";
/**
* Activity Action: Show settings to allow configuration of data and view data usage.
@@ -3314,6 +3321,17 @@ public final class Settings {
ColorDisplayManager.COLOR_MODE_AUTOMATIC);
/**
+ * The user selected peak refresh rate in frames per second.
+ *
+ * If this isn't set, the system falls back to a device specific default.
+ * @hide
+ */
+ public static final String PEAK_REFRESH_RATE = "peak_refresh_rate";
+
+ private static final Validator PEAK_REFRESH_RATE_VALIDATOR =
+ new SettingsValidators.InclusiveFloatRangeValidator(24f, Float.MAX_VALUE);
+
+ /**
* The amount of time in milliseconds before the device goes to sleep or begins
* to dream after a period of inactivity. This value is also known as the
* user activity timeout period since the screen isn't necessarily turned off
@@ -9635,6 +9653,7 @@ public final class Settings {
* when user location settings are off), for emergency purposes.
* @hide
*/
+ @TestApi
public static final String LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST =
"location_ignore_settings_package_whitelist";
diff --git a/core/java/android/service/autofill/CustomDescription.java b/core/java/android/service/autofill/CustomDescription.java
index ea87f4fe564e..c28d2bbe30ea 100644
--- a/core/java/android/service/autofill/CustomDescription.java
+++ b/core/java/android/service/autofill/CustomDescription.java
@@ -176,6 +176,7 @@ public final class CustomDescription implements Parcelable {
* by the Android System.
* @throws IllegalStateException if {@link #build()} was already called.
*/
+ @NonNull
public Builder addChild(int id, @NonNull Transformation transformation) {
throwIfDestroyed();
Preconditions.checkArgument((transformation instanceof InternalTransformation),
@@ -270,6 +271,7 @@ public final class CustomDescription implements Parcelable {
* by the Android System.
* @throws IllegalStateException if {@link #build()} was already called.
*/
+ @NonNull
public Builder batchUpdate(@NonNull Validator condition, @NonNull BatchUpdates updates) {
throwIfDestroyed();
Preconditions.checkArgument((condition instanceof InternalValidator),
@@ -323,6 +325,7 @@ public final class CustomDescription implements Parcelable {
* by the Android System.
* @throws IllegalStateException if {@link #build()} was already called.
*/
+ @NonNull
public Builder addOnClickAction(int id, @NonNull OnClickAction action) {
throwIfDestroyed();
Preconditions.checkArgument((action instanceof InternalOnClickAction),
@@ -338,6 +341,7 @@ public final class CustomDescription implements Parcelable {
/**
* Creates a new {@link CustomDescription} instance.
*/
+ @NonNull
public CustomDescription build() {
throwIfDestroyed();
mDestroyed = true;
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 257114ccc87b..6b3009f9f9ef 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -272,7 +272,8 @@ public final class FillResponse implements Parcelable {
*
* @see android.app.PendingIntent#getIntentSender()
*/
- public @NonNull Builder setAuthentication(@NonNull AutofillId[] ids,
+ @NonNull
+ public Builder setAuthentication(@NonNull AutofillId[] ids,
@Nullable IntentSender authentication, @Nullable RemoteViews presentation) {
throwIfDestroyed();
throwIfDisableAutofillCalled();
@@ -298,6 +299,7 @@ public final class FillResponse implements Parcelable {
* <p>This is typically used when the service cannot autofill the view; for example, a
* text field representing the result of a Captcha challenge.
*/
+ @NonNull
public Builder setIgnoredIds(AutofillId...ids) {
throwIfDestroyed();
mIgnoredIds = ids;
@@ -318,7 +320,8 @@ public final class FillResponse implements Parcelable {
*
* @return This builder.
*/
- public @NonNull Builder addDataset(@Nullable Dataset dataset) {
+ @NonNull
+ public Builder addDataset(@Nullable Dataset dataset) {
throwIfDestroyed();
throwIfDisableAutofillCalled();
if (dataset == null) {
@@ -359,6 +362,7 @@ public final class FillResponse implements Parcelable {
* @param clientState The custom client state.
* @return This builder.
*/
+ @NonNull
public Builder setClientState(@Nullable Bundle clientState) {
throwIfDestroyed();
throwIfDisableAutofillCalled();
@@ -379,6 +383,7 @@ public final class FillResponse implements Parcelable {
* already called.
* @throws NullPointerException if {@code ids} or any element on it is {@code null}.
*/
+ @NonNull
public Builder setFieldClassificationIds(@NonNull AutofillId... ids) {
throwIfDestroyed();
throwIfDisableAutofillCalled();
@@ -398,6 +403,7 @@ public final class FillResponse implements Parcelable {
*
* @return This builder.
*/
+ @NonNull
public Builder setFlags(@FillResponseFlags int flags) {
throwIfDestroyed();
mFlags = Preconditions.checkFlagsArgument(flags,
@@ -437,6 +443,7 @@ public final class FillResponse implements Parcelable {
* {@link #setSaveInfo(SaveInfo)}, {@link #setClientState(Bundle)}, or
* {@link #setFieldClassificationIds(AutofillId...)} was already called.
*/
+ @NonNull
public Builder disableAutofill(long duration) {
throwIfDestroyed();
if (duration <= 0) {
@@ -475,6 +482,7 @@ public final class FillResponse implements Parcelable {
* already set for this builder.
*/
// TODO(b/69796626): make it sticky / update javadoc
+ @NonNull
public Builder setHeader(@NonNull RemoteViews header) {
throwIfDestroyed();
throwIfAuthenticationCalled();
@@ -506,6 +514,7 @@ public final class FillResponse implements Parcelable {
* requires authentication}.
*/
// TODO(b/69796626): make it sticky / update javadoc
+ @NonNull
public Builder setFooter(@NonNull RemoteViews footer) {
throwIfDestroyed();
throwIfAuthenticationCalled();
@@ -524,6 +533,7 @@ public final class FillResponse implements Parcelable {
* {@link #setAuthentication(AutofillId[], IntentSender, RemoteViews)
* requires authentication}.
*/
+ @NonNull
public Builder setUserData(@NonNull UserData userData) {
throwIfDestroyed();
throwIfAuthenticationCalled();
@@ -548,6 +558,7 @@ public final class FillResponse implements Parcelable {
*
* @return A built response.
*/
+ @NonNull
public FillResponse build() {
throwIfDestroyed();
if (mAuthentication == null && mDatasets == null && mSaveInfo == null
diff --git a/core/java/android/service/autofill/UserData.java b/core/java/android/service/autofill/UserData.java
index cea04962b547..7814f70b612b 100644
--- a/core/java/android/service/autofill/UserData.java
+++ b/core/java/android/service/autofill/UserData.java
@@ -266,6 +266,7 @@ public final class UserData implements FieldClassificationUserData, Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder setFieldClassificationAlgorithm(@Nullable String name,
@Nullable Bundle args) {
throwIfDestroyed();
@@ -291,6 +292,7 @@ public final class UserData implements FieldClassificationUserData, Parcelable {
*
* @return this builder
*/
+ @NonNull
public Builder setFieldClassificationAlgorithmForCategory(@NonNull String categoryId,
@Nullable String name, @Nullable Bundle args) {
throwIfDestroyed();
@@ -333,6 +335,7 @@ public final class UserData implements FieldClassificationUserData, Parcelable {
* {@link UserData#getMaxValueLength()}</li>
* </ul>
*/
+ @NonNull
public Builder add(@NonNull String value, @NonNull String categoryId) {
throwIfDestroyed();
checkNotEmpty("categoryId", categoryId);
@@ -386,6 +389,7 @@ public final class UserData implements FieldClassificationUserData, Parcelable {
*
* @return The built dataset.
*/
+ @NonNull
public UserData build() {
throwIfDestroyed();
mDestroyed = true;
diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
index 463eae681f05..cd549301f5d1 100644
--- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
+++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
@@ -253,6 +253,7 @@ public abstract class AugmentedAutofillService extends Service {
}
@Override
+ /** @hide */
protected final void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (mAutofillProxies != null) {
final int size = mAutofillProxies.size();
diff --git a/core/java/android/service/carrier/ApnService.java b/core/java/android/service/carrier/ApnService.java
index d53eb37ca786..57e4b1b40748 100644
--- a/core/java/android/service/carrier/ApnService.java
+++ b/core/java/android/service/carrier/ApnService.java
@@ -16,6 +16,8 @@
package android.service.carrier;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.WorkerThread;
import android.app.Service;
@@ -60,7 +62,8 @@ public abstract class ApnService extends Service {
};
@Override
- public IBinder onBind(Intent intent) {
+ @NonNull
+ public IBinder onBind(@Nullable Intent intent) {
return mBinder;
}
@@ -73,5 +76,6 @@ public abstract class ApnService extends Service {
* subId.
*/
@WorkerThread
+ @NonNull
public abstract List<ContentValues> onRestoreApns(int subId);
}
diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java
index d84124d125ca..af0dfd2c26e5 100644
--- a/core/java/android/service/notification/Adjustment.java
+++ b/core/java/android/service/notification/Adjustment.java
@@ -15,6 +15,7 @@
*/
package android.service.notification;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.app.Notification;
import android.os.Bundle;
@@ -132,8 +133,9 @@ public final class Adjustment implements Parcelable {
* @param explanation A human-readable justification for the adjustment.
* @param userHandle User handle for for whose the adjustments will be applied.
*/
- public Adjustment(String pkg, String key, Bundle signals, CharSequence explanation,
- UserHandle userHandle) {
+ public Adjustment(@NonNull String pkg, @NonNull String key, @NonNull Bundle signals,
+ @NonNull CharSequence explanation,
+ @NonNull UserHandle userHandle) {
mPackage = pkg;
mKey = key;
mSignals = signals;
@@ -177,19 +179,19 @@ public final class Adjustment implements Parcelable {
}
};
- public String getPackage() {
+ public @NonNull String getPackage() {
return mPackage;
}
- public String getKey() {
+ public @NonNull String getKey() {
return mKey;
}
- public CharSequence getExplanation() {
+ public @NonNull CharSequence getExplanation() {
return mExplanation;
}
- public Bundle getSignals() {
+ public @NonNull Bundle getSignals() {
return mSignals;
}
@@ -199,7 +201,7 @@ public final class Adjustment implements Parcelable {
return mUser;
}
- public UserHandle getUserHandle() {
+ public @NonNull UserHandle getUserHandle() {
return UserHandle.of(mUser);
}
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index a69724860634..56d22d097a5c 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -20,8 +20,8 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SdkConstant;
-import android.annotation.SystemApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.admin.DevicePolicyManager;
@@ -90,7 +90,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
}
@Override
- public final IBinder onBind(Intent intent) {
+ public final @NonNull IBinder onBind(@Nullable Intent intent) {
if (mWrapper == null) {
mWrapper = new NotificationAssistantServiceWrapper();
}
@@ -126,8 +126,8 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* @param channel the channel the notification was posted to
* @return an adjustment or null to take no action, within 100ms.
*/
- public Adjustment onNotificationEnqueued(StatusBarNotification sbn,
- NotificationChannel channel) {
+ public @Nullable Adjustment onNotificationEnqueued(@NonNull StatusBarNotification sbn,
+ @NonNull NotificationChannel channel) {
return onNotificationEnqueued(sbn);
}
@@ -155,8 +155,9 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* @param reason see {@link #REASON_LISTENER_CANCEL}, etc.
*/
@Override
- public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap,
- NotificationStats stats, int reason) {
+ public void onNotificationRemoved(@NonNull StatusBarNotification sbn,
+ @NonNull RankingMap rankingMap,
+ @NonNull NotificationStats stats, int reason) {
onNotificationRemoved(sbn, rankingMap, reason);
}
@@ -164,7 +165,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* Implement this to know when a user has seen notifications, as triggered by
* {@link #setNotificationsShown(String[])}.
*/
- public void onNotificationsSeen(List<String> keys) {
+ public void onNotificationsSeen(@NonNull List<String> keys) {
}
@@ -211,7 +212,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
*
* @param adjustment the adjustment with an explanation
*/
- public final void adjustNotification(Adjustment adjustment) {
+ public final void adjustNotification(@NonNull Adjustment adjustment) {
if (!isBound()) return;
try {
getNotificationInterface().applyAdjustmentFromAssistant(mWrapper, adjustment);
@@ -228,7 +229,7 @@ public abstract class NotificationAssistantService extends NotificationListenerS
*
* @param adjustments a list of adjustments with explanations
*/
- public final void adjustNotifications(List<Adjustment> adjustments) {
+ public final void adjustNotifications(@NonNull List<Adjustment> adjustments) {
if (!isBound()) return;
try {
getNotificationInterface().applyAdjustmentsFromAssistant(mWrapper, adjustments);
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index edb10ec6236e..767a3f7fda34 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1638,7 +1638,7 @@ public abstract class NotificationListenerService extends Service {
* Returns a list of smart {@link Notification.Action} that can be added by the
* {@link NotificationAssistantService}
*/
- public List<Notification.Action> getSmartActions() {
+ public @NonNull List<Notification.Action> getSmartActions() {
return mSmartActions;
}
@@ -1646,7 +1646,7 @@ public abstract class NotificationListenerService extends Service {
* Returns a list of smart replies that can be added by the
* {@link NotificationAssistantService}
*/
- public List<CharSequence> getSmartReplies() {
+ public @NonNull List<CharSequence> getSmartReplies() {
return mSmartReplies;
}
diff --git a/core/java/android/text/style/LineHeightSpan.java b/core/java/android/text/style/LineHeightSpan.java
index a5d5af2433fe..7fb0f950f583 100644
--- a/core/java/android/text/style/LineHeightSpan.java
+++ b/core/java/android/text/style/LineHeightSpan.java
@@ -88,7 +88,7 @@ public interface LineHeightSpan extends ParagraphStyle, WrapTogetherSpan {
/**
* Constructor called from {@link TextUtils} to restore the span from a parcel
*/
- public Standard(Parcel src) {
+ public Standard(@NonNull Parcel src) {
mHeight = src.readInt();
}
diff --git a/core/java/android/util/DocumentsStatsLog.java b/core/java/android/util/DocumentsStatsLog.java
index f483944c97c7..a67bbde8b30b 100644
--- a/core/java/android/util/DocumentsStatsLog.java
+++ b/core/java/android/util/DocumentsStatsLog.java
@@ -16,6 +16,7 @@
package android.util;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.provider.DocumentsContract;
import android.provider.DocumentsProvider;
@@ -126,7 +127,7 @@ public class DocumentsStatsLog {
*
* @param packageName
*/
- public static void logPickerLaunchedFrom(String packageName) {
+ public static void logPickerLaunchedFrom(@Nullable String packageName) {
StatsLog.write(StatsLog.DOCS_UI_PICKER_LAUNCHED_FROM_REPORTED, packageName);
}
diff --git a/core/java/android/util/LocalLog.java b/core/java/android/util/LocalLog.java
index adfa4fc55567..8b5659b3fa31 100644
--- a/core/java/android/util/LocalLog.java
+++ b/core/java/android/util/LocalLog.java
@@ -17,6 +17,7 @@
package android.util;
import android.annotation.UnsupportedAppUsage;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.time.LocalDateTime;
@@ -55,6 +56,10 @@ public final class LocalLog {
@UnsupportedAppUsage
public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ dump(pw);
+ }
+
+ public synchronized void dump(PrintWriter pw) {
Iterator<String> itr = mLog.iterator();
while (itr.hasNext()) {
pw.println(itr.next());
@@ -62,6 +67,10 @@ public final class LocalLog {
}
public synchronized void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ reverseDump(pw);
+ }
+
+ public synchronized void reverseDump(PrintWriter pw) {
Iterator<String> itr = mLog.descendingIterator();
while (itr.hasNext()) {
pw.println(itr.next());
@@ -75,10 +84,16 @@ public final class LocalLog {
}
@UnsupportedAppUsage
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mLog.dump(fd, pw, args);
+ mLog.dump(pw);
+ }
+ public void dump(PrintWriter pw) {
+ mLog.dump(pw);
}
public void reverseDump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mLog.reverseDump(fd, pw, args);
+ mLog.reverseDump(pw);
+ }
+ public void reverseDump(PrintWriter pw) {
+ mLog.reverseDump(pw);
}
}
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index 9ba0f5da135e..cf49803a7225 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -21,6 +21,9 @@ import com.android.internal.util.GrowingArrayUtils;
import libcore.util.EmptyArray;
+import java.util.Arrays;
+import java.util.Objects;
+
/**
* SparseArray mapping longs to Objects. Unlike a normal array of Objects,
* there can be gaps in the indices. It is intended to be more memory efficient
diff --git a/core/java/android/util/LongSparseLongArray.java b/core/java/android/util/LongSparseLongArray.java
index af163ac8f246..8dcdb4026246 100644
--- a/core/java/android/util/LongSparseLongArray.java
+++ b/core/java/android/util/LongSparseLongArray.java
@@ -22,6 +22,8 @@ import com.android.internal.util.GrowingArrayUtils;
import android.annotation.UnsupportedAppUsage;
import libcore.util.EmptyArray;
+import java.util.Arrays;
+
/**
* Map of {@code long} to {@code long}. Unlike a normal array of longs, there
* can be gaps in the indices. It is intended to be more memory efficient than using a
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 91c85e79c9ec..b3d98b8de0a3 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -231,7 +231,6 @@ public final class Display {
* bar, navigation bar, home activity or IME.
* </p>
*
- * @see #supportsSystemDecorations
* @hide
*/
// TODO (b/114338689): Remove the flag and use IWindowManager#setShouldShowSystemDecors
@@ -907,18 +906,6 @@ public final class Display {
}
/**
- * Returns whether this display should support showing system decorations.
- *
- * @see #FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS
- * @hide
- */
- @TestApi
- // TODO (b/114338689): Remove the method and use IWindowManager#shouldShowSystemDecors
- public boolean supportsSystemDecorations() {
- return (mDisplayInfo.flags & FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0;
- }
-
- /**
* Returns the display's HDR capabilities.
*
* @see #isHdr()
@@ -1110,16 +1097,19 @@ public final class Display {
* Returns true if the specified UID has access to this display.
* @hide
*/
+ @TestApi
public boolean hasAccess(int uid) {
- return Display.hasAccess(uid, mFlags, mOwnerUid);
+ return hasAccess(uid, mFlags, mOwnerUid, mDisplayId);
}
/** @hide */
- public static boolean hasAccess(int uid, int flags, int ownerUid) {
+ public static boolean hasAccess(int uid, int flags, int ownerUid, int displayId) {
return (flags & Display.FLAG_PRIVATE) == 0
|| uid == ownerUid
|| uid == Process.SYSTEM_UID
- || uid == 0;
+ || uid == 0
+ // Check if the UID is present on given display.
+ || DisplayManagerGlobal.getInstance().isUidPresentOnDisplay(uid, displayId);
}
/**
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 11ed3579cd95..2efebf6457ab 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -58,6 +58,11 @@ public final class DisplayInfo implements Parcelable {
public int type;
/**
+ * Logical display identifier.
+ */
+ public int displayId;
+
+ /**
* Display address, or null if none.
* Interpretation varies by display type.
*/
@@ -305,6 +310,7 @@ public final class DisplayInfo implements Parcelable {
&& layerStack == other.layerStack
&& flags == other.flags
&& type == other.type
+ && displayId == other.displayId
&& Objects.equals(address, other.address)
&& Objects.equals(uniqueId, other.uniqueId)
&& appWidth == other.appWidth
@@ -346,6 +352,7 @@ public final class DisplayInfo implements Parcelable {
layerStack = other.layerStack;
flags = other.flags;
type = other.type;
+ displayId = other.displayId;
address = other.address;
name = other.name;
uniqueId = other.uniqueId;
@@ -385,6 +392,7 @@ public final class DisplayInfo implements Parcelable {
layerStack = source.readInt();
flags = source.readInt();
type = source.readInt();
+ displayId = source.readInt();
address = source.readParcelable(null);
name = source.readString();
appWidth = source.readInt();
@@ -432,6 +440,7 @@ public final class DisplayInfo implements Parcelable {
dest.writeInt(layerStack);
dest.writeInt(this.flags);
dest.writeInt(type);
+ dest.writeInt(displayId);
dest.writeParcelable(address, flags);
dest.writeString(name);
dest.writeInt(appWidth);
@@ -579,7 +588,7 @@ public final class DisplayInfo implements Parcelable {
* Returns true if the specified UID has access to this display.
*/
public boolean hasAccess(int uid) {
- return Display.hasAccess(uid, flags, ownerUid);
+ return Display.hasAccess(uid, flags, ownerUid, displayId);
}
private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfo compatInfo,
@@ -610,6 +619,8 @@ public final class DisplayInfo implements Parcelable {
StringBuilder sb = new StringBuilder();
sb.append("DisplayInfo{\"");
sb.append(name);
+ sb.append(", displayId ");
+ sb.append(displayId);
sb.append("\", uniqueId \"");
sb.append(uniqueId);
sb.append("\", app ");
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 877b3044f7c3..874be814ed9a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -18589,7 +18589,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@FlagMap(target = FADING_EDGE_VERTICAL, name = "vertical"),
@FlagMap(target = FADING_EDGE_HORIZONTAL, name = "horizontal")
})
- int getFadingEdge() {
+ public int getFadingEdge() {
return mViewFlags & FADING_EDGE_MASK;
}
@@ -18600,7 +18600,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
@InspectableProperty
- int getFadingEdgeLength() {
+ public int getFadingEdgeLength() {
if (mScrollCache != null && (mViewFlags & FADING_EDGE_MASK) != FADING_EDGE_NONE) {
return mScrollCache.fadingEdgeLength;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 65b1abd715d9..a3d0a7e195e0 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3477,7 +3477,7 @@ public final class ViewRootImpl implements ViewParent,
usingAsyncReport = true;
final Handler handler = mAttachInfo.mHandler;
mAttachInfo.mThreadedRenderer.setFrameCompleteCallback((long frameNr) ->
- handler.post(() -> {
+ handler.postAtFrontOfQueue(() -> {
// TODO: Use the frame number
pendingDrawFinished();
if (commitCallbacks != null) {
@@ -3489,7 +3489,7 @@ public final class ViewRootImpl implements ViewParent,
} else if (commitCallbacks != null && commitCallbacks.size() > 0) {
final Handler handler = mAttachInfo.mHandler;
mAttachInfo.mThreadedRenderer.setFrameCompleteCallback((long frameNr) ->
- handler.post(() -> {
+ handler.postAtFrontOfQueue(() -> {
for (int i = 0; i < commitCallbacks.size(); i++) {
commitCallbacks.get(i).run();
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 0275c2528265..86b735046b2b 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -481,6 +481,7 @@ public interface WindowManager extends ViewManager {
*
* @param displayId The id of the display.
* @param shouldShow Indicates that the display should show system decors.
+ * @see #shouldShowSystemDecors(int)
* @hide
*/
@TestApi
@@ -488,6 +489,21 @@ public interface WindowManager extends ViewManager {
}
/**
+ * Checks if the display supports showing system decors.
+ * <p>
+ * System decors include status bar, navigation bar, launcher.
+ * </p>
+ *
+ * @param displayId The id of the display.
+ * @see #setShouldShowSystemDecors(int, boolean)
+ * @hide
+ */
+ @TestApi
+ default boolean shouldShowSystemDecors(int displayId) {
+ return false;
+ }
+
+ /**
* Sets that the display should show IME.
*
* @param displayId Display ID.
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index a102f6c8a74d..2e4db5c4eef9 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -177,6 +177,15 @@ public final class WindowManagerImpl implements WindowManager {
}
@Override
+ public boolean shouldShowSystemDecors(int displayId) {
+ try {
+ return WindowManagerGlobal.getWindowManagerService().shouldShowSystemDecors(displayId);
+ } catch (RemoteException e) {
+ }
+ return false;
+ }
+
+ @Override
public void setShouldShowIme(int displayId, boolean shouldShow) {
try {
WindowManagerGlobal.getWindowManagerService().setShouldShowIme(displayId, shouldShow);
diff --git a/core/java/android/view/accessibility/AccessibilityNodeIdManager.java b/core/java/android/view/accessibility/AccessibilityNodeIdManager.java
index 1ac704774e7f..0f5e950582dd 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeIdManager.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeIdManager.java
@@ -45,7 +45,9 @@ public final class AccessibilityNodeIdManager {
* @param id The accessibilityViewId of the view.
*/
public void registerViewWithId(View view, int id) {
- mIdsToViews.append(id, view);
+ synchronized (mIdsToViews) {
+ mIdsToViews.append(id, view);
+ }
}
/**
@@ -53,7 +55,9 @@ public final class AccessibilityNodeIdManager {
* @param id The id returned from registerView when the view as first associated.
*/
public void unregisterViewWithId(int id) {
- mIdsToViews.remove(id);
+ synchronized (mIdsToViews) {
+ mIdsToViews.remove(id);
+ }
}
/**
@@ -62,7 +66,10 @@ public final class AccessibilityNodeIdManager {
* @return The view.
*/
public View findView(int id) {
- final View view = mIdsToViews.get(id);
+ View view = null;
+ synchronized (mIdsToViews) {
+ view = mIdsToViews.get(id);
+ }
return view != null && view.includeForAccessibility() ? view : null;
}
}
diff --git a/core/java/android/view/inspector/InspectableProperty.java b/core/java/android/view/inspector/InspectableProperty.java
index f85952108f07..30938c152eca 100644
--- a/core/java/android/view/inspector/InspectableProperty.java
+++ b/core/java/android/view/inspector/InspectableProperty.java
@@ -16,6 +16,7 @@
package android.view.inspector;
+import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -39,7 +40,7 @@ import java.lang.annotation.Target;
* @see InspectionCompanion#readProperties(Object, PropertyReader)
* @hide
*/
-@Target({METHOD})
+@Target({METHOD, FIELD})
@Retention(SOURCE)
@TestApi
public @interface InspectableProperty {
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 7ca2304f6d9f..6eceb00308e1 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2821,7 +2821,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* @attr ref android.R.styleable#AbsListView_drawSelectorOnTop
*/
@InspectableProperty
- public boolean getDrawSelectorOnTop() {
+ public boolean isDrawSelectorOnTop() {
return mDrawSelectorOnTop;
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 516c48e6a6c5..564d972ac26d 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -2803,7 +2803,7 @@ public class RemoteViews implements Parcelable, Filter {
* @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) {
+ public void setOnClickResponse(int viewId, @NonNull RemoteResponse response) {
addAction(new SetOnClickResponse(viewId, response));
}
@@ -3926,7 +3926,8 @@ public class RemoteViews implements Parcelable, Filter {
*
* @param pendingIntent The {@link PendingIntent} to send as part of the response
*/
- public static RemoteResponse fromPendingIntent(PendingIntent pendingIntent) {
+ @NonNull
+ public static RemoteResponse fromPendingIntent(@NonNull PendingIntent pendingIntent) {
RemoteResponse response = new RemoteResponse();
response.mPendingIntent = pendingIntent;
return response;
@@ -3957,7 +3958,8 @@ public class RemoteViews implements Parcelable, Filter {
* @see RemoteViews#setOnClickFillInIntent(int, Intent)
* @return
*/
- public static RemoteResponse fromFillInIntent(Intent fillIntent) {
+ @NonNull
+ public static RemoteResponse fromFillInIntent(@NonNull Intent fillIntent) {
RemoteResponse response = new RemoteResponse();
response.mFillIntent = fillIntent;
return response;
@@ -3974,7 +3976,8 @@ public class RemoteViews implements Parcelable, Filter {
*
* @see ActivityOptions#makeSceneTransitionAnimation(Activity, Pair[])
*/
- public RemoteResponse addSharedElement(int viewId, String sharedElementName) {
+ @NonNull
+ public RemoteResponse addSharedElement(int viewId, @NonNull String sharedElementName) {
if (mViewIds == null) {
mViewIds = new IntArray();
mElementNames = new ArrayList<>();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 73792b08194b..04bcb1451b61 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -12744,7 +12744,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* return value may not be the same as the one TextView uses if the View's layout direction is
* not resolved or detached from parent root view.
*/
- public TextDirectionHeuristic getTextDirectionHeuristic() {
+ public @NonNull TextDirectionHeuristic getTextDirectionHeuristic() {
if (hasPasswordTransformationMethod()) {
// passwords fields should be LTR
return TextDirectionHeuristics.LTR;
diff --git a/core/java/android/widget/ToggleButton.java b/core/java/android/widget/ToggleButton.java
index b76c2cafd912..9255ccb5cda7 100644
--- a/core/java/android/widget/ToggleButton.java
+++ b/core/java/android/widget/ToggleButton.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.FloatRange;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -129,6 +130,7 @@ public class ToggleButton extends CompoundButton {
* @return the alpha value, 0.0-1.0
*/
@InspectableProperty
+ @FloatRange(from = 0.0, to = 1.0)
public float getDisabledAlpha() {
return mDisabledAlpha;
}
diff --git a/core/java/android/widget/ViewFlipper.java b/core/java/android/widget/ViewFlipper.java
index 414b1369d23e..b962298e3d46 100644
--- a/core/java/android/widget/ViewFlipper.java
+++ b/core/java/android/widget/ViewFlipper.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.IntRange;
import android.annotation.UnsupportedAppUsage;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -130,7 +131,7 @@ public class ViewFlipper extends ViewAnimator {
* time in milliseconds
*/
@android.view.RemotableViewMethod
- public void setFlipInterval(int milliseconds) {
+ public void setFlipInterval(@IntRange(from = 0) int milliseconds) {
mFlipInterval = milliseconds;
}
@@ -140,6 +141,7 @@ public class ViewFlipper extends ViewAnimator {
* @return delay time in milliseconds
*/
@InspectableProperty
+ @IntRange(from = 0)
public int getFlipInterval() {
return mFlipInterval;
}
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 89e3d6b6460f..67e0446e19e5 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -135,7 +135,7 @@ public class ChooserActivity extends ResolverActivity {
* {@link AppPredictionManager} will be queried for direct share targets.
*/
// TODO(b/123089490): Replace with system flag
- private static final boolean USE_PREDICTION_MANAGER_FOR_DIRECT_TARGETS = false;
+ private static final boolean USE_PREDICTION_MANAGER_FOR_DIRECT_TARGETS = true;
// TODO(b/123088566) Share these in a better way.
private static final String APP_PREDICTION_SHARE_UI_SURFACE = "share";
public static final String LAUNCH_LOCATON_DIRECT_SHARE = "direct_share";
@@ -1889,11 +1889,19 @@ public class ChooserActivity extends ResolverActivity {
* Set to true to reveal all service targets at once.
*/
public void setShowServiceTargets(boolean show) {
+ // mShowServiceTargets is only flipped once to show direct share targets. But after the
+ // initial display the list can be re-sorted and the user will see the target list
+ // change. This will log the initial show and the subsequent shuffle to help us get
+ // accurate timing of the UX.
+ if (show) {
+ getMetricsLogger().write(
+ new LogMaker(MetricsEvent.ACTION_ACTIVITY_CHOOSER_SHOWN_DIRECT_TARGET)
+ .setSubtype(mShowServiceTargets ? MetricsEvent.PREVIOUSLY_VISIBLE
+ : MetricsEvent.PREVIOUSLY_HIDDEN));
+ }
if (show != mShowServiceTargets) {
mShowServiceTargets = show;
notifyDataSetChanged();
- getMetricsLogger().write(
- new LogMaker(MetricsEvent.ACTION_ACTIVITY_CHOOSER_SHOWN_DIRECT_TARGET));
}
}
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index c096961c57b8..c4af4c797d37 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -48,9 +48,9 @@ interface IAppOpsService {
@UnsupportedAppUsage
List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
void getHistoricalOps(int uid, String packageName, in List<String> ops, long beginTimeMillis,
- long endTimeMillis, in RemoteCallback callback);
+ long endTimeMillis, int flags, in RemoteCallback callback);
void getHistoricalOpsFromDiskRaw(int uid, String packageName, in List<String> ops,
- long beginTimeMillis, long endTimeMillis, in RemoteCallback callback);
+ long beginTimeMillis, long endTimeMillis, int flags, in RemoteCallback callback);
void offsetHistory(long duration);
void setHistoryParameters(int mode, long baseSnapshotInterval, int compressionStep);
void addHistoricalOps(in AppOpsManager.HistoricalOps ops);
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
index bab478748467..aa1e0d439c86 100644
--- a/core/java/com/android/internal/os/BinderCallsStats.java
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -54,7 +54,7 @@ public class BinderCallsStats implements BinderInternal.Observer {
public static final int PERIODIC_SAMPLING_INTERVAL_DEFAULT = 1000;
public static final boolean DEFAULT_TRACK_SCREEN_INTERACTIVE = false;
public static final boolean DEFAULT_TRACK_DIRECT_CALLING_UID = true;
- public static final int MAX_BINDER_CALL_STATS_COUNT_DEFAULT = 5000;
+ public static final int MAX_BINDER_CALL_STATS_COUNT_DEFAULT = 1500;
private static final String DEBUG_ENTRY_PREFIX = "__DEBUG_";
private static class OverflowBinder extends Binder {}
diff --git a/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java
index 718bcb43bd9a..b8dfe0d63a66 100644
--- a/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java
+++ b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java
@@ -57,14 +57,14 @@ public class KernelCpuThreadReaderSettingsObserver extends ContentObserver {
* List of UIDs to report data for
*/
private static final String COLLECTED_UIDS_SETTINGS_KEY = "collected_uids";
- private static final String COLLECTED_UIDS_DEFAULT = "1000-1000";
+ private static final String COLLECTED_UIDS_DEFAULT = "0-0;1000-1000";
/**
* Minimum total CPU usage to report
*/
private static final String MINIMUM_TOTAL_CPU_USAGE_MILLIS_SETTINGS_KEY =
"minimum_total_cpu_usage_millis";
- private static final int MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT = 0;
+ private static final int MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT = 10000;
private final Context mContext;
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 0ccaec0be20e..2bba3c914664 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -126,8 +126,8 @@ public final class Zygote {
/** Read-write external storage should be mounted instead of package sandbox */
public static final int MOUNT_EXTERNAL_FULL = IVold.REMOUNT_MODE_FULL;
- /** Number of bytes sent to the Zygote over blastula pipes or the pool event FD */
- public static final int BLASTULA_MANAGEMENT_MESSAGE_BYTES = 8;
+ /** Number of bytes sent to the Zygote over USAP pipes or the pool event FD */
+ public static final int USAP_MANAGEMENT_MESSAGE_BYTES = 8;
/**
* An extraArg passed when a zygote process is forking a child-zygote, specifying a name
@@ -187,12 +187,12 @@ public final class Zygote {
/**
* @hide for internal use only
*/
- public static final String BLASTULA_POOL_PRIMARY_SOCKET_NAME = "blastula_pool";
+ public static final String USAP_POOL_PRIMARY_SOCKET_NAME = "usap_pool_primary";
/**
* @hide for internal use only
*/
- public static final String BLASTULA_POOL_SECONDARY_SOCKET_NAME = "blastula_pool_secondary";
+ public static final String USAP_POOL_SECONDARY_SOCKET_NAME = "usap_pool_secondary";
private Zygote() {}
@@ -262,7 +262,7 @@ public final class Zygote {
String sandboxId);
/**
- * Specialize a Blastula instance. The current VM must have been started
+ * Specialize an unspecialized app process. The current VM must have been started
* with the -Xzygote flag.
*
* @param uid The UNIX uid that the new process should setuid() to before spawning any threads
@@ -282,12 +282,11 @@ public final class Zygote {
* @param instructionSet null-ok The instruction set to use.
* @param appDataDir null-ok The data directory of the app.
*/
- public static void specializeBlastula(int uid, int gid, int[] gids, int runtimeFlags,
+ public static void specializeAppProcess(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName,
boolean startChildZygote, String instructionSet, String appDataDir, String packageName,
String[] packagesForUID, String sandboxId) {
-
- nativeSpecializeBlastula(uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo,
+ nativeSpecializeAppProcess(uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo,
niceName, startChildZygote, instructionSet, appDataDir,
packageName, packagesForUID, sandboxId);
@@ -306,7 +305,7 @@ public final class Zygote {
ZygoteHooks.postForkCommon();
}
- private static native void nativeSpecializeBlastula(int uid, int gid, int[] gids,
+ private static native void nativeSpecializeAppProcess(int uid, int gid, int[] gids,
int runtimeFlags, int[][] rlimits, int mountExternal, String seInfo, String niceName,
boolean startChildZygote, String instructionSet, String appDataDir, String packageName,
String[] packagesForUID, String sandboxId);
@@ -427,11 +426,11 @@ public final class Zygote {
defaultValue);
}
- protected static void emptyBlastulaPool() {
- nativeEmptyBlastulaPool();
+ protected static void emptyUsapPool() {
+ nativeEmptyUsapPool();
}
- private static native void nativeEmptyBlastulaPool();
+ private static native void nativeEmptyUsapPool();
/**
* Returns the value of a system property converted to a boolean using specific logic.
@@ -454,105 +453,105 @@ public final class Zygote {
}
/**
- * @return Number of blastulas currently in the pool
+ * @return Number of unspecialized app processes currently in the pool
*/
- static int getBlastulaPoolCount() {
- return nativeGetBlastulaPoolCount();
+ static int getUsapPoolCount() {
+ return nativeGetUsapPoolCount();
}
- private static native int nativeGetBlastulaPoolCount();
+ private static native int nativeGetUsapPoolCount();
/**
* @return The event FD used for communication between the signal handler and the ZygoteServer
* poll loop
*/
- static FileDescriptor getBlastulaPoolEventFD() {
+ static FileDescriptor getUsapPoolEventFD() {
FileDescriptor fd = new FileDescriptor();
- fd.setInt$(nativeGetBlastulaPoolEventFD());
+ fd.setInt$(nativeGetUsapPoolEventFD());
return fd;
}
- private static native int nativeGetBlastulaPoolEventFD();
+ private static native int nativeGetUsapPoolEventFD();
/**
- * Fork a new blastula process from the zygote
+ * Fork a new unspecialized app process from the zygote
*
* @param sessionSocketRawFDs Anonymous session sockets that are currently open
- * @return In the Zygote process this function will always return null; in blastula processes
- * this function will return a Runnable object representing the new application that is
- * passed up from blastulaMain.
+ * @return In the Zygote process this function will always return null; in unspecialized app
+ * processes this function will return a Runnable object representing the new
+ * application that is passed up from usapMain.
*/
- static Runnable forkBlastula(LocalServerSocket blastulaPoolSocket,
- int[] sessionSocketRawFDs) {
+ static Runnable forkUsap(LocalServerSocket usapPoolSocket,
+ int[] sessionSocketRawFDs) {
FileDescriptor[] pipeFDs = null;
try {
pipeFDs = Os.pipe2(O_CLOEXEC);
} catch (ErrnoException errnoEx) {
- throw new IllegalStateException("Unable to create blastula pipe.", errnoEx);
+ throw new IllegalStateException("Unable to create USAP pipe.", errnoEx);
}
int pid =
- nativeForkBlastula(pipeFDs[0].getInt$(), pipeFDs[1].getInt$(), sessionSocketRawFDs);
+ nativeForkUsap(pipeFDs[0].getInt$(), pipeFDs[1].getInt$(), sessionSocketRawFDs);
if (pid == 0) {
IoUtils.closeQuietly(pipeFDs[0]);
- return blastulaMain(blastulaPoolSocket, pipeFDs[1]);
+ return usapMain(usapPoolSocket, pipeFDs[1]);
} else {
// The read-end of the pipe will be closed by the native code.
- // See removeBlastulaTableEntry();
+ // See removeUsapTableEntry();
IoUtils.closeQuietly(pipeFDs[1]);
return null;
}
}
- private static native int nativeForkBlastula(int readPipeFD,
+ private static native int nativeForkUsap(int readPipeFD,
int writePipeFD,
int[] sessionSocketRawFDs);
/**
- * This function is used by blastulas to wait for specialization requests from the system
- * server.
+ * This function is used by unspecialized app processes to wait for specialization requests from
+ * the system server.
*
* @param writePipe The write end of the reporting pipe used to communicate with the poll loop
* of the ZygoteServer.
* @return A runnable oject representing the new application.
*/
- private static Runnable blastulaMain(LocalServerSocket blastulaPoolSocket,
- FileDescriptor writePipe) {
+ private static Runnable usapMain(LocalServerSocket usapPoolSocket,
+ FileDescriptor writePipe) {
final int pid = Process.myPid();
LocalSocket sessionSocket = null;
- DataOutputStream blastulaOutputStream = null;
+ DataOutputStream usapOutputStream = null;
Credentials peerCredentials = null;
ZygoteArguments args = null;
while (true) {
try {
- sessionSocket = blastulaPoolSocket.accept();
+ sessionSocket = usapPoolSocket.accept();
- BufferedReader blastulaReader =
+ BufferedReader usapReader =
new BufferedReader(new InputStreamReader(sessionSocket.getInputStream()));
- blastulaOutputStream =
+ usapOutputStream =
new DataOutputStream(sessionSocket.getOutputStream());
peerCredentials = sessionSocket.getPeerCredentials();
- String[] argStrings = readArgumentList(blastulaReader);
+ String[] argStrings = readArgumentList(usapReader);
if (argStrings != null) {
args = new ZygoteArguments(argStrings);
// TODO (chriswailes): Should this only be run for debug builds?
- validateBlastulaCommand(args);
+ validateUsapCommand(args);
break;
} else {
- Log.e("Blastula", "Truncated command received.");
+ Log.e("USAP", "Truncated command received.");
IoUtils.closeQuietly(sessionSocket);
}
} catch (Exception ex) {
- Log.e("Blastula", ex.getMessage());
+ Log.e("USAP", ex.getMessage());
IoUtils.closeQuietly(sessionSocket);
}
}
@@ -571,29 +570,29 @@ public final class Zygote {
try {
// Used by ZygoteProcess.zygoteSendArgsAndGetResult to fill in a
// Process.ProcessStartResult object.
- blastulaOutputStream.writeInt(pid);
+ usapOutputStream.writeInt(pid);
} catch (IOException ioEx) {
- Log.e("Blastula", "Failed to write response to session socket: " + ioEx.getMessage());
+ Log.e("USAP", "Failed to write response to session socket: " + ioEx.getMessage());
System.exit(-1);
} finally {
IoUtils.closeQuietly(sessionSocket);
- IoUtils.closeQuietly(blastulaPoolSocket);
+ IoUtils.closeQuietly(usapPoolSocket);
}
try {
ByteArrayOutputStream buffer =
- new ByteArrayOutputStream(Zygote.BLASTULA_MANAGEMENT_MESSAGE_BYTES);
+ new ByteArrayOutputStream(Zygote.USAP_MANAGEMENT_MESSAGE_BYTES);
DataOutputStream outputStream = new DataOutputStream(buffer);
- // This is written as a long so that the blastula reporting pipe and blastula pool
- // event FD handlers in ZygoteServer.runSelectLoop can be unified. These two cases
- // should both send/receive 8 bytes.
+ // This is written as a long so that the USAP reporting pipe and USAP pool event FD
+ // handlers in ZygoteServer.runSelectLoop can be unified. These two cases should both
+ // send/receive 8 bytes.
outputStream.writeLong(pid);
outputStream.flush();
Os.write(writePipe, buffer.toByteArray(), 0, buffer.size());
} catch (Exception ex) {
- Log.e("Blastula",
+ Log.e("USAP",
String.format("Failed to write PID (%d) to pipe (%d): %s",
pid, writePipe.getInt$(), ex.getMessage()));
System.exit(-1);
@@ -601,7 +600,7 @@ public final class Zygote {
IoUtils.closeQuietly(writePipe);
}
- specializeBlastula(args.mUid, args.mGid, args.mGids,
+ specializeAppProcess(args.mUid, args.mGid, args.mGids,
args.mRuntimeFlags, rlimits, args.mMountExternal,
args.mSeInfo, args.mNiceName, args.mStartChildZygote,
args.mInstructionSet, args.mAppDataDir, args.mPackageName,
@@ -619,37 +618,37 @@ public final class Zygote {
null /* classLoader */);
}
- private static final String BLASTULA_ERROR_PREFIX = "Invalid command to blastula: ";
+ private static final String USAP_ERROR_PREFIX = "Invalid command to USAP: ";
/**
- * Checks a set of zygote arguments to see if they can be handled by a blastula. Throws an
+ * Checks a set of zygote arguments to see if they can be handled by a USAP. Throws an
* exception if an invalid arugment is encountered.
* @param args The arguments to test
*/
- private static void validateBlastulaCommand(ZygoteArguments args) {
+ private static void validateUsapCommand(ZygoteArguments args) {
if (args.mAbiListQuery) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--query-abi-list");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--query-abi-list");
} else if (args.mPidQuery) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--get-pid");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--get-pid");
} else if (args.mPreloadDefault) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--preload-default");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--preload-default");
} else if (args.mPreloadPackage != null) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--preload-package");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--preload-package");
} else if (args.mPreloadApp != null) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--preload-app");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--preload-app");
} else if (args.mStartChildZygote) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--start-child-zygote");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--start-child-zygote");
} else if (args.mApiBlacklistExemptions != null) {
throw new IllegalArgumentException(
- BLASTULA_ERROR_PREFIX + "--set-api-blacklist-exemptions");
+ USAP_ERROR_PREFIX + "--set-api-blacklist-exemptions");
} else if (args.mHiddenApiAccessLogSampleRate != -1) {
throw new IllegalArgumentException(
- BLASTULA_ERROR_PREFIX + "--hidden-api-log-sampling-rate=");
+ USAP_ERROR_PREFIX + "--hidden-api-log-sampling-rate=");
} else if (args.mHiddenApiAccessStatslogSampleRate != -1) {
throw new IllegalArgumentException(
- BLASTULA_ERROR_PREFIX + "--hidden-api-statslog-sampling-rate=");
+ USAP_ERROR_PREFIX + "--hidden-api-statslog-sampling-rate=");
} else if (args.mInvokeWith != null) {
- throw new IllegalArgumentException(BLASTULA_ERROR_PREFIX + "--invoke-with");
+ throw new IllegalArgumentException(USAP_ERROR_PREFIX + "--invoke-with");
} else if (args.mPermittedCapabilities != 0 || args.mEffectiveCapabilities != 0) {
throw new ZygoteSecurityException("Client may not specify capabilities: "
+ "permitted=0x" + Long.toHexString(args.mPermittedCapabilities)
@@ -658,25 +657,25 @@ public final class Zygote {
}
/**
- * @return Raw file descriptors for the read-end of blastula reporting pipes.
+ * @return Raw file descriptors for the read-end of USAP reporting pipes.
*/
- protected static int[] getBlastulaPipeFDs() {
- return nativeGetBlastulaPipeFDs();
+ protected static int[] getUsapPipeFDs() {
+ return nativeGetUsapPipeFDs();
}
- private static native int[] nativeGetBlastulaPipeFDs();
+ private static native int[] nativeGetUsapPipeFDs();
/**
- * Remove the blastula table entry for the provided process ID.
+ * Remove the USAP table entry for the provided process ID.
*
- * @param blastulaPID Process ID of the entry to remove
+ * @param usapPID Process ID of the entry to remove
* @return True if the entry was removed; false if it doesn't exist
*/
- protected static boolean removeBlastulaTableEntry(int blastulaPID) {
- return nativeRemoveBlastulaTableEntry(blastulaPID);
+ protected static boolean removeUsapTableEntry(int usapPID) {
+ return nativeRemoveUsapTableEntry(usapPID);
}
- private static native boolean nativeRemoveBlastulaTableEntry(int blastulaPID);
+ private static native boolean nativeRemoveUsapTableEntry(int usapPID);
/**
* uid 1000 (Process.SYSTEM_UID) may specify any uid &gt; 1000 in normal
diff --git a/core/java/com/android/internal/os/ZygoteArguments.java b/core/java/com/android/internal/os/ZygoteArguments.java
index 3beee788a582..28642d8ba80c 100644
--- a/core/java/com/android/internal/os/ZygoteArguments.java
+++ b/core/java/com/android/internal/os/ZygoteArguments.java
@@ -103,8 +103,8 @@ class ZygoteArguments {
/**
*
*/
- boolean mBlastulaPoolEnabled;
- boolean mBlastulaPoolStatusSpecified = false;
+ boolean mUsapPoolEnabled;
+ boolean mUsapPoolStatusSpecified = false;
/**
* from all --rlimit=r,c,m
@@ -418,9 +418,9 @@ class ZygoteArguments {
throw new IllegalArgumentException("Duplicate arg specified");
}
mSandboxId = arg.substring(arg.indexOf('=') + 1);
- } else if (arg.startsWith("--blastula-pool-enabled=")) {
- mBlastulaPoolStatusSpecified = true;
- mBlastulaPoolEnabled = Boolean.parseBoolean(arg.substring(arg.indexOf('=') + 1));
+ } else if (arg.startsWith("--usap-pool-enabled=")) {
+ mUsapPoolStatusSpecified = true;
+ mUsapPoolEnabled = Boolean.parseBoolean(arg.substring(arg.indexOf('=') + 1));
expectRuntimeArgs = false;
} else {
break;
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index bcdce311d940..87adce7c3a62 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -159,8 +159,8 @@ class ZygoteConnection {
return null;
}
- if (parsedArgs.mBlastulaPoolStatusSpecified) {
- return handleBlastulaPoolStatusChange(zygoteServer, parsedArgs.mBlastulaPoolEnabled);
+ if (parsedArgs.mUsapPoolStatusSpecified) {
+ return handleUsapPoolStatusChange(zygoteServer, parsedArgs.mUsapPoolEnabled);
}
if (parsedArgs.mPreloadDefault) {
@@ -331,18 +331,18 @@ class ZygoteConnection {
}
}
- private Runnable stateChangeWithBlastulaPoolReset(ZygoteServer zygoteServer,
+ private Runnable stateChangeWithUsapPoolReset(ZygoteServer zygoteServer,
Runnable stateChangeCode) {
try {
- if (zygoteServer.isBlastulaPoolEnabled()) {
- Zygote.emptyBlastulaPool();
+ if (zygoteServer.isUsapPoolEnabled()) {
+ Zygote.emptyUsapPool();
}
stateChangeCode.run();
- if (zygoteServer.isBlastulaPoolEnabled()) {
+ if (zygoteServer.isUsapPoolEnabled()) {
Runnable fpResult =
- zygoteServer.fillBlastulaPool(
+ zygoteServer.fillUsapPool(
new int[]{mSocket.getFileDescriptor().getInt$()});
if (fpResult != null) {
@@ -363,24 +363,24 @@ class ZygoteConnection {
* Makes the necessary changes to implement a new API blacklist exemption policy, and then
* responds to the system server, letting it know that the task has been completed.
*
- * This necessitates a change to the internal state of the Zygote. As such, if the blastula
- * pool is enabled all existing blastulas have an incorrect API blacklist exemption list. To
+ * This necessitates a change to the internal state of the Zygote. As such, if the USAP
+ * pool is enabled all existing USAPs have an incorrect API blacklist exemption list. To
* properly handle this request the pool must be emptied and refilled. This process can return
* a Runnable object that must be returned to ZygoteServer.runSelectLoop to be invoked.
*
* @param zygoteServer The server object that received the request
* @param exemptions The new exemption list.
- * @return A Runnable object representing a new app in any blastulas spawned from here; the
+ * @return A Runnable object representing a new app in any USAPs spawned from here; the
* zygote process will always receive a null value from this function.
*/
private Runnable handleApiBlacklistExemptions(ZygoteServer zygoteServer, String[] exemptions) {
- return stateChangeWithBlastulaPoolReset(zygoteServer,
+ return stateChangeWithUsapPoolReset(zygoteServer,
() -> ZygoteInit.setApiBlacklistExemptions(exemptions));
}
- private Runnable handleBlastulaPoolStatusChange(ZygoteServer zygoteServer, boolean newStatus) {
+ private Runnable handleUsapPoolStatusChange(ZygoteServer zygoteServer, boolean newStatus) {
try {
- Runnable fpResult = zygoteServer.setBlastulaPoolStatus(newStatus, mSocket);
+ Runnable fpResult = zygoteServer.setUsapPoolStatus(newStatus, mSocket);
if (fpResult == null) {
mSocketOutStream.writeInt(0);
@@ -473,8 +473,8 @@ class ZygoteConnection {
/**
* Changes the API access log sample rate for the Zygote and processes spawned from it.
*
- * This necessitates a change to the internal state of the Zygote. As such, if the blastula
- * pool is enabled all existing blastulas have an incorrect API access log sample rate. To
+ * This necessitates a change to the internal state of the Zygote. As such, if the USAP
+ * pool is enabled all existing USAPs have an incorrect API access log sample rate. To
* properly handle this request the pool must be emptied and refilled. This process can return
* a Runnable object that must be returned to ZygoteServer.runSelectLoop to be invoked.
*
@@ -486,11 +486,10 @@ class ZygoteConnection {
*/
private Runnable handleHiddenApiAccessLogSampleRate(ZygoteServer zygoteServer,
int samplingRate, int statsdSamplingRate) {
- return stateChangeWithBlastulaPoolReset(zygoteServer, () -> {
+ return stateChangeWithUsapPoolReset(zygoteServer, () -> {
int maxSamplingRate = Math.max(samplingRate, statsdSamplingRate);
ZygoteInit.setHiddenApiAccessLogSampleRate(maxSamplingRate);
- HiddenApiUsageLogger.setHiddenApiAccessLogSampleRates(samplingRate,
- statsdSamplingRate);
+ HiddenApiUsageLogger.setHiddenApiAccessLogSampleRates(samplingRate, statsdSamplingRate);
ZygoteInit.setHiddenApiUsageLogger(HiddenApiUsageLogger.getInstance());
});
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 7cddf7588b28..a5e7202c0e50 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -99,7 +99,7 @@ public class ZygoteInit {
private static final String ABI_LIST_ARG = "--abi-list=";
// TODO (chriswailes): Re-name this --zygote-socket-name= and then add a
- // --blastula-socket-name parameter.
+ // --usap-socket-name parameter.
private static final String SOCKET_NAME_ARG = "--socket-name=";
/**
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index c4c98baf0e4c..65953172818e 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -51,39 +51,40 @@ class ZygoteServer {
public static final String TAG = "ZygoteServer";
/**
- * The maximim value that will be accepted from the BLASTULA_POOL_SIZE_MAX device property.
- * is a mirror of BLASTULA_POOL_MAX_LIMIT found in com_android_internal_os_Zygote.cpp.
+ * The maximim value that will be accepted from the USAP_POOL_SIZE_MAX device property.
+ * is a mirror of USAP_POOL_MAX_LIMIT found in com_android_internal_os_Zygote.cpp.
*/
- private static final int BLASTULA_POOL_SIZE_MAX_LIMIT = 100;
+ private static final int USAP_POOL_SIZE_MAX_LIMIT = 100;
/**
- * The minimum value that will be accepted from the BLASTULA_POOL_SIZE_MIN device property.
+ * The minimum value that will be accepted from the USAP_POOL_SIZE_MIN device property.
*/
- private static final int BLASTULA_POOL_SIZE_MIN_LIMIT = 1;
+ private static final int USAP_POOL_SIZE_MIN_LIMIT = 1;
- /** The default value used for the BLASTULA_POOL_SIZE_MAX device property */
- private static final String BLASTULA_POOL_SIZE_MAX_DEFAULT = "10";
+ /** The default value used for the USAP_POOL_SIZE_MAX device property */
+ private static final String USAP_POOL_SIZE_MAX_DEFAULT = "10";
- /** The default value used for the BLASTULA_POOL_SIZE_MIN device property */
- private static final String BLASTULA_POOL_SIZE_MIN_DEFAULT = "1";
+ /** The default value used for the USAP_POOL_SIZE_MIN device property */
+ private static final String USAP_POOL_SIZE_MIN_DEFAULT = "1";
/**
- * Indicates if this Zygote server can support a blastula pool. Currently this should only be
- * true for the primary and secondary Zygotes, and not the App Zygotes or the WebView Zygote.
+ * Indicates if this Zygote server can support a unspecialized app process pool. Currently this
+ * should only be true for the primary and secondary Zygotes, and not the App Zygotes or the
+ * WebView Zygote.
*
* TODO (chriswailes): Make this an explicit argument to the constructor
*/
- private final boolean mBlastulaPoolSupported;
+ private final boolean mUsapPoolSupported;
/**
- * If the blastula pool should be created and used to start applications.
+ * If the unspecialized app process pool should be created and used to start applications.
*
- * Setting this value to false will disable the creation, maintenance, and use of the blastula
- * pool. When the blastula pool is disabled the application lifecycle will be identical to
+ * Setting this value to false will disable the creation, maintenance, and use of the USAP
+ * pool. When the USAP pool is disabled the application lifecycle will be identical to
* previous versions of Android.
*/
- private boolean mBlastulaPoolEnabled = false;
+ private boolean mUsapPoolEnabled = false;
/**
* Listening socket that accepts new server connections.
@@ -91,15 +92,15 @@ class ZygoteServer {
private LocalServerSocket mZygoteSocket;
/**
- * The name of the blastula socket to use if the blastula pool is enabled.
+ * The name of the unspecialized app process pool socket to use if the USAP pool is enabled.
*/
- private LocalServerSocket mBlastulaPoolSocket;
+ private LocalServerSocket mUsapPoolSocket;
/**
* File descriptor used for communication between the signal handler and the ZygoteServer poll
* loop.
* */
- private FileDescriptor mBlastulaPoolEventFD;
+ private FileDescriptor mUsapPoolEventFD;
/**
* Whether or not mZygoteSocket's underlying FD should be closed directly.
@@ -116,62 +117,61 @@ class ZygoteServer {
private boolean mIsForkChild;
/**
- * The runtime-adjustable maximum Blastula pool size.
+ * The runtime-adjustable maximum USAP pool size.
*/
- private int mBlastulaPoolSizeMax = 0;
+ private int mUsapPoolSizeMax = 0;
/**
- * The runtime-adjustable minimum Blastula pool size.
+ * The runtime-adjustable minimum USAP pool size.
*/
- private int mBlastulaPoolSizeMin = 0;
+ private int mUsapPoolSizeMin = 0;
/**
- * The runtime-adjustable value used to determine when to re-fill the
- * blastula pool. The pool will be re-filled when
- * (sBlastulaPoolMax - gBlastulaPoolCount) >= sBlastulaPoolRefillThreshold.
+ * The runtime-adjustable value used to determine when to re-fill the USAP pool. The pool will
+ * be re-filled when (mUsapPoolMax - gUsapPoolCount) >= sUsapPoolRefillThreshold.
*/
- private int mBlastulaPoolRefillThreshold = 0;
+ private int mUsapPoolRefillThreshold = 0;
ZygoteServer() {
- mBlastulaPoolEventFD = null;
+ mUsapPoolEventFD = null;
mZygoteSocket = null;
- mBlastulaPoolSocket = null;
+ mUsapPoolSocket = null;
- mBlastulaPoolSupported = false;
+ mUsapPoolSupported = false;
}
/**
- * Initialize the Zygote server with the Zygote server socket, blastula pool server socket,
- * and blastula pool event FD.
+ * Initialize the Zygote server with the Zygote server socket, USAP pool server socket, and USAP
+ * pool event FD.
*
* @param isPrimaryZygote If this is the primary Zygote or not.
*/
ZygoteServer(boolean isPrimaryZygote) {
- mBlastulaPoolEventFD = Zygote.getBlastulaPoolEventFD();
+ mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
if (isPrimaryZygote) {
mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
- mBlastulaPoolSocket =
+ mUsapPoolSocket =
Zygote.createManagedSocketFromInitSocket(
- Zygote.BLASTULA_POOL_PRIMARY_SOCKET_NAME);
+ Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
} else {
mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
- mBlastulaPoolSocket =
+ mUsapPoolSocket =
Zygote.createManagedSocketFromInitSocket(
- Zygote.BLASTULA_POOL_SECONDARY_SOCKET_NAME);
+ Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
}
- fetchBlastulaPoolPolicyProps();
+ fetchUsapPoolPolicyProps();
- mBlastulaPoolSupported = true;
+ mUsapPoolSupported = true;
}
void setForkChild() {
mIsForkChild = true;
}
- public boolean isBlastulaPoolEnabled() {
- return mBlastulaPoolEnabled;
+ public boolean isUsapPoolEnabled() {
+ return mUsapPoolEnabled;
}
/**
@@ -240,95 +240,95 @@ class ZygoteServer {
return mZygoteSocket.getFileDescriptor();
}
- private void fetchBlastulaPoolPolicyProps() {
- if (mBlastulaPoolSupported) {
- final String blastulaPoolSizeMaxPropString =
+ private void fetchUsapPoolPolicyProps() {
+ if (mUsapPoolSupported) {
+ final String usapPoolSizeMaxPropString =
Zygote.getSystemProperty(
- DeviceConfig.RuntimeNative.BLASTULA_POOL_SIZE_MAX,
- BLASTULA_POOL_SIZE_MAX_DEFAULT);
+ DeviceConfig.RuntimeNative.USAP_POOL_SIZE_MAX,
+ USAP_POOL_SIZE_MAX_DEFAULT);
- if (!blastulaPoolSizeMaxPropString.isEmpty()) {
- mBlastulaPoolSizeMax =
+ if (!usapPoolSizeMaxPropString.isEmpty()) {
+ mUsapPoolSizeMax =
Integer.min(
- Integer.parseInt(blastulaPoolSizeMaxPropString),
- BLASTULA_POOL_SIZE_MAX_LIMIT);
+ Integer.parseInt(usapPoolSizeMaxPropString),
+ USAP_POOL_SIZE_MAX_LIMIT);
}
- final String blastulaPoolSizeMinPropString =
+ final String usapPoolSizeMinPropString =
Zygote.getSystemProperty(
- DeviceConfig.RuntimeNative.BLASTULA_POOL_SIZE_MIN,
- BLASTULA_POOL_SIZE_MIN_DEFAULT);
+ DeviceConfig.RuntimeNative.USAP_POOL_SIZE_MIN,
+ USAP_POOL_SIZE_MIN_DEFAULT);
- if (!blastulaPoolSizeMinPropString.isEmpty()) {
- mBlastulaPoolSizeMin =
+ if (!usapPoolSizeMinPropString.isEmpty()) {
+ mUsapPoolSizeMin =
Integer.max(
- Integer.parseInt(blastulaPoolSizeMinPropString),
- BLASTULA_POOL_SIZE_MIN_LIMIT);
+ Integer.parseInt(usapPoolSizeMinPropString),
+ USAP_POOL_SIZE_MIN_LIMIT);
}
- final String blastulaPoolRefillThresholdPropString =
+ final String usapPoolRefillThresholdPropString =
Zygote.getSystemProperty(
- DeviceConfig.RuntimeNative.BLASTULA_POOL_REFILL_THRESHOLD,
- Integer.toString(mBlastulaPoolSizeMax / 2));
+ DeviceConfig.RuntimeNative.USAP_POOL_REFILL_THRESHOLD,
+ Integer.toString(mUsapPoolSizeMax / 2));
- if (!blastulaPoolRefillThresholdPropString.isEmpty()) {
- mBlastulaPoolRefillThreshold =
+ if (!usapPoolRefillThresholdPropString.isEmpty()) {
+ mUsapPoolRefillThreshold =
Integer.min(
- Integer.parseInt(blastulaPoolRefillThresholdPropString),
- mBlastulaPoolSizeMax);
+ Integer.parseInt(usapPoolRefillThresholdPropString),
+ mUsapPoolSizeMax);
}
}
}
private long mLastPropCheckTimestamp = 0;
- private void fetchBlastulaPoolPolicyPropsWithMinInterval() {
+ private void fetchUsapPoolPolicyPropsWithMinInterval() {
final long currentTimestamp = SystemClock.elapsedRealtime();
if (currentTimestamp - mLastPropCheckTimestamp >= Zygote.PROPERTY_CHECK_INTERVAL) {
- fetchBlastulaPoolPolicyProps();
+ fetchUsapPoolPolicyProps();
mLastPropCheckTimestamp = currentTimestamp;
}
}
/**
- * Checks to see if the current policy says that pool should be refilled, and spawns new
- * blastulas if necessary.
+ * Checks to see if the current policy says that pool should be refilled, and spawns new USAPs
+ * if necessary.
*
* @param sessionSocketRawFDs Anonymous session sockets that are currently open
- * @return In the Zygote process this function will always return null; in blastula processes
- * this function will return a Runnable object representing the new application that is
- * passed up from blastulaMain.
+ * @return In the Zygote process this function will always return null; in unspecialized app
+ * processes this function will return a Runnable object representing the new
+ * application that is passed up from usapMain.
*/
- Runnable fillBlastulaPool(int[] sessionSocketRawFDs) {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Zygote:FillBlastulaPool");
+ Runnable fillUsapPool(int[] sessionSocketRawFDs) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Zygote:FillUsapPool");
- int blastulaPoolCount = Zygote.getBlastulaPoolCount();
- int numBlastulasToSpawn = mBlastulaPoolSizeMax - blastulaPoolCount;
+ int usapPoolCount = Zygote.getUsapPoolCount();
+ int numUsapsToSpawn = mUsapPoolSizeMax - usapPoolCount;
- if (blastulaPoolCount < mBlastulaPoolSizeMin
- || numBlastulasToSpawn >= mBlastulaPoolRefillThreshold) {
+ if (usapPoolCount < mUsapPoolSizeMin
+ || numUsapsToSpawn >= mUsapPoolRefillThreshold) {
// Disable some VM functionality and reset some system values
// before forking.
ZygoteHooks.preFork();
Zygote.resetNicePriority();
- while (blastulaPoolCount++ < mBlastulaPoolSizeMax) {
- Runnable caller = Zygote.forkBlastula(mBlastulaPoolSocket, sessionSocketRawFDs);
+ while (usapPoolCount++ < mUsapPoolSizeMax) {
+ Runnable caller = Zygote.forkUsap(mUsapPoolSocket, sessionSocketRawFDs);
if (caller != null) {
return caller;
}
}
- // Re-enable runtime services for the Zygote. Blastula services
- // are re-enabled in specializeBlastula.
+ // Re-enable runtime services for the Zygote. Services for unspecialized app process
+ // are re-enabled in specializeAppProcess.
ZygoteHooks.postForkCommon();
Log.i("zygote",
- "Filled the blastula pool. New blastulas: " + numBlastulasToSpawn);
+ "Filled the USAP pool. New USAPs: " + numUsapsToSpawn);
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
@@ -337,23 +337,23 @@ class ZygoteServer {
}
/**
- * Empty or fill the blastula pool as dictated by the current and new blastula pool statuses.
+ * Empty or fill the USAP pool as dictated by the current and new USAP pool statuses.
*/
- Runnable setBlastulaPoolStatus(boolean newStatus, LocalSocket sessionSocket) {
- if (!mBlastulaPoolSupported) {
+ Runnable setUsapPoolStatus(boolean newStatus, LocalSocket sessionSocket) {
+ if (!mUsapPoolSupported) {
Log.w(TAG,
- "Attempting to enable a blastula pool for a Zygote that doesn't support it.");
+ "Attempting to enable a USAP pool for a Zygote that doesn't support it.");
return null;
- } else if (mBlastulaPoolEnabled == newStatus) {
+ } else if (mUsapPoolEnabled == newStatus) {
return null;
}
- mBlastulaPoolEnabled = newStatus;
+ mUsapPoolEnabled = newStatus;
if (newStatus) {
- return fillBlastulaPool(new int[]{ sessionSocket.getFileDescriptor().getInt$() });
+ return fillUsapPool(new int[]{ sessionSocket.getFileDescriptor().getInt$() });
} else {
- Zygote.emptyBlastulaPool();
+ Zygote.emptyUsapPool();
return null;
}
}
@@ -371,25 +371,25 @@ class ZygoteServer {
peers.add(null);
while (true) {
- fetchBlastulaPoolPolicyPropsWithMinInterval();
+ fetchUsapPoolPolicyPropsWithMinInterval();
- int[] blastulaPipeFDs = null;
+ int[] usapPipeFDs = null;
StructPollfd[] pollFDs = null;
// Allocate enough space for the poll structs, taking into account
- // the state of the blastula pool for this Zygote (could be a
+ // the state of the USAP pool for this Zygote (could be a
// regular Zygote, a WebView Zygote, or an AppZygote).
- if (mBlastulaPoolEnabled) {
- blastulaPipeFDs = Zygote.getBlastulaPipeFDs();
- pollFDs = new StructPollfd[socketFDs.size() + 1 + blastulaPipeFDs.length];
+ if (mUsapPoolEnabled) {
+ usapPipeFDs = Zygote.getUsapPipeFDs();
+ pollFDs = new StructPollfd[socketFDs.size() + 1 + usapPipeFDs.length];
} else {
pollFDs = new StructPollfd[socketFDs.size()];
}
/*
- * For reasons of correctness the blastula pool pipe and event FDs
+ * For reasons of correctness the USAP pool pipe and event FDs
* must be processed before the session and server sockets. This
- * is to ensure that the blastula pool accounting information is
+ * is to ensure that the USAP pool accounting information is
* accurate when handling other requests like API blacklist
* exemptions.
*/
@@ -402,17 +402,17 @@ class ZygoteServer {
++pollIndex;
}
- final int blastulaPoolEventFDIndex = pollIndex;
+ final int usapPoolEventFDIndex = pollIndex;
- if (mBlastulaPoolEnabled) {
+ if (mUsapPoolEnabled) {
pollFDs[pollIndex] = new StructPollfd();
- pollFDs[pollIndex].fd = mBlastulaPoolEventFD;
+ pollFDs[pollIndex].fd = mUsapPoolEventFD;
pollFDs[pollIndex].events = (short) POLLIN;
++pollIndex;
- for (int blastulaPipeFD : blastulaPipeFDs) {
+ for (int usapPipeFD : usapPipeFDs) {
FileDescriptor managedFd = new FileDescriptor();
- managedFd.setInt$(blastulaPipeFD);
+ managedFd.setInt$(usapPipeFD);
pollFDs[pollIndex] = new StructPollfd();
pollFDs[pollIndex].fd = managedFd;
@@ -427,7 +427,7 @@ class ZygoteServer {
throw new RuntimeException("poll failed", ex);
}
- boolean blastulaPoolFDRead = false;
+ boolean usapPoolFDRead = false;
while (--pollIndex >= 0) {
if ((pollFDs[pollIndex].revents & POLLIN) == 0) {
@@ -441,7 +441,7 @@ class ZygoteServer {
peers.add(newPeer);
socketFDs.add(newPeer.getFileDescriptor());
- } else if (pollIndex < blastulaPoolEventFDIndex) {
+ } else if (pollIndex < usapPoolEventFDIndex) {
// Session socket accepted from the Zygote server socket
try {
@@ -502,56 +502,56 @@ class ZygoteServer {
mIsForkChild = false;
}
} else {
- // Either the blastula pool event FD or a blastula reporting pipe.
+ // Either the USAP pool event FD or a USAP reporting pipe.
- // If this is the event FD the payload will be the number of blastulas removed.
- // If this is a reporting pipe FD the payload will be the PID of the blastula
+ // If this is the event FD the payload will be the number of USAPs removed.
+ // If this is a reporting pipe FD the payload will be the PID of the USAP
// that was just specialized.
long messagePayload = -1;
try {
- byte[] buffer = new byte[Zygote.BLASTULA_MANAGEMENT_MESSAGE_BYTES];
+ byte[] buffer = new byte[Zygote.USAP_MANAGEMENT_MESSAGE_BYTES];
int readBytes = Os.read(pollFDs[pollIndex].fd, buffer, 0, buffer.length);
- if (readBytes == Zygote.BLASTULA_MANAGEMENT_MESSAGE_BYTES) {
+ if (readBytes == Zygote.USAP_MANAGEMENT_MESSAGE_BYTES) {
DataInputStream inputStream =
new DataInputStream(new ByteArrayInputStream(buffer));
messagePayload = inputStream.readLong();
} else {
- Log.e(TAG, "Incomplete read from blastula management FD of size "
+ Log.e(TAG, "Incomplete read from USAP management FD of size "
+ readBytes);
continue;
}
} catch (Exception ex) {
- if (pollIndex == blastulaPoolEventFDIndex) {
- Log.e(TAG, "Failed to read from blastula pool event FD: "
+ if (pollIndex == usapPoolEventFDIndex) {
+ Log.e(TAG, "Failed to read from USAP pool event FD: "
+ ex.getMessage());
} else {
- Log.e(TAG, "Failed to read from blastula reporting pipe: "
+ Log.e(TAG, "Failed to read from USAP reporting pipe: "
+ ex.getMessage());
}
continue;
}
- if (pollIndex > blastulaPoolEventFDIndex) {
- Zygote.removeBlastulaTableEntry((int) messagePayload);
+ if (pollIndex > usapPoolEventFDIndex) {
+ Zygote.removeUsapTableEntry((int) messagePayload);
}
- blastulaPoolFDRead = true;
+ usapPoolFDRead = true;
}
}
- // Check to see if the blastula pool needs to be refilled.
- if (blastulaPoolFDRead) {
+ // Check to see if the USAP pool needs to be refilled.
+ if (usapPoolFDRead) {
int[] sessionSocketRawFDs =
socketFDs.subList(1, socketFDs.size())
.stream()
.mapToInt(fd -> fd.getInt$())
.toArray();
- final Runnable command = fillBlastulaPool(sessionSocketRawFDs);
+ final Runnable command = fillUsapPool(sessionSocketRawFDs);
if (command != null) {
return command;
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index cdaf33f03528..c4626c2093e8 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1639,6 +1639,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
@Override
public void onRootViewScrollYChanged(int rootScrollY) {
mRootScrollY = rootScrollY;
+ if (mDecorCaptionView != null) {
+ mDecorCaptionView.onRootViewScrollYChanged(rootScrollY);
+ }
updateColorViewTranslations();
}
diff --git a/core/java/com/android/internal/widget/DecorCaptionView.java b/core/java/com/android/internal/widget/DecorCaptionView.java
index e90a8d5826f2..19b68e5c467f 100644
--- a/core/java/com/android/internal/widget/DecorCaptionView.java
+++ b/core/java/com/android/internal/widget/DecorCaptionView.java
@@ -103,6 +103,7 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
private final Rect mCloseRect = new Rect();
private final Rect mMaximizeRect = new Rect();
private View mClickTarget;
+ private int mRootScrollY;
public DecorCaptionView(Context context) {
super(context);
@@ -154,10 +155,11 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
final int x = (int) ev.getX();
final int y = (int) ev.getY();
- if (mMaximizeRect.contains(x, y)) {
+ // Only offset y for containment tests because the actual views are already translated.
+ if (mMaximizeRect.contains(x, y - mRootScrollY)) {
mClickTarget = mMaximize;
}
- if (mCloseRect.contains(x, y)) {
+ if (mCloseRect.contains(x, y - mRootScrollY)) {
mClickTarget = mClose;
}
}
@@ -417,4 +419,16 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
+
+ /**
+ * Called when {@link android.view.ViewRootImpl} scrolls for adjustPan.
+ */
+ public void onRootViewScrollYChanged(int scrollY) {
+ // Offset the caption opposite the root scroll. This keeps the caption at the
+ // top of the window during adjustPan.
+ if (mCaption != null) {
+ mRootScrollY = scrollY;
+ mCaption.setTranslationY(scrollY);
+ }
+ }
}
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 3537465db682..958bb18192fb 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -206,6 +206,8 @@ public class SystemConfig {
// associate with any other apps, but does not limit what apps B can associate with.
final ArrayMap<String, ArraySet<String>> mAllowedAssociations = new ArrayMap<>();
+ private final ArraySet<String> mBugreportWhitelistedPackages = new ArraySet<>();
+
public static SystemConfig getInstance() {
synchronized (SystemConfig.class) {
if (sInstance == null) {
@@ -339,6 +341,10 @@ public class SystemConfig {
return mAllowedAssociations;
}
+ public ArraySet<String> getBugreportWhitelistedPackages() {
+ return mBugreportWhitelistedPackages;
+ }
+
SystemConfig() {
// Read configuration from system
readPermissions(Environment.buildPath(
@@ -924,6 +930,15 @@ public class SystemConfig {
}
XmlUtils.skipCurrentTag(parser);
} break;
+ case "bugreport-whitelisted": {
+ String pkgname = parser.getAttributeValue(null, "package");
+ if (pkgname == null) {
+ Slog.w(TAG, "<" + name + "> without package in " + permFile
+ + " at " + parser.getPositionDescription());
+ } else {
+ mBugreportWhitelistedPackages.add(pkgname);
+ }
+ } break;
default: {
Slog.w(TAG, "Tag " + name + " is unknown in "
+ permFile + " at " + parser.getPositionDescription());
diff --git a/core/jni/android/graphics/TEST_MAPPING b/core/jni/android/graphics/TEST_MAPPING
new file mode 100644
index 000000000000..10bd0ee906fd
--- /dev/null
+++ b/core/jni/android/graphics/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsGraphicsTestCases"
+ }
+ ]
+}
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index af2d41399016..bf56ef438a1d 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -238,6 +238,11 @@ static jobjectArray NativeCreateIdmapsForStaticOverlaysTargetingAndroid(JNIEnv*
return env->NewObjectArray(0, g_stringClass, nullptr);
}
+ if (access("/system/bin/idmap2", X_OK) == -1) {
+ PLOG(WARNING) << "unable to execute idmap2";
+ return nullptr;
+ }
+
std::vector<std::string> argv{"/system/bin/idmap2",
"scan",
"--recursive",
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 2ccb01adfd3e..c6f62ca5ae5b 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -138,32 +138,32 @@ static constexpr std::string_view ANDROID_SOCKET_PREFIX("ANDROID_SOCKET_");
static int gZygoteSocketFD = -1;
/**
- * The file descriptor for the Blastula pool socket opened by init.
+ * The file descriptor for the unspecialized app process (USAP) pool socket opened by init.
*/
-static int gBlastulaPoolSocketFD = -1;
+static int gUsapPoolSocketFD = -1;
/**
- * The number of Blastulas currently in this Zygote's pool.
+ * The number of USAPs currently in this Zygote's pool.
*/
-static std::atomic_uint32_t gBlastulaPoolCount = 0;
+static std::atomic_uint32_t gUsapPoolCount = 0;
/**
- * Event file descriptor used to communicate reaped blastulas to the
+ * Event file descriptor used to communicate reaped USAPs to the
* ZygoteServer.
*/
-static int gBlastulaPoolEventFD = -1;
+static int gUsapPoolEventFD = -1;
/**
- * The maximum value that the gBlastulaPoolSizeMax variable may take. This value
- * is a mirror of ZygoteServer.BLASTULA_POOL_SIZE_MAX_LIMIT
+ * The maximum value that the gUSAPPoolSizeMax variable may take. This value
+ * is a mirror of ZygoteServer.USAP_POOL_SIZE_MAX_LIMIT
*/
-static constexpr int BLASTULA_POOL_SIZE_MAX_LIMIT = 100;
+static constexpr int USAP_POOL_SIZE_MAX_LIMIT = 100;
/**
- * A helper class containing accounting information for Blastulas.
+ * A helper class containing accounting information for USAPs.
*/
-class BlastulaTableEntry {
+class UsapTableEntry {
public:
struct EntryStorage {
int32_t pid;
@@ -181,7 +181,7 @@ class BlastulaTableEntry {
static_assert(decltype(mStorage)::is_always_lock_free);
public:
- constexpr BlastulaTableEntry() : mStorage(INVALID_ENTRY_VALUE) {}
+ constexpr UsapTableEntry() : mStorage(INVALID_ENTRY_VALUE) {}
/**
* If the provided PID matches the one stored in this entry, the entry will
@@ -246,7 +246,7 @@ class BlastulaTableEntry {
* Sets the entry to the given values if it is currently invalid.
*
* @param pid The process ID for the new entry.
- * @param read_pipe_fd The read end of the blastula control pipe for this
+ * @param read_pipe_fd The read end of the USAP control pipe for this
* process.
* @return True if the entry was set; false otherwise.
*/
@@ -263,14 +263,14 @@ class BlastulaTableEntry {
};
/**
- * A table containing information about the Blastulas currently in the pool.
+ * A table containing information about the USAPs currently in the pool.
*
* Multiple threads may be attempting to modify the table, either from the
* signal handler or from the ZygoteServer poll loop. Atomic loads/stores in
- * the BlastulaTableEntry class prevent data races during these concurrent
+ * the USAPTableEntry class prevent data races during these concurrent
* operations.
*/
-static std::array<BlastulaTableEntry, BLASTULA_POOL_SIZE_MAX_LIMIT> gBlastulaTable;
+static std::array<UsapTableEntry, USAP_POOL_SIZE_MAX_LIMIT> gUsapTable;
/**
* The list of open zygote file descriptors.
@@ -295,7 +295,7 @@ enum RuntimeFlags : uint32_t {
};
// Forward declaration so we don't have to move the signal handler.
-static bool RemoveBlastulaTableEntry(pid_t blastula_pid);
+static bool RemoveUsapTableEntry(pid_t usap_pid);
static void RuntimeAbort(JNIEnv* env, int line, const char* msg) {
std::ostringstream oss;
@@ -307,7 +307,7 @@ static void RuntimeAbort(JNIEnv* env, int line, const char* msg) {
static void SigChldHandler(int /*signal_number*/) {
pid_t pid;
int status;
- int64_t blastulas_removed = 0;
+ int64_t usaps_removed = 0;
// It's necessary to save and restore the errno during this function.
// Since errno is stored per thread, changing it here modifies the errno
@@ -338,9 +338,9 @@ static void SigChldHandler(int /*signal_number*/) {
kill(getpid(), SIGKILL);
}
- // Check to see if the PID is in the blastula pool and remove it if it is.
- if (RemoveBlastulaTableEntry(pid)) {
- ++blastulas_removed;
+ // Check to see if the PID is in the USAP pool and remove it if it is.
+ if (RemoveUsapTableEntry(pid)) {
+ ++usaps_removed;
}
}
@@ -351,12 +351,12 @@ static void SigChldHandler(int /*signal_number*/) {
"Zygote SIGCHLD error in waitpid: %s", strerror(errno));
}
- if (blastulas_removed > 0) {
- if (write(gBlastulaPoolEventFD, &blastulas_removed, sizeof(blastulas_removed)) == -1) {
+ if (usaps_removed > 0) {
+ if (write(gUsapPoolEventFD, &usaps_removed, sizeof(usaps_removed)) == -1) {
// If this write fails something went terribly wrong. We will now kill
// the zygote and let the system bring it back up.
async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG,
- "Zygote failed to write to blastula pool event FD: %s",
+ "Zygote failed to write to USAP pool event FD: %s",
strerror(errno));
kill(getpid(), SIGKILL);
}
@@ -1181,12 +1181,12 @@ static void UnblockSignal(int signum, fail_fn_t fail_fn) {
}
}
-static void ClearBlastulaTable() {
- for (BlastulaTableEntry& entry : gBlastulaTable) {
+static void ClearUsapTable() {
+ for (UsapTableEntry& entry : gUsapTable) {
entry.Clear();
}
- gBlastulaPoolCount = 0;
+ gUsapPoolCount = 0;
}
// Utility routine to fork a process from the zygote.
@@ -1231,8 +1231,8 @@ static pid_t ForkCommon(JNIEnv* env, bool is_system_server,
// Clean up any descriptors which must be closed immediately
DetachDescriptors(env, fds_to_close, fail_fn);
- // Invalidate the entries in the blastula table.
- ClearBlastulaTable();
+ // Invalidate the entries in the USAP table.
+ ClearUsapTable();
// Re-open all remaining open file descriptors so that they aren't shared
// with the zygote across a fork.
@@ -1525,47 +1525,47 @@ static jlong CalculateCapabilities(JNIEnv* env, jint uid, jint gid, jintArray gi
}
/**
- * Adds the given information about a newly created blastula to the Zygote's
- * blastula table.
+ * Adds the given information about a newly created unspecialized app
+ * processes to the Zygote's USAP table.
*
- * @param blastula_pid Process ID of the newly created blastula
- * @param read_pipe_fd File descriptor for the read end of the blastula
- * reporting pipe. Used in the ZygoteServer poll loop to track blastula
+ * @param usap_pid Process ID of the newly created USAP
+ * @param read_pipe_fd File descriptor for the read end of the USAP
+ * reporting pipe. Used in the ZygoteServer poll loop to track USAP
* specialization.
*/
-static void AddBlastulaTableEntry(pid_t blastula_pid, int read_pipe_fd) {
- static int sBlastulaTableInsertIndex = 0;
+static void AddUsapTableEntry(pid_t usap_pid, int read_pipe_fd) {
+ static int sUsapTableInsertIndex = 0;
- int search_index = sBlastulaTableInsertIndex;
+ int search_index = sUsapTableInsertIndex;
do {
- if (gBlastulaTable[search_index].SetIfInvalid(blastula_pid, read_pipe_fd)) {
+ if (gUsapTable[search_index].SetIfInvalid(usap_pid, read_pipe_fd)) {
// Start our next search right after where we finished this one.
- sBlastulaTableInsertIndex = (search_index + 1) % gBlastulaTable.size();
+ sUsapTableInsertIndex = (search_index + 1) % gUsapTable.size();
return;
}
- search_index = (search_index + 1) % gBlastulaTable.size();
- } while (search_index != sBlastulaTableInsertIndex);
+ search_index = (search_index + 1) % gUsapTable.size();
+ } while (search_index != sUsapTableInsertIndex);
// Much like money in the banana stand, there should always be an entry
- // in the blastula table.
+ // in the USAP table.
__builtin_unreachable();
}
/**
- * Invalidates the entry in the BlastulaTable corresponding to the provided
- * process ID if it is present. If an entry was removed the blastula pool
+ * Invalidates the entry in the USAPTable corresponding to the provided
+ * process ID if it is present. If an entry was removed the USAP pool
* count is decremented.
*
- * @param blastula_pid Process ID of the blastula entry to invalidate
+ * @param usap_pid Process ID of the USAP entry to invalidate
* @return True if an entry was invalidated; false otherwise
*/
-static bool RemoveBlastulaTableEntry(pid_t blastula_pid) {
- for (BlastulaTableEntry& entry : gBlastulaTable) {
- if (entry.ClearForPID(blastula_pid)) {
- --gBlastulaPoolCount;
+static bool RemoveUsapTableEntry(pid_t usap_pid) {
+ for (UsapTableEntry& entry : gUsapTable) {
+ if (entry.ClearForPID(usap_pid)) {
+ --gUsapPoolCount;
return true;
}
}
@@ -1574,13 +1574,13 @@ static bool RemoveBlastulaTableEntry(pid_t blastula_pid) {
}
/**
- * @return A vector of the read pipe FDs for each of the active blastulas.
+ * @return A vector of the read pipe FDs for each of the active USAPs.
*/
-std::vector<int> MakeBlastulaPipeReadFDVector() {
+std::vector<int> MakeUsapPipeReadFDVector() {
std::vector<int> fd_vec;
- fd_vec.reserve(gBlastulaTable.size());
+ fd_vec.reserve(gUsapTable.size());
- for (BlastulaTableEntry& entry : gBlastulaTable) {
+ for (UsapTableEntry& entry : gUsapTable) {
auto entry_values = entry.GetValues();
if (entry_values.has_value()) {
@@ -1624,16 +1624,16 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
ExtractJIntArray(env, "zygote", nice_name, managed_fds_to_ignore)
.value_or(std::vector<int>());
- std::vector<int> blastula_pipes = MakeBlastulaPipeReadFDVector();
+ std::vector<int> usap_pipes = MakeUsapPipeReadFDVector();
- fds_to_close.insert(fds_to_close.end(), blastula_pipes.begin(), blastula_pipes.end());
- fds_to_ignore.insert(fds_to_ignore.end(), blastula_pipes.begin(), blastula_pipes.end());
+ fds_to_close.insert(fds_to_close.end(), usap_pipes.begin(), usap_pipes.end());
+ fds_to_ignore.insert(fds_to_ignore.end(), usap_pipes.begin(), usap_pipes.end());
- fds_to_close.push_back(gBlastulaPoolSocketFD);
+ fds_to_close.push_back(gUsapPoolSocketFD);
- if (gBlastulaPoolEventFD != -1) {
- fds_to_close.push_back(gBlastulaPoolEventFD);
- fds_to_ignore.push_back(gBlastulaPoolEventFD);
+ if (gUsapPoolEventFD != -1) {
+ fds_to_close.push_back(gUsapPoolEventFD);
+ fds_to_ignore.push_back(gUsapPoolEventFD);
}
pid_t pid = ForkCommon(env, false, fds_to_close, fds_to_ignore);
@@ -1652,14 +1652,14 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer(
JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities,
jlong effective_capabilities) {
- std::vector<int> fds_to_close(MakeBlastulaPipeReadFDVector()),
+ std::vector<int> fds_to_close(MakeUsapPipeReadFDVector()),
fds_to_ignore(fds_to_close);
- fds_to_close.push_back(gBlastulaPoolSocketFD);
+ fds_to_close.push_back(gUsapPoolSocketFD);
- if (gBlastulaPoolEventFD != -1) {
- fds_to_close.push_back(gBlastulaPoolEventFD);
- fds_to_ignore.push_back(gBlastulaPoolEventFD);
+ if (gUsapPoolEventFD != -1) {
+ fds_to_close.push_back(gUsapPoolEventFD);
+ fds_to_ignore.push_back(gUsapPoolEventFD);
}
pid_t pid = ForkCommon(env, true,
@@ -1696,49 +1696,52 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer(
}
/**
- * A JNI function that forks a blastula from the Zygote while ensuring proper
- * file descriptor hygiene.
+ * A JNI function that forks an unspecialized app process from the Zygote while
+ * ensuring proper file descriptor hygiene.
*
* @param env Managed runtime environment
- * @param read_pipe_fd The read FD for the blastula reporting pipe. Manually closed by blastlas
+ * @param read_pipe_fd The read FD for the USAP reporting pipe. Manually closed by blastlas
* in managed code.
- * @param write_pipe_fd The write FD for the blastula reporting pipe. Manually closed by the
+ * @param write_pipe_fd The write FD for the USAP reporting pipe. Manually closed by the
* zygote in managed code.
* @param managed_session_socket_fds A list of anonymous session sockets that must be ignored by
- * the FD hygiene code and automatically "closed" in the new blastula.
+ * the FD hygiene code and automatically "closed" in the new USAP.
* @return
*/
-static jint com_android_internal_os_Zygote_nativeForkBlastula(JNIEnv* env, jclass,
- jint read_pipe_fd, jint write_pipe_fd, jintArray managed_session_socket_fds) {
- std::vector<int> fds_to_close(MakeBlastulaPipeReadFDVector()),
+static jint com_android_internal_os_Zygote_nativeForkUsap(JNIEnv* env,
+ jclass,
+ jint read_pipe_fd,
+ jint write_pipe_fd,
+ jintArray managed_session_socket_fds) {
+ std::vector<int> fds_to_close(MakeUsapPipeReadFDVector()),
fds_to_ignore(fds_to_close);
std::vector<int> session_socket_fds =
- ExtractJIntArray(env, "blastula", nullptr, managed_session_socket_fds)
+ ExtractJIntArray(env, "USAP", nullptr, managed_session_socket_fds)
.value_or(std::vector<int>());
- // The Blastula Pool Event FD is created during the initialization of the
- // blastula pool and should always be valid here.
+ // The USAP Pool Event FD is created during the initialization of the
+ // USAP pool and should always be valid here.
fds_to_close.push_back(gZygoteSocketFD);
- fds_to_close.push_back(gBlastulaPoolEventFD);
+ fds_to_close.push_back(gUsapPoolEventFD);
fds_to_close.insert(fds_to_close.end(), session_socket_fds.begin(), session_socket_fds.end());
fds_to_ignore.push_back(gZygoteSocketFD);
- fds_to_ignore.push_back(gBlastulaPoolSocketFD);
- fds_to_ignore.push_back(gBlastulaPoolEventFD);
+ fds_to_ignore.push_back(gUsapPoolSocketFD);
+ fds_to_ignore.push_back(gUsapPoolEventFD);
fds_to_ignore.push_back(read_pipe_fd);
fds_to_ignore.push_back(write_pipe_fd);
fds_to_ignore.insert(fds_to_ignore.end(), session_socket_fds.begin(), session_socket_fds.end());
- pid_t blastula_pid = ForkCommon(env, /* is_system_server= */ false, fds_to_close, fds_to_ignore);
+ pid_t usap_pid = ForkCommon(env, /* is_system_server= */ false, fds_to_close, fds_to_ignore);
- if (blastula_pid != 0) {
- ++gBlastulaPoolCount;
- AddBlastulaTableEntry(blastula_pid, read_pipe_fd);
+ if (usap_pid != 0) {
+ ++gUsapPoolCount;
+ AddUsapTableEntry(usap_pid, read_pipe_fd);
}
- return blastula_pid;
+ return usap_pid;
}
static void com_android_internal_os_Zygote_nativeAllowFileAcrossFork(
@@ -1803,7 +1806,8 @@ static void com_android_internal_os_Zygote_nativeInstallSeccompUidGidFilter(
}
/**
- * Called from a blastula to specialize the process for a specific application.
+ * Called from an unspecialized app process to specialize the process for a
+ * given application.
*
* @param env Managed runtime environment
* @param uid User ID of the new application
@@ -1818,7 +1822,7 @@ static void com_android_internal_os_Zygote_nativeInstallSeccompUidGidFilter(
* @param instruction_set The instruction set expected/requested by the new application
* @param app_data_dir Path to the application's data directory
*/
-static void com_android_internal_os_Zygote_nativeSpecializeBlastula(
+static void com_android_internal_os_Zygote_nativeSpecializeAppProcess(
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
jint runtime_flags, jobjectArray rlimits,
jint mount_external, jstring se_info, jstring nice_name,
@@ -1855,77 +1859,77 @@ static void com_android_internal_os_Zygote_nativeGetSocketFDs(JNIEnv* env, jclas
ALOGE("Unable to fetch Zygote socket file descriptor");
}
- env_var_name = android_socket_prefix + (is_primary ? "blastula_pool" : "blastula_pool_secondary");
+ env_var_name = android_socket_prefix + (is_primary ? "usap_pool_primary" : "usap_pool_secondary");
env_var_val = getenv(env_var_name.c_str());
if (env_var_val != nullptr) {
- gBlastulaPoolSocketFD = atoi(env_var_val);
- ALOGV("Zygote:blastulaPoolSocketFD = %d", gBlastulaPoolSocketFD);
+ gUsapPoolSocketFD = atoi(env_var_val);
+ ALOGV("Zygote:usapPoolSocketFD = %d", gUsapPoolSocketFD);
} else {
- ALOGE("Unable to fetch Blastula pool socket file descriptor");
+ ALOGE("Unable to fetch USAP pool socket file descriptor");
}
}
/**
* @param env Managed runtime environment
- * @return A managed array of raw file descriptors for the read ends of the blastula reporting
+ * @return A managed array of raw file descriptors for the read ends of the USAP reporting
* pipes.
*/
-static jintArray com_android_internal_os_Zygote_nativeGetBlastulaPipeFDs(JNIEnv* env, jclass) {
- std::vector<int> blastula_fds = MakeBlastulaPipeReadFDVector();
+static jintArray com_android_internal_os_Zygote_nativeGetUsapPipeFDs(JNIEnv* env, jclass) {
+ std::vector<int> usap_fds = MakeUsapPipeReadFDVector();
- jintArray managed_blastula_fds = env->NewIntArray(blastula_fds.size());
- env->SetIntArrayRegion(managed_blastula_fds, 0, blastula_fds.size(), blastula_fds.data());
+ jintArray managed_usap_fds = env->NewIntArray(usap_fds.size());
+ env->SetIntArrayRegion(managed_usap_fds, 0, usap_fds.size(), usap_fds.data());
- return managed_blastula_fds;
+ return managed_usap_fds;
}
/**
- * A JNI wrapper around RemoveBlastulaTableEntry.
+ * A JNI wrapper around RemoveUsapTableEntry.
*
* @param env Managed runtime environment
- * @param blastula_pid Process ID of the blastula entry to invalidate
+ * @param usap_pid Process ID of the USAP entry to invalidate
* @return True if an entry was invalidated; false otherwise.
*/
-static jboolean com_android_internal_os_Zygote_nativeRemoveBlastulaTableEntry(JNIEnv* env, jclass,
- jint blastula_pid) {
- return RemoveBlastulaTableEntry(blastula_pid);
+static jboolean com_android_internal_os_Zygote_nativeRemoveUsapTableEntry(JNIEnv* env, jclass,
+ jint usap_pid) {
+ return RemoveUsapTableEntry(usap_pid);
}
/**
- * Creates the blastula pool event FD if it doesn't exist and returns it. This is used by the
- * ZygoteServer poll loop to know when to re-fill the blastula pool.
+ * Creates the USAP pool event FD if it doesn't exist and returns it. This is used by the
+ * ZygoteServer poll loop to know when to re-fill the USAP pool.
*
* @param env Managed runtime environment
* @return A raw event file descriptor used to communicate (from the signal handler) when the
- * Zygote receives a SIGCHLD for a blastula
+ * Zygote receives a SIGCHLD for a USAP
*/
-static jint com_android_internal_os_Zygote_nativeGetBlastulaPoolEventFD(JNIEnv* env, jclass) {
- if (gBlastulaPoolEventFD == -1) {
- if ((gBlastulaPoolEventFD = eventfd(0, 0)) == -1) {
+static jint com_android_internal_os_Zygote_nativeGetUsapPoolEventFD(JNIEnv* env, jclass) {
+ if (gUsapPoolEventFD == -1) {
+ if ((gUsapPoolEventFD = eventfd(0, 0)) == -1) {
ZygoteFailure(env, "zygote", nullptr, StringPrintf("Unable to create eventfd: %s", strerror(errno)));
}
}
- return gBlastulaPoolEventFD;
+ return gUsapPoolEventFD;
}
/**
* @param env Managed runtime environment
- * @return The number of blastulas currently in the blastula pool
+ * @return The number of USAPs currently in the USAP pool
*/
-static jint com_android_internal_os_Zygote_nativeGetBlastulaPoolCount(JNIEnv* env, jclass) {
- return gBlastulaPoolCount;
+static jint com_android_internal_os_Zygote_nativeGetUsapPoolCount(JNIEnv* env, jclass) {
+ return gUsapPoolCount;
}
/**
- * Kills all processes currently in the blastula pool.
+ * Kills all processes currently in the USAP pool and closes their read pipe
+ * FDs.
*
* @param env Managed runtime environment
- * @return The number of blastulas currently in the blastula pool
*/
-static void com_android_internal_os_Zygote_nativeEmptyBlastulaPool(JNIEnv* env, jclass) {
- for (auto& entry : gBlastulaTable) {
+static void com_android_internal_os_Zygote_nativeEmptyUsapPool(JNIEnv* env, jclass) {
+ for (auto& entry : gUsapTable) {
auto entry_storage = entry.GetValues();
if (entry_storage.has_value()) {
@@ -1934,7 +1938,7 @@ static void com_android_internal_os_Zygote_nativeEmptyBlastulaPool(JNIEnv* env,
// Avoid a second atomic load by invalidating instead of clearing.
entry.Invalidate();
- --gBlastulaPoolCount;
+ --gUsapPoolCount;
}
}
}
@@ -1955,23 +1959,23 @@ static const JNINativeMethod gMethods[] = {
(void *) com_android_internal_os_Zygote_nativePreApplicationInit },
{ "nativeInstallSeccompUidGidFilter", "(II)V",
(void *) com_android_internal_os_Zygote_nativeInstallSeccompUidGidFilter },
- { "nativeForkBlastula", "(II[I)I",
- (void *) com_android_internal_os_Zygote_nativeForkBlastula },
- { "nativeSpecializeBlastula",
+ { "nativeForkUsap", "(II[I)I",
+ (void *) com_android_internal_os_Zygote_nativeForkUsap },
+ { "nativeSpecializeAppProcess",
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V",
- (void *) com_android_internal_os_Zygote_nativeSpecializeBlastula },
+ (void *) com_android_internal_os_Zygote_nativeSpecializeAppProcess },
{ "nativeGetSocketFDs", "(Z)V",
(void *) com_android_internal_os_Zygote_nativeGetSocketFDs },
- { "nativeGetBlastulaPipeFDs", "()[I",
- (void *) com_android_internal_os_Zygote_nativeGetBlastulaPipeFDs },
- { "nativeRemoveBlastulaTableEntry", "(I)Z",
- (void *) com_android_internal_os_Zygote_nativeRemoveBlastulaTableEntry },
- { "nativeGetBlastulaPoolEventFD", "()I",
- (void *) com_android_internal_os_Zygote_nativeGetBlastulaPoolEventFD },
- { "nativeGetBlastulaPoolCount", "()I",
- (void *) com_android_internal_os_Zygote_nativeGetBlastulaPoolCount },
- { "nativeEmptyBlastulaPool", "()V",
- (void *) com_android_internal_os_Zygote_nativeEmptyBlastulaPool }
+ { "nativeGetUsapPipeFDs", "()[I",
+ (void *) com_android_internal_os_Zygote_nativeGetUsapPipeFDs },
+ { "nativeRemoveUsapTableEntry", "(I)Z",
+ (void *) com_android_internal_os_Zygote_nativeRemoveUsapTableEntry },
+ { "nativeGetUsapPoolEventFD", "()I",
+ (void *) com_android_internal_os_Zygote_nativeGetUsapPoolEventFD },
+ { "nativeGetUsapPoolCount", "()I",
+ (void *) com_android_internal_os_Zygote_nativeGetUsapPoolCount },
+ { "nativeEmptyUsapPool", "()V",
+ (void *) com_android_internal_os_Zygote_nativeEmptyUsapPool }
};
int register_com_android_internal_os_Zygote(JNIEnv* env) {
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index 4b37f13cbb33..d8d46560876d 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -38,8 +38,8 @@ static const char* kPathWhitelist[] = {
"/dev/null",
"/dev/socket/zygote",
"/dev/socket/zygote_secondary",
- "/dev/socket/blastula_pool",
- "/dev/socket/blastula_pool_secondary",
+ "/dev/socket/usap_pool_primary",
+ "/dev/socket/usap_pool_secondary",
"/dev/socket/webview_zygote",
"/dev/socket/heapprofd",
"/sys/kernel/debug/tracing/trace_marker",
@@ -215,7 +215,7 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd, fail_fn_t fail_fn)
// S_ISDIR : Not supported. (We could if we wanted to, but it's unused).
// S_ISLINK : Not supported.
// S_ISBLK : Not supported.
- // S_ISFIFO : Not supported. Note that the Zygote and blastulas use pipes to
+ // S_ISFIFO : Not supported. Note that the Zygote and USAPs use pipes to
// communicate with the child processes across forks but those should have been
// added to the redirection exemption list.
if (!S_ISCHR(f_stat.st_mode) && !S_ISREG(f_stat.st_mode)) {
diff --git a/core/jni/runtime_native_boot-flags-test.sh b/core/jni/runtime_native_boot-flags-test.sh
index a5d7a5a9ca61..cdfeffcc7bbb 100755
--- a/core/jni/runtime_native_boot-flags-test.sh
+++ b/core/jni/runtime_native_boot-flags-test.sh
@@ -139,35 +139,33 @@ function find_zygote_runtime_option {
adb logcat -d -s "$zygote" | grep -q -e "option\[[0-9]\+\]=$runtime_option"
}
-# check_zygote_gc_runtime_option CONTEXT VALUE
-# --------------------------------------------
-# Check that all zygote processes are passed device configuration flag VALUE as
-# GC runtime option. Use CONTEXT in logging.
-function check_zygote_gc_runtime_option {
+# check_zygote_runtime_option CONTEXT RUNTIME_OPTION
+# --------------------------------------------------
+# Check that all zygote processes are passed RUNTIME_OPTION as runtime option. Use
+# CONTEXT in logging.
+function check_zygote_runtime_option {
local context=$1
- local value=$2
+ local runtime_option=$2
say \
- "[$context] Check that all zygote processes are passed the flag value as a GC runtime option..."
- local runtime_option="-Xgc:$value"
+ "[$context] Check that all zygote processes are passed \`$runtime_option\` as runtime option..."
for zygote in $zygotes; do
- find_zygote_runtime_option "$zygote" "$runtime_option"\
+ find_zygote_runtime_option "$zygote" "$runtime_option" \
|| fail "Found no \`$runtime_option\` among runtime options passed to \`$zygote\`"
done
}
-# check_no_zygote_gc_runtime_option CONTEXT VALUE
-# -----------------------------------------------
-# Check that no zygote process is passed device configuration flag VALUE as GC
-# runtime option. Use CONTEXT in logging.
-function check_no_zygote_gc_runtime_option {
+# check_no_zygote_runtime_option CONTEXT RUNTIME_OPTION
+# -----------------------------------------------------
+# Check that no zygote process is passed RUNTIME_OPTION as runtime option. Use
+# CONTEXT in logging.
+function check_no_zygote_runtime_option {
local context=$1
- local value=$2
+ local runtime_option=$2
- say "[$context] Check no zygote process is passed the flag value as a GC runtime option..."
- local runtime_option="-Xgc:$value"
+ say "[$context] Check that no zygote process is passed \`$runtime_option\` as runtime option..."
for zygote in $zygotes; do
- find_zygote_runtime_option "$zygote" "$runtime_option"\
+ find_zygote_runtime_option "$zygote" "$runtime_option" \
&& fail "Found \`$runtime_option\` among runtime options passed to \`$zygote\`"
done
}
@@ -270,17 +268,17 @@ esac
# ==========================================
function check_nogenerational_cc {
- check_zygote_gc_runtime_option "$1" nogenerational_cc
+ check_zygote_runtime_option "$1" "-Xgc:nogenerational_cc"
}
function check_no_nogenerational_cc {
- check_no_zygote_gc_runtime_option "$1" nogenerational_cc
+ check_no_zygote_runtime_option "$1" "-Xgc:nogenerational_cc"
}
function check_generational_cc {
- check_zygote_gc_runtime_option "$1" generational_cc
+ check_zygote_runtime_option "$1" "-Xgc:generational_cc"
}
function check_no_generational_cc {
- check_no_zygote_gc_runtime_option "$1" generational_cc
+ check_no_zygote_runtime_option "$1" "-Xgc:generational_cc"
}
test_android_runtime_flag \
@@ -299,11 +297,14 @@ function check_no_default_boot_image {
check_no_android_runtime_message "$1" "$default_boot_image_message"
}
-apex_boot_image_message="Using Apex boot image: '-Ximage:/system/framework/apex.art'"
+apex_boot_image_option="-Ximage:/system/framework/apex.art"
+apex_boot_image_message="Using Apex boot image: '$apex_boot_image_option'"
function check_apex_boot_image {
+ check_zygote_runtime_option "$1" "$apex_boot_image_option"
check_android_runtime_message "$1" "$apex_boot_image_message"
}
function check_no_apex_boot_image {
+ check_no_zygote_runtime_option "$1" "$apex_boot_image_option"
check_no_android_runtime_message "$1" "$apex_boot_image_message"
}
diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto
index efbe8bacb58f..5064d23453a7 100644
--- a/core/proto/android/app/settings_enums.proto
+++ b/core/proto/android/app/settings_enums.proto
@@ -2284,4 +2284,10 @@ enum PageId {
PAGE_ATSCP = 1672;
PAGE_ATHNP = 1673;
+
+ // OPEN: Accessibility detail settings (android.settings.ACCESSIBILITY_DETAILS_SETTINGS intent)
+ ACCESSIBILITY_DETAILS_SETTINGS = 1682;
+
+ // Open: Settings will show the conditional when Grayscale mode is on
+ SETTINGS_CONDITION_GRAYSCALE_MODE = 1683;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 0149365b4fb5..ae3e714eb950 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2935,6 +2935,13 @@
<permission android:name="android.permission.TEMPORARY_ENABLE_ACCESSIBILITY"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an application to launch detail settings activity of a particular
+ accessibility service.
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"
+ android:protectionLevel="signature|installer" />
+
<!-- @SystemApi Allows an application to watch and control how activities are
started globally in the system. Only for is in debugging
(usually the monkey command).
@@ -4438,15 +4445,23 @@
@hide -->
<permission android:name="android.permission.RECEIVE_DEVICE_CUSTOMIZATION_READY"
android:protectionLevel="signature|preinstalled" />
+
<!-- @SystemApi Allows wallpaper to be rendered in ambient mode.
@hide -->
<permission android:name="android.permission.AMBIENT_WALLPAPER"
android:protectionLevel="signature|preinstalled" />
+
<!-- @SystemApi Allows sensor privacy to be modified.
@hide -->
<permission android:name="android.permission.MANAGE_SENSOR_PRIVACY"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an activity to replace the app name and icon displayed in share targets
+ in the sharesheet for the Q-release and later.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON"
+ android:protectionLevel="signature|privileged" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
diff --git a/core/res/res/color-car/car_borderless_button_text_color.xml b/core/res/res/color-car/car_borderless_button_text_color.xml
new file mode 100644
index 000000000000..1cdd6cd901af
--- /dev/null
+++ b/core/res/res/color-car/car_borderless_button_text_color.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default text colors for car buttons when enabled/disabled. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@*android:color/car_grey_700" android:state_enabled="false"/>
+ <item android:color="?android:attr/colorButtonNormal"/>
+</selector>
diff --git a/core/res/res/color-car/car_button_text_color.xml b/core/res/res/color-car/car_button_text_color.xml
new file mode 100644
index 000000000000..eda54d9abbb2
--- /dev/null
+++ b/core/res/res/color-car/car_button_text_color.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default text colors for car buttons when enabled/disabled. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@*android:color/car_grey_700" android:state_enabled="false"/>
+ <item android:color="@*android:color/car_action1"/>
+</selector>
diff --git a/core/res/res/color-car/car_switch.xml b/core/res/res/color-car/car_switch.xml
new file mode 100644
index 000000000000..ebf3841ca9d2
--- /dev/null
+++ b/core/res/res/color-car/car_switch.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:color="?attr/colorControlActivated"
+ android:state_checked="true"/>
+ <item
+ android:color="?attr/colorSwitchThumbNormal"/>
+</selector>
diff --git a/core/res/res/drawable-car/car_button_background.xml b/core/res/res/drawable-car/car_button_background.xml
new file mode 100644
index 000000000000..3e2610c5047b
--- /dev/null
+++ b/core/res/res/drawable-car/car_button_background.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default background styles for car buttons when enabled/disabled. -->
+<ripple
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <selector>
+ <item android:state_enabled="false">
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="@*android:color/car_grey_300"/>
+ </shape>
+ </item>
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="?android:attr/colorButtonNormal"/>
+ </shape>
+ </item>
+ </selector>
+ </item>
+</ripple>
diff --git a/core/res/res/drawable-car/car_checkbox.xml b/core/res/res/drawable-car/car_checkbox.xml
new file mode 100644
index 000000000000..651e6786c460
--- /dev/null
+++ b/core/res/res/drawable-car/car_checkbox.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:width="@*android:dimen/car_primary_icon_size"
+ android:height="@*android:dimen/car_primary_icon_size"
+ android:drawable="@drawable/btn_check_material_anim"/>
+</layer-list>
diff --git a/core/res/res/drawable-car/car_dialog_button_background.xml b/core/res/res/drawable-car/car_dialog_button_background.xml
new file mode 100644
index 000000000000..dc742d57b147
--- /dev/null
+++ b/core/res/res/drawable-car/car_dialog_button_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@*android:color/car_card_ripple_background">
+ <item android:id="@android:id/mask">
+ <color android:color="@*android:color/car_white_1000" />
+ </item>
+</ripple>
diff --git a/core/res/res/drawable-car/car_seekbar_thumb.xml b/core/res/res/drawable-car/car_seekbar_thumb.xml
new file mode 100644
index 000000000000..fe9c7732bdcc
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_thumb.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT 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"
+ android:shape="oval">
+ <solid android:color="@*android:color/car_accent" />
+ <size
+ android:width="@*android:dimen/car_seekbar_thumb_size"
+ android:height="@*android:dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/core/res/res/drawable-car/car_seekbar_thumb_dark.xml b/core/res/res/drawable-car/car_seekbar_thumb_dark.xml
new file mode 100644
index 000000000000..8ac9975816a6
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_thumb_dark.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT 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"
+ android:shape="oval">
+ <solid android:color="@*android:color/car_accent_dark" />
+ <size
+ android:width="@*android:dimen/car_seekbar_thumb_size"
+ android:height="@*android:dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/core/res/res/drawable-car/car_seekbar_thumb_light.xml b/core/res/res/drawable-car/car_seekbar_thumb_light.xml
new file mode 100644
index 000000000000..b212b766b9f0
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_thumb_light.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT 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"
+ android:shape="oval">
+ <solid android:color="@*android:color/car_accent_light" />
+ <size
+ android:width="@*android:dimen/car_seekbar_thumb_size"
+ android:height="@*android:dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/core/res/res/drawable-car/car_seekbar_track.xml b/core/res/res/drawable-car/car_seekbar_track.xml
new file mode 100644
index 000000000000..5ea7b2257fe6
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_track.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_background" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_accent" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/core/res/res/drawable-car/car_seekbar_track_dark.xml b/core/res/res/drawable-car/car_seekbar_track_dark.xml
new file mode 100644
index 000000000000..19f6340521cd
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_track_dark.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<!-- Drawable of seekbar track. Uses dark color for track. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_background_dark" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_accent_light" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/core/res/res/drawable-car/car_seekbar_track_light.xml b/core/res/res/drawable-car/car_seekbar_track_light.xml
new file mode 100644
index 000000000000..d23ca33e04c3
--- /dev/null
+++ b/core/res/res/drawable-car/car_seekbar_track_light.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<!-- Drawable of seekbar track. Uses light color for track. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_background_light" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@*android:dimen/car_seekbar_height"
+ android:color="@*android:color/car_accent_dark" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/core/res/res/drawable-car/car_switch_thumb.xml b/core/res/res/drawable-car/car_switch_thumb.xml
new file mode 100644
index 000000000000..03efc189aa95
--- /dev/null
+++ b/core/res/res/drawable-car/car_switch_thumb.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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"
+ android:shape="oval">
+ <solid android:color="@color/car_switch"/>
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size"/>
+</shape>
diff --git a/core/res/res/drawable-nodpi/stat_sys_adb.xml b/core/res/res/drawable-nodpi/stat_sys_adb.xml
index 6839e39a87d6..08e9fada2f12 100644
--- a/core/res/res/drawable-nodpi/stat_sys_adb.xml
+++ b/core/res/res/drawable-nodpi/stat_sys_adb.xml
@@ -1,11 +1,11 @@
<!--
Copyright (C) 2019 The Android Open Source Project
- Licensed under the Apache License, Version 2 (the "License");
+ Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,19 +16,15 @@ Copyright (C) 2019 The Android Open Source Project
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
<path
- android:pathData="M12,12m-7,0a7,7,0,1,1,14,0a7,7,0,1,1,-14,0"
- android:strokeColor="#FF0000"
- android:strokeWidth="4"/>
+ android:fillColor="#FF000000"
+ android:pathData="M16.28,16.19A6,6 0,1 0,6 12c0,0.1 0,0.19 0,0.29L9.2,9.11Z"/>
<path
- android:pathData="M19,19 L12,12"
- android:strokeLineCap="round"
- android:strokeColor="#FF0000"
- android:strokeWidth="4"
- android:strokeAlpha=".5"/>
+ android:fillColor="#FF000000"
+ android:pathData="M16,19.48a8.57,8.57 0,1 1,2 -1.52l1.77,1.77a11.07,11.07 0,1 0,-2 1.57Z"/>
<path
- android:pathData="M12,12m-2,0a2,2,0,1,1,4,0a2,2,0,1,1,-4,0"
- android:fillColor="#FF0000"/>
+ android:fillColor="#FF000000"
+ android:pathData="M12,18a5.77,5.77 0,0 0,2 -0.34l0.19,-0.07 -0.87,-0.87L9.2,12.64 6.82,15A6,6 0,0 0,12 18Z"/>
</vector>
diff --git a/core/res/res/layout-car/car_preference.xml b/core/res/res/layout-car/car_preference.xml
new file mode 100644
index 000000000000..939c3fbc521d
--- /dev/null
+++ b/core/res/res/layout-car/car_preference.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/selectableItemBackground"
+ android:focusable="true"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+ <com.android.internal.widget.PreferenceImageView
+ android:id="@id/icon"
+ android:layout_width="@*android:dimen/car_primary_icon_size"
+ android:layout_height="@*android:dimen/car_primary_icon_size"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@*android:dimen/car_padding_2"
+ android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="@android:dimen/car_padding_2"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@*android:dimen/car_padding_2"
+ android:layout_marginTop="@*android:dimen/car_padding_2"
+ android:layout_toEndOf="@id/icon"
+ android:layout_toStartOf="@id/widget_frame"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:textAppearance="?android:attr/textAppearanceListItem"/>
+
+ <TextView
+ android:id="@id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"/>
+
+ </LinearLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <FrameLayout
+ android:id="@id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"/>
+
+</RelativeLayout>
diff --git a/core/res/res/layout-car/car_preference_category.xml b/core/res/res/layout-car/car_preference_category.xml
new file mode 100644
index 000000000000..d1f73421e185
--- /dev/null
+++ b/core/res/res/layout-car/car_preference_category.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/selectableItemBackground"
+ android:focusable="true"
+ android:gravity="center_vertical"
+ android:minHeight="@*android:dimen/car_card_header_height"
+ android:orientation="horizontal"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+ <com.android.internal.widget.PreferenceImageView
+ android:id="@id/icon"
+ android:layout_width="@*android:dimen/car_primary_icon_size"
+ android:layout_height="@*android:dimen/car_primary_icon_size"
+ android:layout_gravity="center_vertical"
+ android:layout_marginBottom="@dimen/car_padding_2"
+ android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="@*android:dimen/car_padding_2"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@*android:dimen/car_padding_2"
+ android:layout_marginTop="@*android:dimen/car_padding_2"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/colorAccent"/>
+
+ <TextView
+ android:id="@id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:textColor="?android:attr/textColorSecondary"/>
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/core/res/res/layout-car/car_resolver_different_item_header.xml b/core/res/res/layout-car/car_resolver_different_item_header.xml
new file mode 100644
index 000000000000..222ecc689792
--- /dev/null
+++ b/core/res/res/layout-car/car_resolver_different_item_header.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2019, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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:layout_alwaysShow="true"
+ android:text="@*android:string/use_a_different_app"
+ android:minHeight="56dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:gravity="start|center_vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:elevation="8dp"
+/> \ No newline at end of file
diff --git a/core/res/res/layout-car/car_resolver_list.xml b/core/res/res/layout-car/car_resolver_list.xml
new file mode 100644
index 000000000000..15a864505d3f
--- /dev/null
+++ b/core/res/res/layout-car/car_resolver_list.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2019, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT 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.internal.widget.ResolverDrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@id/contentPanel">
+
+ <LinearLayout
+ android:id="@+id/button_bar"
+ android:visibility="gone"
+ style="?attr/buttonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_ignoreOffset="true"
+ android:layout_alwaysShow="true"
+ android:layout_hasNestedScrollIndicator="true"
+ android:background="?attr/colorBackgroundFloating"
+ android:orientation="horizontal"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="12dp"
+ android:weightSum="5"
+ android:paddingEnd="12dp"
+ android:elevation="8dp">
+
+ <TextView
+ android:id="@+id/profile_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:textSize="40sp"
+ android:layout_weight="5"
+ android:layout_gravity = "left"
+ android:visibility="gone"
+ android:textColor="?attr/colorAccent"
+ android:singleLine="true"/>
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minHeight="56dp"
+ android:layout_gravity = "left"
+ android:layout_weight="3"
+ android:paddingTop="8dp"
+ android:layout_below="@id/profile_button"
+ android:paddingBottom="8dp"/>
+
+ <Button
+ android:id="@+id/button_once"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:layout_gravity = "right"
+ android:text="@string/activity_resolver_use_once"
+ android:layout_weight="1"
+ android:onClick="onButtonClick"/>
+
+ <Button
+ android:id="@+id/button_always"
+ android:layout_marginLeft="10dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:layout_gravity = "right"
+ android:text="@string/activity_resolver_use_always"
+ android:layout_weight="1"
+ android:onClick="onButtonClick"/>
+ </LinearLayout>
+
+ <ListView
+ android:layout_width="match_parent"
+ android:layout_height="500dp"
+ android:id="@+id/resolver_list"
+ android:clipToPadding="false"
+ android:scrollbarStyle="outsideOverlay"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:nestedScrollingEnabled="true"
+ android:scrollIndicators="top|bottom"/>
+
+ <TextView android:id="@+id/empty"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:layout_alwaysShow="true"
+ android:text="@string/noApplications"
+ android:padding="32dp"
+ android:gravity="center"
+ android:visibility="gone"/>
+
+</com.android.internal.widget.ResolverDrawerLayout>
diff --git a/core/res/res/layout-car/car_resolver_list_with_default.xml b/core/res/res/layout-car/car_resolver_list_with_default.xml
new file mode 100644
index 000000000000..2aed00bea14e
--- /dev/null
+++ b/core/res/res/layout-car/car_resolver_list_with_default.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2019, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT 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.internal.widget.ResolverDrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:maxCollapsedHeight="200dp"
+ android:id="@id/contentPanel">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:weightSum="5"
+ android:layout_alwaysShow="true"
+ android:orientation="vertical"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.5"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="start|top"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_marginTop="20dp"
+ android:src="@drawable/resolver_icon_placeholder"
+ android:scaleType="fitCenter"/>
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="?attr/listPreferredItemHeight"
+ android:layout_marginStart="16dp"
+ android:textAppearance="?attr/textAppearanceMedium"
+ android:gravity="start|center_vertical"
+ android:paddingEnd="16dp"/>
+
+ <LinearLayout
+ android:id="@+id/profile_button"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginEnd="4dp"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:focusable="true"
+ android:visibility="gone"
+ style="?attr/borderlessButtonStyle">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="12dp"
+ android:layout_marginBottom="12dp"
+ android:scaleType="fitCenter"/>
+
+ <TextView
+ android:id="@id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:textAppearance="?attr/textAppearanceButton"
+ android:textColor="?attr/textColorPrimary"
+ android:minLines="1"
+ android:maxLines="1"
+ android:ellipsize="marquee"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/button_bar"
+ android:visibility="gone"
+ style="?attr/buttonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alwaysShow="true"
+ android:gravity="end|center_vertical"
+ android:layout_weight="0.5"
+ android:orientation="horizontal"
+ android:layoutDirection="locale"
+ android:measureWithLargestChild="true"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="12dp"
+ android:paddingEnd="12dp"
+ android:elevation="8dp">
+
+ <Button
+ android:id="@+id/button_once"
+ android:layout_width="wrap_content"
+ android:layout_gravity="start"
+ android:maxLines="2"
+ style="?attr/buttonBarNegativeButtonStyle"
+ android:minHeight="@dimen/alert_dialog_button_bar_height"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:text="@string/activity_resolver_use_once"
+ android:onClick="onButtonClick"/>
+
+ <Button
+ android:id="@+id/button_always"
+ android:layout_width="wrap_content"
+ android:layout_gravity="end"
+ android:maxLines="2"
+ android:minHeight="@dimen/alert_dialog_button_bar_height"
+ style="?attr/buttonBarPositiveButtonStyle"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:text="@string/activity_resolver_use_always"
+ android:onClick="onButtonClick"/>
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?attr/dividerVertical"/>
+
+ <ListView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/resolver_list"
+ android:layout_weight="4"
+ android:clipToPadding="false"
+ android:scrollbarStyle="outsideOverlay"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:nestedScrollingEnabled="true"
+ android:divider="@null"/>
+ </LinearLayout>
+
+</com.android.internal.widget.ResolverDrawerLayout>
diff --git a/core/res/res/layout/immersive_mode_cling.xml b/core/res/res/layout/immersive_mode_cling.xml
index b08b0f4d59c0..9fd615dc96b7 100644
--- a/core/res/res/layout/immersive_mode_cling.xml
+++ b/core/res/res/layout/immersive_mode_cling.xml
@@ -59,7 +59,7 @@
android:paddingStart="48dp"
android:paddingTop="40dp"
android:text="@string/immersive_cling_title"
- android:textColor="@color/primary_text_default_material_light"
+ android:textColor="@android:color/white"
android:textSize="24sp" />
<TextView
@@ -71,7 +71,7 @@
android:paddingStart="48dp"
android:paddingTop="12.6dp"
android:text="@string/immersive_cling_description"
- android:textColor="@color/primary_text_default_material_light"
+ android:textColor="@android:color/white"
android:textSize="16sp" />
<Button
@@ -89,4 +89,4 @@
android:textColor="@android:color/white"
android:textSize="14sp" />
-</RelativeLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index f4e35a7d0ffa..5125c13ca14b 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Foon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foonoproepe te maak en te bestuur"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Laat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toe om foonoproepe te maak en te bestuur?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Liggaamsensors"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang te verkry tot sensordata oor jou lewenstekens"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot sensordata oor jou lewenstekens?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiek"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"toegang tot jou musiek"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou musiek?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto\'s en video\'s"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot jou foto\'s en video\'s"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou foto\'s en video\'s?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Venster-inhoud ophaal"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die inhoud ondersoek van \'n venster waarmee jy interaksie het."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Verken deur raak aanskakel"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Stel op"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Haal uit"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Verken"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Wissel uitvoer"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ontbreek"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Sit toestel weer in"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Skuif tans <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Oorlegger #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", veilig"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Hierdie begin van agtergrondaktiwiteit vanaf <xliff:g id="PACKAGENAME">%1$s</xliff:g> sal in toekomstige Q-weergawes geblokkeer word. Sien go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Begin van agtergrondaktiwiteit vanaf <xliff:g id="PACKAGENAME">%1$s</xliff:g> word geblokkeer. Sien go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Het jy die patroon vergeet?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Verkeerde patroon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Verkeerde wagwoord"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Roetinemodus-inligtingkennisgewing"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery kan afloop voordat dit normaalweg gelaai word"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterybespaarder is geaktiveer om batterylewe te verleng"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Vouer"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-program"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Lêer"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-lêer"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Oudio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-oudio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Prent"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-prent"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Argief"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-argief"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Sigblad"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-sigblad"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Aanbieding"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-aanbieding"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laai tans"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> lêers</item>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 6282a8d0ab79..49be2cfe9d92 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ስልክ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"የስልክ ጥሪዎች ያድርጉ እና ያስተዳድሩ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የስልክ ጥሪዎችን እንዲያደርግ እና እንዲያቀናብር ይፈቀድለት?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"የሰውነት ዳሳሾች"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ስለአስፈላጊ ምልክቶችዎ ያሉ የዳሳሽ ውሂብ ይድረሱ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የሰውነትዎ መሠረታዊ ምልክቶች የዳሳሽ ውሂብ እንዲደርስ ይፈቀድለት?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ሙዚቃ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ሙዚቃዎን መድረስ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ቀን ሙዚቃዎን እንዲደርስ ይፈቀድለት?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ፎቶዎች እና ቪዲዮዎች"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"የእርስዎን ፎቶዎች እና ቪዲዮዎች መድረስ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የእርስዎን ፎቶዎች እና ቪዲዮዎች እንዲደርስ ይፈቀድለት?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"በመንካት ያስሱን ያብሩ"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"አዋቅር"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"አስወጣ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ያስሱ"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ውጽዓትን ቀይር"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ይጎድላል"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"መሣሪያን እንደገና ያስገቡ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ን በመውሰድ ላይ"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ተደራቢ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>፦ <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>፣ <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"፣ የተጠበቀ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"ይህ የ<xliff:g id="PACKAGENAME">%1$s</xliff:g> የበስተጀርባ እንቅስቃሴ ጅምር በወደፊት የQ ግንቦች ላይ ይታገዳል። go/q-bg-block ይመልከቱ።"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"የ<xliff:g id="PACKAGENAME">%1$s</xliff:g> የበስተጀርባ እንቅስቃሴ ጅምር ታግዷል። go/q-bg-block ይመልከቱ።"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ስርዓተ ጥለቱን እርሳ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"የተሳሳተ ስርዓተ ጥለት"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"የተሳሳተ ይለፍ ቃል"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"የዕለት ተዕለት ሁነታ መረጃ ማሳወቂያዎች"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ባትሪ ከተለመደው ኃይል መሙላት በፊት ሊያልቅ ይችላል"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"የባትሪ ቆጣቢ የባትሪ ዕድሜን ለማራዘም ገብሯል።"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"አቃፊ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"የAndroid መተግበሪያ"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ፋይል"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ፋይል"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ኦዲዮ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ኦዲዮ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ቪዲዮ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ቪድዮ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ምስል"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ምስል"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ማህደር"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ማህደር"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ሰነድ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ሰነድ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ተመን ሉህ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ተመን ሉህ"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"የዝግጅት አቀራረብ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"የ<xliff:g id="EXTENSION">%1$s</xliff:g> ዝግጅት አቀራረብ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"በመጫን ላይ"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ፋይሎች</item>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index b52214849829..c6653f6ae583 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -320,15 +320,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"الهاتف"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"إجراء مكالمات هاتفية وإدارتها"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بإجراء المكالمات الهاتفية وإدارتها؟"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"أجهزة استشعار الجسم"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالدخول إلى بيانات المستشعر حول علاماتك الحيوية؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"الموسيقى"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"الوصول إلى الموسيقى"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى الموسيقى؟"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"الصور والفيديوهات"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"الوصول إلى صورك وفيديوهاتك"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى صورك وفيديوهاتك؟"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"استرداد محتوى النافذة"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"فحص محتوى نافذة يتم التفاعل معها"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"تشغيل الاستكشاف باللمس"</string>
@@ -1484,8 +1487,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"إعداد"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"إلغاء"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"استكشاف"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"تبديل جهاز إخراج الصوت"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> مفقود"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"إدخال الجهاز مرة أخرى"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"جارٍ نقل <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1703,6 +1705,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"المركب #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"‏<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>، <xliff:g id="DPI">%4$d</xliff:g> نقطة لكل بوصة"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"آمن"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"‏سيتم حظر بدء نشاط الخلفية هذا من <xliff:g id="PACKAGENAME">%1$s</xliff:g> في إصدارات Q القادمة. اطَّلِع على go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"‏تم حظر بدء نشاط الخلفية من <xliff:g id="PACKAGENAME">%1$s</xliff:g>. اطَّلِع على go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"نسيت النقش"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"نقش خاطئ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"كلمة مرور خاطئة"</string>
@@ -2136,6 +2140,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"إشعار معلومات \"وضع سلسلة الإجراءات\""</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"قد تنفد طاقة البطارية قبل الشحن المعتاد"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"تم تفعيل \"توفير شحن البطارية\" لإطالة عمرها."</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"مجلّد"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"‏تطبيق Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ملف"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"ملف: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"صوت"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"صوت: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"فيديو"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"فيديو: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"صورة"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"صورة: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"أرشيف"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"أرشيف: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"مستند"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"مستند: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"جدول بيانات"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"جدول بيانات: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"عرض تقديمي"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"عرض تقديمي: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"جارٍ التحميل"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="zero"><xliff:g id="FILE_NAME_2">%s</xliff:g> و<xliff:g id="COUNT_3">%d</xliff:g> ملف</item>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 2f69acebde60..268921578a16 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফ’ন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফ\'ন কল কৰিব আৰু পৰিচলনা কৰিব পাৰে"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক ফ\'ন কল কৰিবলৈ আৰু পৰিচালনা কৰিবলৈ অনুমতি দিবনে?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"শৰীৰৰ ছেন্সৰসমূহ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিব পাৰে"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ দেহৰ গুৰুত্বপূৰ্ণ অংগসমূহৰ অৱস্থাৰ বিষয়ে ছেন্সৰৰ ডেটা লাভ কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"সংগীত"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"আপোনাৰ সংগীত এক্সেছ কৰিবলৈ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ সংগীত এক্সেছ কৰিবলৈ দিবনে?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ফট’ আৰু ভিডিঅ’"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপোনাৰ ফট’ আৰু ভিডিঅ’সমূহ এক্সেছ কৰিবলৈ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ ফট’ আৰু ভিডিঅ’সমূহ এক্সেছ কৰিবলৈ দিবনে?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ৱিণ্ড’ সমল বিচাৰি উলিওৱাৰ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"আপুনি চাই থকা ৱিণ্ড’খনৰ সমল পৰীক্ষা কৰাৰ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পৰ্শৰ দ্বাৰা অন্বেষণ কৰাৰ সুবিধা অন কৰাৰ"</string>
@@ -536,8 +539,7 @@
<string name="biometric_error_user_canceled" msgid="2260175018114348727">"বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ বাতিল কৰা হৈছে"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"চিনাক্ত কৰিব পৰা নাই"</string>
<string name="biometric_error_canceled" msgid="349665227864885880">"বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ বাতিল কৰা হৈছে"</string>
- <!-- no translation found for biometric_error_device_not_secured (6583143098363528349) -->
- <skip />
+ <string name="biometric_error_device_not_secured" msgid="6583143098363528349">"কোনো পিন, আৰ্হি বা পাছৱৰ্ড ছেট কৰা নাই"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"ফিংগাৰপ্ৰিণ্ট আংশিকভাৱে চিনাক্ত কৰা হৈছে। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"ফিগাৰপ্ৰিণ্টৰ প্ৰক্ৰিয়া সম্পাদন কৰিবপৰা নগ\'ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক৷"</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো লেতেৰা হৈ আছে। অনুগ্ৰহ কৰি পৰিষ্কাৰ কৰি আকৌ চেষ্টা কৰক।"</string>
@@ -557,8 +559,7 @@
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"অত্যধিক প্ৰয়াস। ফিংগাৰপ্ৰিণ্ট ছেন্সৰ অক্ষম কৰা হ’ল।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আকৌ চেষ্টা কৰক।"</string>
<string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"কোনো ফিংগাৰপ্ৰিণ্ট যোগ কৰা নহ\'ল।"</string>
- <!-- no translation found for fingerprint_error_hw_not_present (409523969613176352) -->
- <skip />
+ <string name="fingerprint_error_hw_not_present" msgid="409523969613176352">"এই ডিভাইচটোত ফিংগাৰপ্ৰিণ্ট ছেন্সৰ নাই।"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> আঙুলি"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -578,22 +579,14 @@
<string name="face_acquired_too_left" msgid="2712489669456176505">"অনুগ্ৰহ কৰি ছেন্সৰটো বাওঁফাললৈ নিয়ক।"</string>
<string name="face_acquired_poor_gaze" msgid="8344973502980415859">"অনুগ্ৰহ কৰি ছেন্সৰটোলৈ চাওক।"</string>
<string name="face_acquired_not_detected" msgid="5707782294589511391">"কোনো মুখমণ্ডল চিনাক্ত কৰিব পৰা নগ’ল।"</string>
- <!-- no translation found for face_acquired_too_much_motion (470381210701463822) -->
- <skip />
- <!-- no translation found for face_acquired_recalibrate (8077949502893707539) -->
- <skip />
- <!-- no translation found for face_acquired_too_different (5553210341111255124) -->
- <skip />
- <!-- no translation found for face_acquired_too_similar (1508776858407646460) -->
- <skip />
- <!-- no translation found for face_acquired_pan_too_extreme (8203001424525231680) -->
- <skip />
- <!-- no translation found for face_acquired_tilt_too_extreme (7641326344460439970) -->
- <skip />
- <!-- no translation found for face_acquired_roll_too_extreme (1444829237745898619) -->
- <skip />
- <!-- no translation found for face_acquired_obscured (3055077697850272097) -->
- <skip />
+ <string name="face_acquired_too_much_motion" msgid="470381210701463822">"বেছি লৰচৰ কৰি আছে।"</string>
+ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string>
+ <string name="face_acquired_too_different" msgid="5553210341111255124">"অন্য মুখমণ্ডল চিনাক্ত কৰা হৈছে।"</string>
+ <string name="face_acquired_too_similar" msgid="1508776858407646460">"একে ধৰণৰ হৈছে, অনুগ্ৰহ কৰি আপোনাৰ প’জটো সলনি কৰক।"</string>
+ <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"অনুগ্ৰহ কৰি পোনে পোনে কেমেৰালৈ চাওক।"</string>
+ <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"অনুগ্ৰহ কৰি পোনে পোনে কেমেৰালৈ চাওক।"</string>
+ <string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"অনুগ্ৰহ কৰি আপোনাৰ মূৰটো উলম্বভাৱে চিধা কৰক।"</string>
+ <string name="face_acquired_obscured" msgid="3055077697850272097">"আপোনাৰ মুখমণ্ডলৰপৰা আৱৰণ আঁতৰাওক।"</string>
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"মুখমণ্ডলৰ হাৰ্ডৱেৰ উপলব্ধ নহয়।"</string>
@@ -605,8 +598,7 @@
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"অত্যধিক প্ৰয়াস। মুখমণ্ডলৰ জৰিয়তে সত্যাপন অক্ষম কৰা হ’ল।"</string>
<string name="face_error_unable_to_process" msgid="238761109287767270">"আকৌ চেষ্টা কৰক।"</string>
<string name="face_error_not_enrolled" msgid="9166792142679691323">"কোনো মুখমণ্ডল যোগ কৰা নহ’ল।"</string>
- <!-- no translation found for face_error_hw_not_present (916085883581450331) -->
- <skip />
+ <string name="face_error_hw_not_present" msgid="916085883581450331">"এই ডিভাইচটোত মুখমণ্ডল সত্যাপন ছেন্সৰ নাই।"</string>
<string name="face_name_template" msgid="7004562145809595384">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1408,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ছেট আপ কৰক"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"বাহিৰ কৰক"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"অন্বেষণ কৰক"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"আউটপুট সলনি কৰক"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> উপলব্ধ নহয়"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ডিভাইচ আকৌ ভৰাওক"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ক স্থানান্তৰ কৰি থকা হৈছে"</string>
@@ -1623,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"অ\'ভাৰলে\' #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", সুৰক্ষিত"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>ৰ পৰা নেপথ্যত আৰম্ভ হোৱা এই কাৰ্যকলাপটো ভবিষ্যতে কিউ বিল্ডত অৱৰোধ কৰা হ’ব। go/q-bg-block চাওক"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>ৰ পৰা নেপথ্যত আৰম্ভ হোৱা কাৰ্যকলাপ অৱৰোধ কৰা হৈছে। go/q-bg-block চাওক"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"আৰ্হি পাহৰিলেনে"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল আৰ্হি"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাছৱৰ্ড"</string>
@@ -2008,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ৰুটিন ম’ডৰ তথ্য জাননী"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ফ’ল্ডাৰ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android এপ্লিকেশ্বন"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ফাইল"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ফাইল"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"অডিঅ’"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> অডিঅ’"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ভিডিঅ’"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ভিডিঅ’"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ছবি"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ছবি"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"আৰ্কাইভ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> আৰ্কাইভ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"নথি"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> নথি"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"স্প্ৰেডশ্বীট"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> স্প্ৰেডশ্বীট"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"উপস্থাপন"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> উপস্থাপন"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ল’ড হৈ আছে"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>টা ফাইল</item>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index bc78e19fcf34..28ea3771ab9e 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon zəngləri edin və onları idarə edin"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə telefon zəngləri etmək və onları idarə etmək icazəsi verilsin?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Bədən Sensorları"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"Həyati əlamətlər haqqında sensor dataya daxil olun"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə həyati əlamətlər haqqında sensor dataya daxil olmaq icazəsi verilsin?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiqi"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musiqiyə daxil olun"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinin musiqiyə daxil olmağına icazə verilsin?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto və Videolar"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"foto və videolara daxil olun"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinin foto və videolarınıza daxil olmağına icazə verilsin?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pəncərənin məzmununu əldə edin"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Toxunaraq Kəşf et funksiyasını yandırın"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Quraşdırın"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Çıxarın"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Araşdır"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Çıxışı dəyişin"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> yoxdur"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Cihazı yenidən daxil edin"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> daşınır"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Örtük #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", təhlükəsiz"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ünvanından olan bu arxa fon fəaliyyəti növbəti Q versiyalarında blok ediləcək. go/q-bg-block ünvanına baxın."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ünvanından olan arxa fon fəaliyyəti blok edildi. go/q-bg-block ünvanına baxın."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Şablonu unutmuşam"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Model"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifrə"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rejim üçün məlumat bildirişi"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya həmişəki vaxtdan əvvəl bitə bilər"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Enerjiyə Qənaət rejimi batareya istifadəsinin müddətini artırmaq üçün aktiv edilir"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Qovluq"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android tətbiqi"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fayl"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> fayl"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Şəkil"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> şəkil"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arxiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arxiv faylı"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Sənəd"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> sənəd"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Cədvəl"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> cədvəl"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Təqdimat"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> təqdimat"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yüklənir"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fayl</item>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 55ab20c04c5b..e2cdf87830a4 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"upućuje telefonske pozive i upravlja njima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; upućuje pozive i upravlja njima?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori za telo"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vitalnim funkcijama"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;pristupa podacima senzora o vitalnim funkcijama?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup muzici"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa muzici?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Slike i video snimci"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup slikama i video snimcima"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa slikama i video snimcima?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"da preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Proverava sadržaj prozora sa kojim ostvarujete interakciju."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"da uključi Istraživanja dodirom"</string>
@@ -1418,8 +1421,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Aktiviraj"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Promenite izlaz"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo umetnite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Prenosi se <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1634,6 +1636,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Postavljeni element br. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>×<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", bezbedno"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ovo pokretanje aktivnosti u pozadini sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> biće blokirano u budućim Q verzijama. Pogledajte go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Pokretanje aktivnosti u pozadini sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> je blokirano. Pogledajte go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravljeni šablon"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan šablon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string>
@@ -2031,6 +2035,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obaveštenje o informacijama Rutinskog režima"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija će se možda isprazniti pre uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžilo trajanje baterije"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Direktorijum"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> datoteka"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio datoteka"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio datoteka"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Slika"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> slika"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhiva"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arhiva"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Tabela"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> tabela"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentacija"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitava se"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7964be5da322..9639967b1e7a 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Тэлефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"рабіць тэлефонныя выклікі і кіраваць імі"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; рабіць тэлефонныя выклікі і кіраваць імі?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Датчыкі цела"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"атрымліваць з датчыка даныя асноўных фізіялагічных паказчыкаў"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да даных з датчыкаў пра вашы асноўныя фізіялагічныя паказчыкі?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ да музыкі"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да музыкі?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Фота і відэа"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ да фота і відэа"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да фота і відэа?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Атрымліваць змесціва вакна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Аналізаваць змесціва актыўнага вакна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Уключаць Азнаямленне дотыкам"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Наладзіць"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Выняць"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Праглядзець"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Пераключыце вывад"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> адсутнічае"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Устаўце прыладу яшчэ раз"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Перамяшчэнне <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Оверлей # <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> кр. на цалю"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", бяспечны"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Запуск дзеянняў у фонавым рэжыме з пакета \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" будзе заблакіраваны ў будучых Q-зборках. Глядзіце go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Запуск дзеянняў у фонавым рэжыме з пакета \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" заблакіраваны. Глядзіце go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забылі ключ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Няправільны ўзор"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Няправiльны пароль"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Апавяшчэнне з інфармацыяй пра ўсталяваны рэжым"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятар можа разрадзіцца хутчэй, чым прыйдзе час звычайнай зарадкі"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Каб павялічыць тэрмін работы акумулятара, уключаны рэжым эканоміі зараду"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Праграма Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Файл <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аўдыяфайл"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Аўдыя <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Відэа"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Відэа <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Відарыс"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Відарыс <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архіў"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Архіў <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Дакумент"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Дакумент <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Табліца"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Табліца <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Прэзентацыя"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Прэзентацыя <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Загрузка"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 8af0c5f2e80a..d0557db1b11e 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"да извършва телефонни обаждания и да ги управлява"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да извършва и управлява телефонни обаждания?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"достъп до сензорните данни за жизнените ви показатели"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до данните от сензорите за жизнените ви показатели?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"достъп до музиката ви"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до музиката ви?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Снимки и видеоклипове"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"достъп до снимките и видеоклиповете ви"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до снимките и видеоклиповете ви?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включване на изследването чрез докосване"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Настройване"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Изваждане"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Изследване"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Превключване на изхода"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Липсва <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Поставете отново устройството"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> се премества"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наслагване №<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"„<xliff:g id="NAME">%1$s</xliff:g>“: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", защитено"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Стартирането на активност на заден план от <xliff:g id="PACKAGENAME">%1$s</xliff:g> ще бъде блокирано в бъдещите компилации под Q. Вижте go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Стартирането на активност на заден план от <xliff:g id="PACKAGENAME">%1$s</xliff:g> е блокирано. Вижте go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забравена фигура"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Грешна фигура"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Грешна парола"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известие с информация за режима на поредица"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерията може да се изтощи преди обичайното зареждане"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режимът за запазване на батерията е активиран с цел удължаване на живота на батерията"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Приложение за Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Файл във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудиофайл"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Аудиофайл във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видеоклип"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Видеоклип във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Изображение"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Изображение във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архив"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Архив във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Документ във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Електронна таблица"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Електронна таблица във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентация"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Презентация във формат <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Зарежда се"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файла</item>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 100dd575d312..d1fa2d4af184 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ফোন"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ফোন কলগুলি এবং পরিচালনা"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে কল করতে এবং কল পরিচালনা করতে দেবেন?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"বডি সেন্সরগুলি"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"আপনার অত্যাবশ্যক লক্ষণগুলির সম্পর্কে সেন্সর ডেটা অ্যাক্সেস করে"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে সেন্সর থেকে আপনার ভাইটাল সাইনের ডেটা অ্যাক্সেস করতে দেবেন?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"মিউজিক"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"আপনার মিউজিকে অ্যাক্সেস করুন"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে আপনার মিউজিকে অ্যাক্সেস দেবেন?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ফটো ও ভিডিও"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"আপনার ফটো ও ভিডিও অ্যাক্সেস করুন"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"আপনার ফটো ও ভিডিওতে &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে অ্যাক্সেস দেবেন?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"উইন্ডোর কন্টেন্ট পুনরুদ্ধার করে"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ব্যবহার করছেন এমন একটি উইন্ডোর কন্টেন্ট নিরীক্ষণ করে৷"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"স্পর্শের মাধ্যমে অন্বেষণ করা চালু করুন"</string>
@@ -1612,6 +1615,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"আচ্ছাদন #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", নিরাপদ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> থেকে শুরু হওয়া ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ভবিষ্যত কিউ বিল্ডে ব্লক করা হবে। go/q-bg-block দেখুন।"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> থেকে শুরু হওয়া ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ব্লক করা হয়েছে। go/q-bg-block দেখুন।"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"প্যাটার্ন ভুলে গেছেন"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল প্যাটার্ন"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাসওয়ার্ড"</string>
@@ -1997,6 +2002,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"রুটিন মোডের তথ্য সংক্রান্ত বিজ্ঞপ্তি"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"সাধারণত যখন চার্জ দেন, তার আগে চার্জ শেষ হয়ে যেতে পারে"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ডিভাইস বেশিক্ষণ চালু রাখতে ব্যাটারি সেভার চালু করা হয়েছে"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ফোল্ডার"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android অ্যাপ্লিকেশন"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ফাইল"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ফাইল"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"অডিও"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> অডিও"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ভিডিও"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ভিডিও"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ছবি"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ছবি"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"আর্কাইভ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> আর্কাইভ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ডকুমেন্ট"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ডকুমেন্ট"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"স্প্রেডশীট"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> স্প্রেডশীট"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"উপস্থাপনা"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> উপস্থাপনা"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"লোড হচ্ছে"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> এবং আরও <xliff:g id="COUNT_3">%d</xliff:g>টি ফাইল</item>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index c33ebc3d9057..d4c663c6284d 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"poziva i upravlja pozivima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uspostavljanje poziva i njihovo upravljanje?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Tjelesni senzori"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupa podacima senzora o vašim vitalnim funkcijama"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup senzornim podacima o vašim vitalnim znacima?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup muzici"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;da pristupi vašoj muzici?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotografije i videozapisi"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i videozapisima"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupi vašim fotografijama i videozapisima?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Preuzima sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregleda sadržaj prozora koji trenutno koristite."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključi opciju Istraživanje dodirom"</string>
@@ -1420,8 +1423,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Postavi"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Prebacite izlaz"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo ubacite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premješta se <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1636,6 +1638,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Nadsloj #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", osigurano"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Pokretanje aktivnosti u pozadini na web lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokirat će se u budućim Q verzijama. Pogledajte go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Blokirano je pokretanje aktivnosti u pozadini na web lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Pogledajte go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste uzorak?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan uzorak"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string>
@@ -2033,6 +2037,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještenje za informacije Rutinskog načina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Moguće je da će se baterija isprazniti prije uobičajenog punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Ušteda baterije je aktivirana da bi se produžio vijek trajanja baterije"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fajl"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> fajl"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Zvučni zapis"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> zvučni zapis"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Videozapis"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> videozapis"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Slika"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> slika"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhiva"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arhiva"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Tabela"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> tabela"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentacija"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitavanje"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fajl</item>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 12d02e1046e0..90a2c6d01b06 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -263,7 +263,7 @@
<string name="notification_channel_vpn" msgid="8330103431055860618">"Estat de la VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Administració del dispositiu"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
- <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració comercial"</string>
+ <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració per a botigues"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Connexió USB"</string>
<string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"S\'està executant una aplicació"</string>
<string name="notification_channel_foreground_service" msgid="3931987440602669158">"Aplicacions que consumeixen bateria"</string>
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telèfon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faci trucades i les gestioni?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensors corporals"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedir a les dades del sensor sobre els signes vitals"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les dades del sensor de constants vitals?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accedir a la teva música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a la teva música?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos i vídeos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accedir a les teves fotos i als teus vídeos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a les teves fotos i als teus vídeos?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contingut de la finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contingut d\'una finestra amb què estàs interaccionant."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar Exploració tàctil"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsa"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explora"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Canvia la sortida"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"No es detecta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Torna a inserir el dispositiu"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"S\'està desplaçant l\'aplicació <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposa #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segur"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"A les futures compilacions de Q, es bloquejarà aquest inici d\'activitat en segon pla del paquet <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Ves a go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"S\'ha bloquejat l\'inici d\'activitat en segon pla del paquet <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Ves a go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"He oblidat el patró"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contrasenya incorrecta"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificació d\'informació del mode de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"És possible que la bateria s\'esgoti abans de la càrrega habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"S\'ha activat l\'estalvi de bateria per allargar-ne la durada"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Carpeta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicació per a Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fitxer"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Fitxer <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Àudio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Àudio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imatge"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imatge <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arxiu"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arxiu <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Document <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Full de càlcul"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Full de càlcul <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentació"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentació <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"S\'està carregant"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> i <xliff:g id="COUNT_3">%d</xliff:g> fitxers més</item>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 9e735fc5d9bf..dbe582ef1886 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uskutečňování a spravování telefonních hovorů"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uskutečňovat a spravovat telefonní hovory?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Tělesné senzory"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"přístup k datům ze snímačů vašich životních funkcí"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k údajům ze snímačů vašich životních funkcí?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Hudba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"přístup k hudbě"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k hudbě?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotky a videa"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"přístup k fotkám a videím"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k fotkám a videím?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítat obsah oken"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Může prozkoumávat obsah oken, se kterými pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnout funkci Prozkoumání dotykem"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastavit"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojit"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Otevřít"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Přepnout výstup"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> chybí"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Znovu vložte zařízení"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Přesouvání aplikace <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Překryvná vrstva č. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", zabezpečené"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Zahájení této aktivity na pozadí ze zdroje <xliff:g id="PACKAGENAME">%1$s</xliff:g> bude v budoucích sestaveních Q zablokováno. Viz go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Zahájení aktivity na pozadí ze zdroje <xliff:g id="PACKAGENAME">%1$s</xliff:g> bylo zablokováno. Viz go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zapomenuté gesto"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávné gesto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávné heslo"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informační oznámení režimu sledu činností"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterie se možná vybije před obvyklým časem nabití"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Byl aktivován spořič baterie za účelem prodloužení výdrže"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Složka"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikace pro Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Soubor"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Soubor <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Zvuk"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Zvuk <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Obrázek"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Obrázek <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archiv <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Tabulka"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Tabulka <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentace"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Prezentace <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Načítání"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> soubory</item>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index b1c4ef78e1be..f1ecfc9b307f 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"foretage og administrere telefonopkald"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilladelse til at foretage og administrere telefonopkald?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kropssensorer"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kropssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få adgang til sensordata om dine livstegn"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til sensordata om dine livstegn?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"adgang til din musik"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til din musik?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Billeder og videoer"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Billeder og videoer"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"adgang til dine billeder og videoer"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til dine billeder og videoer?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til dine billeder og videoer, herunder taggede placeringer?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hente indholdet i vinduet"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Undersøge indholdet i et vindue, du interagerer med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivere Udforsk ved berøring"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Skub ud"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Udforsk"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Skift udgang"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> er ikke til stede"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Indsæt enheden igen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlejring nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sikker"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Denne opstart af aktivitet i baggrunden fra <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeres i fremtidige Q-builds. Gå til go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Opstart af aktivitet i baggrunden fra <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeres. Gå til go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Glemt mønster"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Forkert mønster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Forkert adgangskode"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikation med oplysninger om rutinetilstand"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Enheden løber muligvis tør for batteri, inden du normalt oplader den"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparefunktion er aktiveret for at forlænge batteritiden"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mappe"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-fil"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Lyd"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-lyd"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Billede"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-billede"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arkiv"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Regneark"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-regneark"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Præsentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-præsentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Indlæser"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fil</item>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index d162354f2fe9..afe5f9da43c8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe tätigen und verwalten"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, Anrufe zu tätigen und zu verwalten?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Körpersensoren"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zugreifen"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, auf Sensordaten zu deinen Vitalfunktionen zuzugreifen?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"auf Musik zugreifen"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deine Musik gewähren?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos und Videos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"auf meine Fotos und Videos zugreifen"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deine Fotos und Videos gewähren?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen &amp; Entdecken\" aktivieren"</string>
@@ -510,7 +513,7 @@
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"Displaysperre deaktivieren"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ermöglicht der App, die Tastensperre sowie den damit verbundenen Passwortschutz zu deaktivieren. Das Telefon deaktiviert die Tastensperre beispielsweise, wenn ein Anruf eingeht, und aktiviert sie wieder, nachdem das Gespräch beendet wurde."</string>
<string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"Komplexitätsstufe der Displaysperre anfragen"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Ermöglicht es der App, die Komplexitätsstufe der Displaysperre (hoch, mittel, niedrig oder keine) zu erfahren, was auf die mögliche Dauer und Art der Displaysperre hinweist. Die App kann Nutzern auch vorschlagen, die Displaysperre auf eine bestimmte Stufe zu aktualisieren, Nutzer können diesen Vorschlag jedoch auch einfach ignorieren und fortfahren. Beachten Sie, dass die Displaysperre nicht im Klartext gespeichert ist, sodass die App nicht das genaue Passwort kennt."</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Ermöglicht es der App, die Komplexitätsstufe der Displaysperre (hoch, mittel, niedrig oder keine) zu erfahren, was auf die mögliche Dauer und Art der Displaysperre hinweist. Die App kann Nutzern auch vorschlagen, dass sie die Displaysperre auf eine bestimmte Stufe aktualisieren, Nutzer können diesen Vorschlag jedoch einfach ignorieren und fortfahren. Beachten Sie, dass die Displaysperre nicht im Klartext gespeichert ist, sodass die App nicht das genaue Passwort kennt."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"Biometrische Hardware verwenden"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Erlaubt der App, biometrische Hardware zur Authentifizierung zu verwenden"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"Fingerabdruckhardware verwalten"</string>
@@ -1356,7 +1359,7 @@
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB-Debugging deaktivieren: auswählen"</string>
<string name="usb_contaminant_detected_title" msgid="7136400633704058349">"Flüssigkeiten oder Fremdkörper im USB-Port"</string>
<string name="usb_contaminant_detected_message" msgid="832337061059487250">"Der USB-Port wird automatisch deaktiviert. Für weitere Informationen tippen."</string>
- <string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB-Ports kann wieder sicher verwendet werden"</string>
+ <string name="usb_contaminant_not_detected_title" msgid="4202417484434906086">"USB-Port kann wieder sicher verwendet werden"</string>
<string name="usb_contaminant_not_detected_message" msgid="2415791798244545292">"Das Smartphone erkennt keine Flüssigkeiten oder Fremdkörper mehr."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Fehlerbericht wird abgerufen…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Fehlerbericht teilen?"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Einrichten"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Auswerfen"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Ansehen"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Ausgabe wechseln"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> fehlt"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Gerät wieder einlegen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> wird verschoben"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay-Nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sicher"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Der Start dieser Hintergrundaktivität aus <xliff:g id="PACKAGENAME">%1$s</xliff:g> wird in künftigen Q-Builds blockiert. Siehe go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Der Start der Hintergrundaktivität aus <xliff:g id="PACKAGENAME">%1$s</xliff:g> wurde blockiert. Siehe go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Muster vergessen"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Falsches Muster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Falsches Passwort"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Infomitteilung zum Ablaufmodus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Energiesparmodus aktiviert, um die Akkulaufzeit zu verlängern"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Ordner"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-App"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Datei"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Datei (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audiodatei"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audiodatei (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Bild"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Bild (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archiv (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Tabelle"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Tabelle (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Präsentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Präsentation (<xliff:g id="EXTENSION">%1$s</xliff:g>)"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Wird geladen"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> und <xliff:g id="COUNT_3">%d</xliff:g> Dateien</item>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 195995cc8cd9..4bf698403535 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"πραγματοποιεί και να διαχειρίζεται τηλ/κές κλήσεις"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; η πραγματοποίηση και η διαχείριση τηλεφωνικών κλήσεων;"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Αισθητήρες σώματος"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στα δεδομένα αισθητήρα σχετικά με τις ζωτικές ενδείξεις σας;"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Μουσική"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"πρόσβαση στη μουσική σας"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στη μουσική σας;"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Φωτογραφίες και βίντεο"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"πρόσβαση στις φωτογραφίες και στα βίντεό σας"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στις φωτογραφίες και στα βίντεό σας;"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ανάκτηση του περιεχομένου του παραθύρου"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Έλεγχος του περιεχομένου ενός παραθύρου με το οποίο αλληλεπιδράτε."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ενεργοποίηση της \"Εξερεύνησης με άγγιγμα\""</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Ρύθμιση"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Εξαγωγή"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Εξερεύνηση"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Εναλλαγή εξόδου"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Λείπει το μέσο <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Τοποθετήστε ξανά τη συσκευή"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Μετακίνηση <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Επικάλυψη #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ασφαλές"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Αυτή η έναρξη δραστηριότητας παρασκηνίου από το <xliff:g id="PACKAGENAME">%1$s</xliff:g> θα αποκλειστεί σε μελλοντικές εκδόσεις του Q. Ανατρέξτε στο go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Η έναρξη δραστηριότητας παρασκηνίου από το <xliff:g id="PACKAGENAME">%1$s</xliff:g> αποκλείστηκε. Ανατρέξτε στο go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ξεχάσατε το μοτίβο"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Λάθος μοτίβο"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Λανθασμένος κωδικός πρόσβασης"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ειδοποίηση πληροφοριών λειτουργίας Ρουτίνας"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Η μπαταρία μπορεί να εξαντληθεί πριν από τη συνηθισμένη φόρτιση"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Η Εξοικονόμηση μπαταρίας ενεργοποιήθηκε για την επέκταση της διάρκειας ζωής της μπαταρίας"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Φάκελος"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Εφαρμογή Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Αρχείο"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Αρχείο <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Ήχος"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Αρχείο ήχου <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Βίντεο"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Βίντεο <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Εικόνα"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Εικόνα <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Αρχείο"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Αρχείο <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Έγγραφο"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Έγγραφο <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Υπολογιστικό φύλλο"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Υπολογιστικό φύλλο <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Παρουσίαση"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Παρουσίαση <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Φόρτωση"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> αρχεία</item>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 4c5d6c088428..3de69fe965e8 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Music"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"access your music"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your music?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos &amp; Videos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos &amp; videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos &amp; videos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos &amp; videos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos and videos, including tagged locations?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Switch output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> file"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> image"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> archive"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> document"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 3c1d00457074..47e8cd9ebcf6 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Music"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"access your music"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your music?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos &amp; Videos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos &amp; videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos &amp; videos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos &amp; videos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos and videos, including tagged locations?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Switch output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> file"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> image"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> archive"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> document"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 4c5d6c088428..3de69fe965e8 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Music"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"access your music"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your music?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos &amp; Videos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos &amp; videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos &amp; videos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos &amp; videos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos and videos, including tagged locations?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Switch output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> file"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> image"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> archive"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> document"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 4c5d6c088428..3de69fe965e8 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telephone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"make and manage phone calls"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to make and manage phone calls?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Body sensors"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Body sensors"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"access sensor data about your vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access sensor data about your vital signs?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Music"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"access your music"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your music?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos &amp; Videos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Photos &amp; videos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"access your photos &amp; videos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos &amp; videos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your photos and videos, including tagged locations?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Retrieve window content"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspect the content of a window that you\'re interacting with."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Turn on Explore by Touch"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Set-up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explore"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Switch output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> missing"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insert device again"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moving <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"This background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> will be blocked in future Q builds. See go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Background activity start from <xliff:g id="PACKAGENAME">%1$s</xliff:g> blocked. See go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Routine Mode info notification"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Battery may run out before usual charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Battery Saver activated to extend battery life"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> file"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> image"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> archive"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> document"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Loading"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index dc9ddf9797f9..4ebc1b22def6 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎Phone‎‏‎‎‏‎"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎make and manage phone calls‎‏‎‎‏‎"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to make and manage phone calls?‎‏‎‎‏‎"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎Body Sensors‎‏‎‎‏‎"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎Body sensors‎‏‎‎‏‎"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎access sensor data about your vital signs‎‏‎‎‏‎"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access sensor data about your vital signs?‎‏‎‎‏‎"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎Music‎‏‎‎‏‎"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎access your music‎‏‎‎‏‎"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your music?‎‏‎‎‏‎"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎Photos &amp; Videos‎‏‎‎‏‎"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎Photos &amp; videos‎‏‎‎‏‎"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‎access your photos &amp; videos‎‏‎‎‏‎"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your photos &amp; videos?‎‏‎‎‏‎"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your photos and videos, including tagged locations?‎‏‎‎‏‎"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‎Retrieve window content‎‏‎‎‏‎"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎Inspect the content of a window you\'re interacting with.‎‏‎‎‏‎"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎Turn on Explore by Touch‎‏‎‎‏‎"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎Set up‎‏‎‎‏‎"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎Eject‎‏‎‎‏‎"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎Explore‎‏‎‎‏‎"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‎Switch output‎‏‎‎‏‎"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎ missing‎‏‎‎‏‎"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎Insert device again‎‏‎‎‏‎"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‎Moving ‎‏‎‎‏‏‎<xliff:g id="NAME">%s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎Overlay #‎‏‎‎‏‏‎<xliff:g id="ID">%1$d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎: ‎‏‎‎‏‏‎<xliff:g id="WIDTH">%2$d</xliff:g>‎‏‎‎‏‏‏‎x‎‏‎‎‏‏‎<xliff:g id="HEIGHT">%3$d</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="DPI">%4$d</xliff:g>‎‏‎‎‏‏‏‎ dpi‎‏‎‎‏‎"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‎, secure‎‏‎‎‏‎"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎This background activity start from ‎‏‎‎‏‏‎<xliff:g id="PACKAGENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will be blocked in future Q builds. See go/q-bg-block.‎‏‎‎‏‎"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎Background activity start from ‎‏‎‎‏‏‎<xliff:g id="PACKAGENAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ blocked. See go/q-bg-block.‎‏‎‎‏‎"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎Forgot Pattern‎‏‎‎‏‎"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎Wrong Pattern‎‏‎‎‏‎"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎Wrong Password‎‏‎‎‏‎"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎Routine Mode info notification‎‏‎‎‏‎"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‎Battery may run out before usual charge‎‏‎‎‏‎"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎Battery Saver activated to extend battery life‎‏‎‎‏‎"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎Folder‎‏‎‎‏‎"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎Android application‎‏‎‎‏‎"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎File‎‏‎‎‏‎"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ file‎‏‎‎‏‎"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎Audio‎‏‎‎‏‎"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ audio‎‏‎‎‏‎"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‎Video‎‏‎‎‏‎"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ video‎‏‎‎‏‎"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎Image‎‏‎‎‏‎"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ image‎‏‎‎‏‎"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎Archive‎‏‎‎‏‎"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ archive‎‏‎‎‏‎"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎Document‎‏‎‎‏‎"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ document‎‏‎‎‏‎"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‎Spreadsheet‎‏‎‎‏‎"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ spreadsheet‎‏‎‎‏‎"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎Presentation‎‏‎‎‏‎"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="EXTENSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎ presentation‎‏‎‎‏‎"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎Loading‎‏‎‎‏‎"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="FILE_NAME_2">%s</xliff:g>‎‏‎‎‏‏‏‎ + ‎‏‎‎‏‏‎<xliff:g id="COUNT_3">%d</xliff:g>‎‏‎‎‏‏‏‎ files‎‏‎‎‏‎</item>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 505a184cab7a..bdfb9236ddc8 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hacer y administrar llamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga y administre las llamadas telefónicas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a los datos del sensor acerca de tus signos vitales"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los datos del sensor de tus signos vitales?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder a tu música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu música?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos y videos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder a tus fotos y videos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus fotos y videos?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la Exploración táctil"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Cambiar salida"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"No se encuentra dispositivo <xliff:g id="NAME">%s</xliff:g>."</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Vuelve a insertar dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfiriendo la aplicación <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segura"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"En las próximas compilaciones de Q, se bloqueará el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Se bloqueó el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Olvidaste el patrón?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string>
@@ -1996,9 +2000,27 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación de información del modo de Rutinas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Es posible que la batería se agote antes de la carga habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Se activó el Ahorro de batería para extender la duración de la batería"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Carpeta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicación de Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Archivo"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Archivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagen"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagen <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Hoja de cálculo"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Hoja de cálculo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentación"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
- <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos</item>
- <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo</item>
+ <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos más</item>
+ <item quantity="one"><xliff:g id="FILE_NAME_0">%s</xliff:g> y <xliff:g id="COUNT_1">%d</xliff:g> archivo más</item>
</plurals>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index db6b71034b24..4eadc4c9489f 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hacer y administrar llamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; haga y gestione llamadas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a datos de sensores de tus constantes vitales"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a los datos del sensor sobre tus constantes vitales?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder a tu música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu música?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos y vídeos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos y vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder a tus fotos y vídeos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus fotos y vídeos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tus fotos y vídeos, así como a las ubicaciones etiquetadas?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Comprobar el contenido de la ventana"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de una ventana con la que estés interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar la exploración táctil"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Cambiar salida"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Falta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Introduce el dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moviendo <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"El inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> se bloqueará en las próximas compilaciones de Q. Consulta la página go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Se ha bloqueado el inicio de la actividad en segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta la página go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Has olvidado el patrón?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación sobre el modo rutina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Es posible que te quedes sin batería antes de lo habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Se ha activado el ahorro de batería para aumentar la duración de la batería"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Carpeta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicación de Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Archivo"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Archivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio: <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagen"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagen <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Hoja de cálculo"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Hoja de cálculo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentación"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> y <xliff:g id="COUNT_3">%d</xliff:g> archivos</item>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index e16cb6aaab95..9779ae88ed47 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"helistamine ja telefonikõnede haldamine"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Kas lubada rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; teha ja hallata telefonikõnesid?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kehaandurid"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"juurdepääs anduri andmetele teie eluliste näitajate kohta"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs anduri andmetele teie eluliste näitajate kohta?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muusika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Pääseda juurde teie muusikale"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie muusikale?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotod ja videod"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Pääseda juurde teie fotodele ja videotele"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie fotodele ja videotele?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Akna sisu toomine"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kasutatava akna sisu kontrollimine."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Puudutusega sirvimise sisselülitamine"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Seadistus"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Eemaldamine"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Avastamine"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Vahetage väljundit"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Üksust <xliff:g id="NAME">%s</xliff:g> pole"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Sisestage seade uuesti"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Seadme <xliff:g id="NAME">%s</xliff:g> teisaldamine"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Ülekate nr .<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", turvaline"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"See taustategevuse käivitamine paketist <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeeritakse tulevaste Q järkude puhul. Vt go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Taustategevuse käivitamine paketist <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokeeriti. Vt go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unustasin mustri"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Vale parool"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutiinirežiimi teabe märguanne"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Aku võib enne tavapärast laadimist tühjaks saada"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akusäästja aktiveeriti aku tööea pikendamiseks"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Kaust"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Androidi rakendus"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fail"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-fail"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Heli"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-helifail"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-videofail"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Kujutis"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kujutisefail"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhiiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arhiivifail"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Arvutustabel"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arvutustabelifail"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Esitlus"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-esitlusefail"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laadimine"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> faili</item>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index ab1dbd0a1a67..d1ee66c990e0 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonoa"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"egin eta kudeatu telefono-deiak"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari telefono-deiak egitea eta kudeatzea baimendu nahi diozu?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Gorputz-sentsoreak"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"atzitu bizi-konstanteei buruzko sentsorearen datuak"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Bizi-konstanteei buruzko sentsorearen datuak atzitzea baimendu nahi diozu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musika atzitu"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari musika atzitzea baimendu nahi diozu?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Argazkiak eta bideoak"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"argazkiak eta bideoak atzitu"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari argazkiak eta bideoak atzitzea baimendu nahi diozu?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Eskuratu leihoko edukia"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Arakatu irekita daukazun leihoko edukia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktibatu \"Arakatu ukituta\""</string>
@@ -510,7 +513,7 @@
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desgaitu pantailaren blokeoa"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Teklen blokeoa eta erlazionatutako pasahitz-segurtasuna desgaitzeko baimena ematen die aplikazioei. Adibidez, telefonoak teklen blokeoa desgaitzen du telefono-deiak jasotzen dituenean, eta berriro gaitzen du deiak amaitzean."</string>
<string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"eskatu pantailaren blokeoaren konplexutasuna"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Pantailaren blokeoaren konplexutasun-maila (handia, ertaina, txikia edo bat ere ez) ezagutzeko aukera ematen dio aplikazioari; haren bidez, pantailaren blokeoaren luzeraren barruti edo mota posiblea adierazten da. Halaber, erabiltzaileei pantailaren blokeoa maila jakin batera igotzeko iradoki diezaieke aplikazioak, baina erabiltzaileek horri ez ikusi egiteko eta aplikazioa erabiltzen jarraitzeko aukera dute. Kontuan izan pantailaren blokeoa ez dela gordetzen testu arrunt gisa; beraz, aplikazioak ez du jakingo pasahitza zehazki zein den."</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Pantailaren blokeoaren konplexutasun-maila (handia, ertaina, txikia edo bat ere ez) ezagutzeko aukera ematen dio aplikazioari; haren bidez, pantailaren blokeoaren luzeraren barruti edo mota posiblea adierazten da. Halaber, erabiltzaileei pantailaren blokeoa maila jakin batera igotzeko iradoki diezaieke aplikazioak, baina erabiltzaileek horri ez ikusi egiteko eta aplikazioa erabiltzen jarraitzeko aukera dute. Kontuan izan pantailaren blokeoa ez dela gordetzen testu arrunt gisa; beraz, aplikazioak ez du jakingo zein den pasahitz zehatza."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"Erabili hardware biometrikoa"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Autentifikatzeko hardware biometrikoa erabiltzea baimentzen die aplikazioei."</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"kudeatu erreferentzia-gako digitalen hardwarea"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguratu"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Atera"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Arakatu"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Aldatu irteera"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Ez dago <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Sartu gailua berriro"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> mugitzen"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>. gainjartzea"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segurua"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketearen atzeko planoko jardueraren abio hau blokeatu egingo da Q bertsioaren etorkizuneko konpilazioetan. Joan go/q-bg-block helbidera."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Blokeatu da <xliff:g id="PACKAGENAME">%1$s</xliff:g> paketearen atzeko planoko jardueraren abioa. Joan go/q-bg-block helbidera."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Eredua ahaztu zaizu"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Eredu okerra"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pasahitz okerra"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ohitura moduaren informazio-jakinarazpena"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baliteke bateria ohi baino lehenago agortzea"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Bateria-aurrezlea aktibatuta dago bateriaren iraupena luzatzeko"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Karpeta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android aplikazioa"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fitxategia"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> fitxategia"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audioa"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audioa"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Bideoa"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> bideoa"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Irudia"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> irudia"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Artxiboa"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> artxiboa"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumentua"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokumentua"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Kalkulu-orria"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> kalkulu-orria"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Aurkezpena"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> aurkezpena"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Kargatzen"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fitxategi</item>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 712f06c4a4ee..e8f55bdad155 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"تلفن"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"برقراری و مدیریت تماس‌های تلفنی"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; اجازه داده شود تماس‌های تلفنی برقرار کند و آن‌ها را مدیریت کند؟"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"حسگرهای بدن"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"دسترسی به داده‌های حسگر در رابطه با علائم حیاتی شما"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; اجازه داده شود به داده‌های حسگر مربوط به علائم حیاتی شما دسترسی پیدا کند؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"موسیقی"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"دسترسی به موسیقی شما"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به موسیقی شما دسترسی پیدا کند؟"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"عکس و ویدیو"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"دسترسی به عکس‌ها و ویدیوهایتان"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به عکس‌ها و ویدیوهای شما دسترسی پیدا کند؟"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"محتوای پنجره را بازیابی کند"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"محتوای پنجره‌ای را که درحال تعامل با آن هستید بررسی می‌کند."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"فعال‌سازی کاوش لمسی"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"راه‌اندازی"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"بیرون راندن"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"کاوش"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"تغییر خروجی"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> وجود ندارد"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"دستگاه را دوباره وارد کنید"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"در حال انتقال <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"هم‌پوشانی #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"، امن"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"‏شروع فعالیت پس‌زمینه<xliff:g id="PACKAGENAME">%1$s</xliff:g> در نسخه‌های Q آینده مسدود خواهد شد. به go/q-bg-block مراجعه کنید."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"‏شروع فعالیت پس‌زمینه <xliff:g id="PACKAGENAME">%1$s</xliff:g> مسدود شده است. به go/q-bg-block مراجعه کنید."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"الگو را فراموش کرده‌اید"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"الگوی اشتباه"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"گذرواژه اشتباه"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"اعلان اطلاعات حالت روال معمول"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ممکن است شارژ باتری قبل از شارژ معمول تمام شود"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"جهت افزایش عمر باتری، بهینه‌سازی باتری فعال شد"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"پوشه"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"‏برنامه Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"فایل"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> فایل"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"صدا"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> صوتی"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ویدیو"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ویدیو"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"تصویر"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> تصویر"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"بایگانی"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> بایگانی"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"سند"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> سند"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"صفحه‌گسترده"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> صفحه‌گسترده"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ارائه"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ارائه"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"درحال بارگیری"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فایل</item>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index d8e336cbc8b6..d1687dbe3f11 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Puhelin"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"soittaa ja hallinnoida puheluita"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; soittaa ja hallinnoida puheluita?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kehon anturit"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Kehon anturit"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"käyttää anturitietoja elintoiminnoistasi"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; käyttää anturitietoja elintoiminnoistasi?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiikki"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"käyttää musiikkiasi"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; käyttää musiikkiasi?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Kuvat ja videot"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Kuvat ja videot"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"käyttää kuvia ja videoita"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; käyttää kuviasi ja videoitasi?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pääsyn kuviin ja videoihin, mukaan lukien tagattuihin sijainteihin?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Noutaa ikkunan sisältöä"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tarkistaa käyttämäsi ikkunan sisältö."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ottaa kosketuksella tutkimisen käyttöön"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Määritä asetukset"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Poista"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Tutustu"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Vaihda syötettä"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> puuttuu."</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Liitä laite uudelleen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Siirretään <xliff:g id="NAME">%s</xliff:g>."</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Peittokuva # <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", suojattu"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Tämä taustatoiminnan käynnistys kohteesta <xliff:g id="PACKAGENAME">%1$s</xliff:g> estetään tulevissa Q-versioissa. Lue lisää: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Taustatoiminnan käynnistys kohteesta <xliff:g id="PACKAGENAME">%1$s</xliff:g> estettiin. Lue lisää: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unohtunut kuvio"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Väärä kuvio"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Väärä salasana"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ohjelmatilan tietoilmoitus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akku saattaa loppua ennen normaalia latausaikaa"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Virransäästö otettu käyttöön akunkeston pidentämiseksi"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Kansio"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-sovellus"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Tiedosto"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-tiedosto"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Ääni"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-ääni"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Kuva"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kuva"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkisto"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arkisto"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumentti"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokumentti"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Laskentataulukko"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-laskentataulukko"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Esitys"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-esitys"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ladataan"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tiedostoa</item>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 0c3757b32b87..86db22448676 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à faire et à gérer les appels téléphoniques?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musique"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accéder à votre musique"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à votre musique?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos et vidéos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accéder à vos photos et à vos vidéos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à vos photos et à vos videos?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Découvrir"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Changer de sortie"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage <xliff:g id="NAME">%s</xliff:g> manquante"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez l\'appareil de nouveau"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Déplacement de <xliff:g id="NAME">%s</xliff:g> en cours..."</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sécurisé"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ce lancement d\'activité en arrière-plan par <xliff:g id="PACKAGENAME">%1$s</xliff:g> sera bloqué dans les versions futures de Q. Visitez la page go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Le lancement d\'une activité en arrière-plan par <xliff:g id="PACKAGENAME">%1$s</xliff:g> a été bloqué. Visitez la page go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"La pile pourrait s\'épuiser avant la charge habituelle"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Le mode Économiseur de pile est activé afin de prolonger l\'autonomie"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Dossier"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Application Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fichier"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Fichier <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Son"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio en <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vidéo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vidéo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Image <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archive <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Document <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Feuille de calcul"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Feuille de calcul <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Présentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Chargement en cours…"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 14b05e7f931a..cc6d8f439f0e 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -274,7 +274,7 @@
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
<string name="user_owner_label" msgid="8836124313744349203">"Passer au profil personnel"</string>
- <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil pro"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
<string name="permgrouprequest_contacts" msgid="6032805601881764300">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à vos contacts ?"</string>
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de passer et gérer des appels téléphoniques ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder aux données des capteurs relatives à vos signes vitaux ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musique"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accéder à votre musique"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à votre musique ?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Photos et vidéos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accéder à vos photos et vos vidéos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à vos photos et vidéos ?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecte le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activer la fonctionnalité Explorer au toucher"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Parcourir"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Changer de sortie"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" manquante"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez le périphérique"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfert de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sécurisé"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Le démarrage de cette activité en arrière-plan de <xliff:g id="PACKAGENAME">%1$s</xliff:g> sera bloqué dans les prochaines builds Q. Voir go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Le démarrage de l\'activité en arrière-plan de <xliff:g id="PACKAGENAME">%1$s</xliff:g> a été bloqué. Voir go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification d\'information du mode Routine"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Vous risquez d\'être à court de batterie plus tôt que prévu"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Économiseur de batterie activé pour prolonger l\'autonomie"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Dossier"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Application Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fichier"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Fichier <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vidéo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vidéo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Image"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Image <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archive <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Document <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Feuille de calcul"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Feuille de calcul <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Présentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Présentation <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Chargement…"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 4e6f045d80e7..934c86657ffd 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; realice e xestione chamadas telefónicas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos dos sensores sobre as túas constantes vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda aos datos dos sensores sobre as túas constantes vitais?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder á música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á túa música?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos e vídeos"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acceder ás fotos e aos vídeos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda ás túas fotos e vídeos?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar contido da ventá"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona o contido dunha ventá coa que estás interactuando."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activar a exploración táctil"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Cambiar de saída"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Falta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Volve inserir o dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Migrando <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición n.º <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segura"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"O inicio desta actividade en segundo plano desde <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloquearase en futuras compilacións de Q. Consulta a páxina go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Bloqueouse o inicio da actividade en segundo plano desde <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Consulta a páxina go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueciches o padrón"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrón incorrecto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contrasinal incorrecto"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificación da información do modo de rutina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A batería pode esgotarse antes do habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Para ampliar a duración da batería activouse a función Aforro de batería"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Cartafol"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicación Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Ficheiro"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Ficheiro <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imaxe"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imaxe <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arquivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arquivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Folla de cálculo"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Folla de cálculo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentación"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentación <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Cargando"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 51feace7719f..a8715b70aa5c 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ફોન"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ફોન કૉલ કરો અને સંચાલિત કરો"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને ફોન કૉલ કરવાની અને તેને મેનેજ કરવાની મંજૂરી આપીએ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"બોડી સેન્સર્સ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારી મહત્વપૂર્ણ સહી વિશેના સેન્સર ડેટાને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"સંગીત"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"તમારા સંગીતને ઍક્સેસ કરો"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા સંગીતમાં ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ફોટો અને વિડિઓ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"તમારા ફોટો &amp; વિડિઓ ઍક્સેસ કરો"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ને તમારા ફોટો &amp; વિડિઓમાં ઍક્સેસ કરવાની મંજૂરી આપવી છે?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"વિંડો કન્ટેન્ટ પુનઃપ્રાપ્ત કરો"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"તમે જેની સાથે ક્રિયા-પ્રતિક્રિયા કરી રહ્યાં છો તે વિંડોનું કન્ટેન્ટ તપાસો."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"સ્પર્શ કરીને શોધખોળ કરવું ચાલુ કરો"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"સેટ કરો"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"બહાર કાઢો"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"અન્વેષણ કરો"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"આઉટપુટ સ્વિચ કરો"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ખૂટે છે"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ફરીથી ઉપકરણ દાખલ કરો"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ખસેડી રહ્યાં છીએ"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ઓવરલે કરો"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", સુરક્ષિત"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>માંથી શરૂ થયેલી આ બૅકગ્રાઉન્ડ પ્રવૃત્તિને ભાવિ Q બિલ્ડમાં બ્લૉક કરવામાં આવશે. go/q-bg-block જુઓ."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>માંથી શરૂ થયેલી બૅકગ્રાઉન્ડ પ્રવૃત્તિ બ્લૉક કરી છે. go/q-bg-block જુઓ."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"પૅટર્ન ભૂલી ગયાં"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ખોટી પૅટર્ન"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ખોટો પાસવર્ડ"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"રૂટિન મોડની માહિતીનું નોટિફિકેશન"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"સામાન્ય રીતે ચાર્જ કરવાના સમય પહેલાં બૅટરી સમાપ્ત થઈ શકે છે"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"બૅટરી આવરદા વધારવા માટે બૅટરી સેવર ચાલુ કર્યું"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ફોલ્ડર"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ઍપ"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ફાઇલ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ફાઇલ"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ઑડિયો"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ઑડિયો"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"વીડિયો"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> વીડિઓ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"છબી"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> છબી"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"આર્કાઇવ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> આર્કાઇવ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"દસ્તાવેજ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> દસ્તાવેજ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"સ્પ્રેડશીટ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> સ્પ્રેડશીટ"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"પ્રસ્તુતિ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> પ્રસ્તુતિ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"લોડિંગ"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ફાઇલ</item>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index c3885bfd9971..4c4c2e210ff5 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फ़ोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर संवेदक"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपने स्वास्थ्य से जुड़ी ज़रूरी जानकारी इस्तेमाल करने की अनुमति देना चाहते हैं?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"संगीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"अपना संगीत संग्रह एक्सेस करने दें"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपना संगीत एक्सेस करने दें?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"फ़ोटो और वीडियो"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"अपने फ़ोटो और वीडियो एक्सेस करने दें"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपने फ़ोटो और वीडियो एक्सेस करने दें?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडो की सामग्री वापस पाएं"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"उस विंडो की सामग्री की जाँच करें, जिसका आप इस्तेमाल कर रहे हैं."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छूकर, किसी चीज़ से जुड़ी जानकारी सुनने की सुविधा चालू करें"</string>
@@ -510,7 +513,7 @@
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"अपना स्‍क्रीन लॉक अक्षम करें"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा अक्षम करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल प्राप्त करते समय फ़ोन, कीलॉक को अक्षम कर देता है, फिर कॉल समाप्त होने पर कीलॉक को पुन: सक्षम कर देता है."</string>
<string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"जानें कि स्क्रीन लॉक कितना मुश्किल है"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"यह मंज़ूरी मिलने के बाद ऐप्लिकेशन जान पाता है कि स्क्रीन लॉक कितना मुश्किल (बहुत ज़्यादा, मध्यम, कम या बिल्कुल नहीं) है. इस स्तर से यह पता चलता है कि स्क्रीन लॉक कितना लंबा या किस तरह का है. ऐप्लिकेशन उपयोगकर्ताओं को यह सुझाव भी दे सकता है कि वे स्क्रीन लॉक को एक तय स्तर तक अपडेट करें. मगर उपयोगकर्ता बेझिझक इसे अनदेखा करके आगे बढ़ सकते हैं. ध्यान दें कि स्क्रीन लॉक को सादे टेक्स्ट में सेव नहीं किया जाता है इसलिए ऐप्लिकेशन को बिल्कुल सही पासवर्ड पता नहीं होता."</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"यह मंज़ूरी मिलने के बाद ऐप्लिकेशन जान पाता है कि स्क्रीन लॉक कितना मुश्किल (बहुत ज़्यादा, मध्यम, कम या बिल्कुल नहीं) है. इस स्तर से यह पता चलता है कि स्क्रीन लॉक कितना लंबा या किस तरह का है. ऐप्लिकेशन उपयोगकर्ताओं को यह सुझाव भी दे सकता है कि वे स्क्रीन लॉक को एक तय स्तर तक अपडेट करें. हालांकि, उपयोगकर्ता बेझिझक इसे अनदेखा करके आगे बढ़ सकते हैं. ध्यान दें कि स्क्रीन लॉक को सादे टेक्स्ट में सेव नहीं किया जाता है इसलिए ऐप्लिकेशन को बिल्कुल सही पासवर्ड पता नहीं होता."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"बायोमीट्रिक हार्डवेयर इस्तेमाल करने दें"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"पुष्टि के लिए, ऐप्लिकेशन को बायोमीट्रिक हार्डवेयर इस्तेमाल करने की मंज़ूरी दें"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"उंगली की छाप के लिए हार्डवेयर को प्रबंधित करें"</string>
@@ -536,8 +539,7 @@
<string name="biometric_error_user_canceled" msgid="2260175018114348727">"प्रमाणीकरण रद्द किया गया"</string>
<string name="biometric_not_recognized" msgid="5770511773560736082">"पहचान नहीं हो पाई"</string>
<string name="biometric_error_canceled" msgid="349665227864885880">"प्रमाणीकरण रद्द किया गया"</string>
- <!-- no translation found for biometric_error_device_not_secured (6583143098363528349) -->
- <skip />
+ <string name="biometric_error_device_not_secured" msgid="6583143098363528349">"पिन, पैटर्न या पासवर्ड सेट नहीं है"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फ़िंगरप्रिंट की पहचान की गई. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फ़िंगरप्रिंट संसाधित नहीं हो सका. कृपया पुन: प्रयास करें."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फ़िंगरप्रिंट सेंसर गंदा है. कृपया साफ़ करें और फिर कोशिश करें."</string>
@@ -557,8 +559,7 @@
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"बहुत अधिक कोशिशें. फ़िंगरप्रिंट सेंसर अक्षम है."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string>
<string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"कोई फ़िंगरप्रिंट रजिस्टर नहीं किया गया है."</string>
- <!-- no translation found for fingerprint_error_hw_not_present (409523969613176352) -->
- <skip />
+ <string name="fingerprint_error_hw_not_present" msgid="409523969613176352">"इस डिवाइस में फ़िंगरप्रिंट सेंसर नहीं है."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"फ़िंगरप्रिंट <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -578,22 +579,14 @@
<string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया डिवाइस को चेहरे के बाईं ओर ले जाएं."</string>
<string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेंसर की ओर देखें."</string>
<string name="face_acquired_not_detected" msgid="5707782294589511391">"चेहरे की पहचान नहीं हो पाई."</string>
- <!-- no translation found for face_acquired_too_much_motion (470381210701463822) -->
- <skip />
- <!-- no translation found for face_acquired_recalibrate (8077949502893707539) -->
- <skip />
- <!-- no translation found for face_acquired_too_different (5553210341111255124) -->
- <skip />
- <!-- no translation found for face_acquired_too_similar (1508776858407646460) -->
- <skip />
- <!-- no translation found for face_acquired_pan_too_extreme (8203001424525231680) -->
- <skip />
- <!-- no translation found for face_acquired_tilt_too_extreme (7641326344460439970) -->
- <skip />
- <!-- no translation found for face_acquired_roll_too_extreme (1444829237745898619) -->
- <skip />
- <!-- no translation found for face_acquired_obscured (3055077697850272097) -->
- <skip />
+ <string name="face_acquired_too_much_motion" msgid="470381210701463822">"डिवाइस बहुत ज़्यादा हिल रहा है."</string>
+ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string>
+ <string name="face_acquired_too_different" msgid="5553210341111255124">"यह चेहरा किसी और का है."</string>
+ <string name="face_acquired_too_similar" msgid="1508776858407646460">"चेहरा काफ़ी मिलता-जुलता है, कृपया अपना पोज़ बदलें."</string>
+ <string name="face_acquired_pan_too_extreme" msgid="8203001424525231680">"कृपया कैमरे की तरफ़ सीधा देखें."</string>
+ <string name="face_acquired_tilt_too_extreme" msgid="7641326344460439970">"कृपया कैमरे की तरफ़ सीधा देखें."</string>
+ <string name="face_acquired_roll_too_extreme" msgid="1444829237745898619">"कृपया अपना सिर सीधा करें, दाएं-बाएं न झुकाएं"</string>
+ <string name="face_acquired_obscured" msgid="3055077697850272097">"चेहरा साफ़ नहीं दिख रहा. कृपया रोशनी बढ़ाएं."</string>
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="6255891785768984615">"चेहरे की पहचान करने वाला हार्डवेयर मौजूद नहीं है."</string>
@@ -605,8 +598,7 @@
<string name="face_error_lockout_permanent" msgid="8198354656746088890">"कई बार कोशिश की. चेहरा पहचानने की सुविधा बंद हुई."</string>
<string name="face_error_unable_to_process" msgid="238761109287767270">"फिर से कोशिश करें."</string>
<string name="face_error_not_enrolled" msgid="9166792142679691323">"कोई चेहरा रजिस्टर नहीं किया गया है."</string>
- <!-- no translation found for face_error_hw_not_present (916085883581450331) -->
- <skip />
+ <string name="face_error_hw_not_present" msgid="916085883581450331">"इस डिवाइस में चेहरे की पहचान करने वाला सेंसर नहीं है."</string>
<string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -1407,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"सेट करें"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"निकालें"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करें"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"आउटपुट बदलें"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गुम है"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"डिवाइस को दोबारा लगाएं"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> को ले जाया जा रहा है"</string>
@@ -1622,6 +1613,10 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओवरले #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string>
+ <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
+ <skip />
+ <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
+ <skip />
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत पैटर्न डाला गया है"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
@@ -2007,6 +2002,42 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"रूटीन मोड जानकारी की सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"बैटरी आम तौर पर जितने समय चलती है, उससे पहले खत्म हो सकती है"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बैटरी लाइफ़ बढ़ाने के लिए \'बैटरी सेवर\' चालू हो गया है"</string>
+ <!-- no translation found for mime_type_folder (7111951698626315204) -->
+ <skip />
+ <!-- no translation found for mime_type_apk (5518003630972506900) -->
+ <skip />
+ <!-- no translation found for mime_type_generic (6833871596845900027) -->
+ <skip />
+ <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
+ <skip />
+ <!-- no translation found for mime_type_audio (6289777657172050926) -->
+ <skip />
+ <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
+ <skip />
+ <!-- no translation found for mime_type_video (4093025777317307426) -->
+ <skip />
+ <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
+ <skip />
+ <!-- no translation found for mime_type_image (3144284451605236371) -->
+ <skip />
+ <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed (1645486037074943257) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
+ <skip />
+ <!-- no translation found for mime_type_document (1596838147256375966) -->
+ <skip />
+ <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation (6145604688774787357) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
+ <skip />
<string name="car_loading_profile" msgid="3545132581795684027">"प्राेफ़ाइल लोड हो रही है"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फ़ाइलें</item>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index e36837ea7d15..ffe543634e1e 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uspostavljati telefonske pozive i upravljati njima"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da upućuje telefonske pozive i upravlja njima?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Biometrijski senzori"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa podacima senzora o vašim vitalnim znakovima?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Glazba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pristup glazbi"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašoj glazbi?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotografije i videozapisi"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pristup fotografijama i &amp; videozapisima"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašim fotografijama i videozapisima?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Pregledat će sadržaj prozora koji upotrebljavate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Uključiti značajku Istraži dodirom"</string>
@@ -1418,8 +1421,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Postavljanje"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Promjena izlaza"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Ponovo umetnite uređaj"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premještanje aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1634,6 +1636,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Preklapanje br. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sigurno"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Pokretanje aktivnosti u pozadini na web-lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g> blokirat će se u budućim međuverzijama Q. Pogledajte go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Blokirano je pokretanje aktivnosti u pozadini na web-lokaciji <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Pogledajte go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste obrazac"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan obrazac"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna zaporka"</string>
@@ -2031,6 +2035,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Obavještavanje o informacijama u Rutinskom načinu rada"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterija se može isprazniti prije uobičajenog vremena punjenja"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Štednja baterije aktivirana je kako bi se produljilo trajanje baterije"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mapa"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android aplikacija"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> datoteka"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Zvuk"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audiozapis"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Videozapis"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> videozapis"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Slika"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> slika"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhiva"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arhiva"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Proračunska tablica"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> proračunska tablica"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentacija"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentacija"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Učitavanje"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> i još <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 20d06c37131c..fda1244f5d56 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonhívások kezdeményezése és kezelése"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hívásokat indíthasson és kezelhessen?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Testérzékelők"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"az érzékelők által mért, életjelekkel kapcsolatos adatok elérése"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az életjelekkel kapcsolatos szenzoradatokhoz?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Zene"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"hozzáférés a zenékhez"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&amp;gt számára, hogy hozzáférjen az Ön zenéihez?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fényképek és videók"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"hozzáférés a fényképekhez és videókhoz"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&amp;gt számára, hogy hozzáférjen a fotókhoz és videókhoz?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Ablaktartalom lekérdezése"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"A használt ablak tartalmának vizsgálata."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Felfedezés érintéssel bekapcsolása"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Beállítás"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Kiadás"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Tallózás"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Kimenet átváltása"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"A(z) <xliff:g id="NAME">%s</xliff:g> nem található"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Csatlakoztassa újra az eszközt"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> áthelyezése"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>. fedvény"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> képpont"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", biztonságos"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ez a háttértevékenység-indítás le lesz tiltva a(z) <xliff:g id="PACKAGENAME">%1$s</xliff:g> számára a jövőbeni Q-buildeknél. Lásd: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"A(z) <xliff:g id="PACKAGENAME">%1$s</xliff:g> számára le van tiltva a háttértevékenységek indítása. Lásd: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Elfelejtett minta"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Helytelen minta"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Helytelen jelszó"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Információs értesítés a rutinmódról"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Előfordulhat, hogy az akkumulátor lemerül a szokásos töltési időszak előtt"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akkumulátorkímélő mód aktiválva az akkumulátor üzemidejének növelése érdekében"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mappa"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-alkalmazás"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fájl"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-fájl"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Hang"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-hangfájl"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Videó"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-videó"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Kép"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kép"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archívum"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-archívum"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumentum"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokumentum"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Táblázat"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-táblázat"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentáció"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-prezentáció"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Betöltés"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fájl</item>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 1c05168fb3ed..a8df7209e9c9 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Հեռախոս"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"կատարել զանգեր և կառավարել զանգերը"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին կատարել հեռախոսազանգեր և կառավարել դրանք:"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Մարմնի սենսորներ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին սենսորից ստանալ ձեր կենսագործունեության հիմնական տվյալները:"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Երաժշտություն"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"երաժշտության հասանելիություն"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Հասանելի դարձնե՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին ձեր երաժշտությունը:"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Լուսանկարներ և տեսանյութեր"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"լուսանկարների և տեսանյութերի հասանելիություն"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Հասանելի դարձնե՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին ձեր լուսանկարներն ու տեսանյութերը։"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Առբերել պատուհանի բովանդակությունը"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Վերլուծել գործող պատուհանի բովանդակությունը"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Միացնել Հպման միջոցով հետազոտումը"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Վերածածկ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>. <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> կմվ"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", անվտանգ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ֆոնային ռեժիմում <xliff:g id="PACKAGENAME">%1$s</xliff:g>-ի աշխատանքի գործարկումը կարգելափակվի հաջորդ Q կառուցումներում։ Տես այստեղ՝ go/q-bg-block։"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Ֆոնային ռեժիմում <xliff:g id="PACKAGENAME">%1$s</xliff:g>-ի աշխատանքի գործարկումն արգելափակվեց։ Տես այստեղ՝ go/q-bg-block։"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Մոռացել եմ սխեման"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Սխալ սխեմա"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Սխալ գաղտնաբառ"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Ծանուցում լիցքավորման մասին"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Մարտկոցի լիցքը կարող է սովորականից շուտ սպառվել"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Մարտկոցի կյանքը երկարացնելու համար ակտիվացվել է մարտկոցի տնտեսման ռեժիմը"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Պանակ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android հավելված"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Ֆայլ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ֆայլ"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Աուդիո ֆայլ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> աուդիո ֆայլ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Տեսանյութ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> տեսանյութ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Պատկեր"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> պատկեր"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Արխիվ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> արխիվ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Փաստաթուղթ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> փաստաթուղթ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Աղյուսակ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> աղյուսակ"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Ներկայացում"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ներկայացում"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Բեռնում"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ֆայլ</item>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a27a67246e9a..aaec2ef39c68 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"melakukan dan mengelola panggilan telepon"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; melakukan dan mengelola panggilan telepon?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensor Tubuh"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"mengakses data sensor tentang tanda-tanda vital"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data sensor tentang tanda-tanda vital Anda?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"mengakses musik Anda"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; untuk mengakses musik?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto &amp; Video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"mengakses foto &amp; video Anda"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; untuk mengakses foto &amp; video?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Mengambil konten jendela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Memeriksa konten jendela tempat Anda berinteraksi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Mengaktifkan Jelajahi dengan Sentuhan"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Siapkan"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Keluarkan"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Jelajahi"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Ganti keluaran"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Tidak ada <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Masukkan perangkat lagi"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Memindahkan <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Hamparan #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", aman"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Aktivitas latar belakang yang dimulai dari <xliff:g id="PACKAGENAME">%1$s</xliff:g> akan diblokir di build Q di masa mendatang. Lihat go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Aktivitas latar belakang yang dimulai dari <xliff:g id="PACKAGENAME">%1$s</xliff:g> diblokir. Lihat go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Pola?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pola Salah"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Sandi Salah"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifikasi info Mode Rutinitas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Baterai mungkin habis sebelum pengisian daya biasanya"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penghemat Baterai diaktifkan untuk memperpanjang masa pakai baterai"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikasi Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"File <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Gambar"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Gambar <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arsip"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arsip <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumen"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokumen <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Spreadsheet <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentasi"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentasi <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Memuat"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index d03e2a24a2eb..c0627c12d68a 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Sími"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hringja og stjórna símtölum"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Viltu leyfa &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; að hringja og stjórna símtölum?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Líkamsskynjarar"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aðgangur að skynjaragögnum yfir lífsmörk þín"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að skynjaragögnum yfir lífsmörk þín?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Tónlist"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"fá aðgang að tónlistinni þinni"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að tónlistinni þinni?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Myndir og myndskeið"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fá aðgang að myndunum og myndskeiðunum þínum"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að myndunum og myndskeiðunum þínum?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Sækja innihald glugga"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kanna innihald glugga sem þú ert að nota."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kveikja á snertikönnun"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Setja upp"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Fjarlægja"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Kanna"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Skipta um úttak"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> vantar"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Tengdu tækið aftur"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytur <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Yfirlögn #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", öruggur"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Framvegis verður lokað á þessa bakgrunnsvirkni frá <xliff:g id="PACKAGENAME">%1$s</xliff:g> í Q-smíði. Sjá go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Lokað á bakgrunnsvirkni frá <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Sjá go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Man ekki mynstrið"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Rangt mynstur"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Rangt aðgangsorð"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Upplýsingatilkynning aðgerðastillingar"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Rafhlaðan kann að tæmast áður en hún kemst í hleðslu"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Kveikt á rafhlöðusparnaði til að lengja endingu rafhlöðunnar"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mappa"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android forrit"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Skrá"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-skrá"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Hljóð"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-hljóðskrá"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Myndskeið"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-myndskeið"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Mynd"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-mynd"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Safnskrá"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-safnskrá"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Skjal"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-skjal"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Töflureiknir"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-töflureiknir"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Kynning"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kynning"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Hleður"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skrá</item>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 52d674f52485..0d4e0bdd44dd 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensori per il corpo"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musica"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Accesso alla tua musica"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla tua musica?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto e video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Accesso alle tue foto e ai tuoi video"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alle tue foto e ai tuoi video?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Espelli"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Apri"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Cambia uscita"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mancante"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Reinserisci il dispositivo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Spostamento di <xliff:g id="NAME">%s</xliff:g> in corso"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay n. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", opzione sicura"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"L\'avvio di questa attività in background da <xliff:g id="PACKAGENAME">%1$s</xliff:g> verrà bloccato nelle future build Q. Visita la pagina go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Avvio delle attività in background da <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloccato. Visita la pagina go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Sequenza dimenticata"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequenza sbagliata"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Password sbagliata"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notifica di informazioni sulla modalità Routine"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"La batteria potrebbe esaurirsi prima della ricarica abituale"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Risparmio energetico attivo per far durare di più la batteria"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Cartella"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Applicazione Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"File <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Immagine"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Immagine <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archivio"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archivio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Foglio di lavoro"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Foglio di lavoro <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentazione"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Presentazione <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Caricamento"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 093638bd716a..1d27a3f9d487 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"טלפון"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"התקשרות וניהול של שיחות טלפון"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאה להתקשרות ולניהול של שיחות טלפון?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"חיישני גוף"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"גישה אל נתוני חיישנים של הסימנים החיוניים שלך"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה לנתוני חיישנים העוקבים אחר הסימנים החיוניים שלך?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"מוזיקה"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"גישה למוזיקה שלך"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏האם לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה למוזיקה שלך?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"תמונות וסרטונים"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"גישה לתמונות ולסרטונים שלך"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"‏האם לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה לתמונות ולסרטונים שלך?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"אחזור תוכן של חלון"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"הפעלה של \'גילוי באמצעות מגע\'"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"הגדר"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"הוצא"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"גלה"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"החלפת פלט"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> חסר"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"יש להכניס שוב את ההתקן"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"מעביר את <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"שכבת-על #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"‏<xliff:g id="NAME">%1$s</xliff:g>: ‎<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>‎, ‏<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", מאובטח"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"‏התחלה זו של פעילות ברקע מ-<xliff:g id="PACKAGENAME">%1$s</xliff:g> תיחסם בגרסאות build עתידיות של Q. ניתן לעיין בכתובת go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"‏נחסמה התחלה של פעילות ברקע מ-<xliff:g id="PACKAGENAME">%1$s</xliff:g>. ניתן לעיין בכתובת go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת את קו ביטול הנעילה?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"התראת מידע לגבי מצב שגרתי"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"תיקייה"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"‏אפליקציית Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"קובץ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"קובץ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"אודיו"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"אודיו בפורמט <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"סרטון"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"סרטון <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"תמונה"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"תמונה בפורמט <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ארכיון"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"קובץ ארכיון <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"מסמך"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"מסמך <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"גיליון אלקטרוני"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"גיליון אלקטרוני <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"מצגת"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"מצגת <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"בטעינה"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="two"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> קבצים</item>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 8ff3c283427a..f0291a80990e 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"電話の発信と管理"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"電話の発信と管理を &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ボディーセンサー"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"バイタルサインに関するセンサーデータへのアクセス"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"バイタルサインに関するセンサーデータへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音楽"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"音楽へのアクセス"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"音楽へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"写真と動画"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"写真と動画へのアクセス"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"写真と動画へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ユーザーがアクセスしているウィンドウのコンテンツを検査します。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"タッチガイドの有効化"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"セットアップ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"取り外し"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"外部メディア"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"出力を切り替えます"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g>が見つかりません"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"デバイスを挿入し直してください"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>を移動しています"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"オーバーレイ第<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>、<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"、セキュア"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> からのこのバックグラウンド アクティビティの開始は今後の Q ビルドではブロックされます。go/q-bg-block をご覧ください。"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> からのバックグラウンド アクティビティの開始がブロックされました。go/q-bg-block をご覧ください。"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"パターンを忘れた場合"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ルーティン モード情報の通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"通常の充電を行う前に電池が切れる可能性があります"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"電池を長持ちさせるため、バッテリー セーバーが有効になりました"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"フォルダ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android アプリ"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ファイル"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ファイル"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"音声"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> 音声"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"動画"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> 動画"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"画像"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> 画像"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"アーカイブ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> アーカイブ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ドキュメント"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ドキュメント"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"スプレッドシート"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> スプレッドシート"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"プレゼンテーション"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> プレゼンテーション"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"読み込んでいます"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g>、他 <xliff:g id="COUNT_3">%d</xliff:g> ファイル</item>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index cf41d5d5dc25..8295136167c5 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ტელეფონი"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"სატელეფონო ზარების განხორციელება და მართვა"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; სატელეფონო ზარების განხორციელების და მართვის ნებართვა?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"სხეულის სენსორები"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომა"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენი სასიცოცხლო ფუნქციების შესახებ სენსორის მონაცემებზე წვდომის ნებართვა?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"მუსიკა"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"თქვენს მუსიკაზე წვდომა"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ს თქვენს მუსიკაზე წვდომა?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ფოტოები და ვიდეოები"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"თქვენს ფოტოებსა და ვიდეოებზე წვდომა"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ს თქვენს ფოტოებსა და ვიდეოებზე წვდომა?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ფანჯრის კონტენტის მოძიება"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"იმ ფანჯრის კონტენტის შემოწმება, რომელშიც მუშაობთ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"„შეხებით აღმოჩენის“ ჩართვა"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"გადაფარვა #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", დაცული"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-დან ამ ფონური აქტივობის გაშვება დაიბლოკება Q-ის მომდევნო ანაწყობებში. იხილეთ go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-დან ფონური აქტივობის გაშვება დაიბლოკა. იხილეთ go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დაგავიწყდათ ნიმუში"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"არასწორი ნიმუში"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"არასწორი პაროლი"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"რუტინის რეჟიმის საინფორმაციო შეტყობინება"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ბატარეა შეიძლება დაჯდეს დატენის ჩვეულ დრომდე"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ბატარეის დამზოგი გააქტიურდა ბატარეის მუშაობის გასახანგრძლივლებლად"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"საქაღალდე"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-ის აპლიკაცია"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ფაილი"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ფაილი"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"აუდიო"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> აუდიო"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ვიდეო"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ვიდეო"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"სურათი"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> სურათი"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"არქივი"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> არქივი"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"დოკუმენტი"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> დოკუმენტი"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ელცხრილი"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> ელცხრილი"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"პრეზენტაცია"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> პრეზენტაცია"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"იტვირთება"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ფაილი</item>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index b17f7fd25528..5231299be31e 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"қоңырау шалу және телефон қоңырауларын басқару"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына қоңыраулар шалуға және басқаруға рұқсат берілсін бе?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Дене датчиктері"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына негізгі физиологиялық көрсеткіштерді көрсететін сенсорлық деректерді пайдалануға рұқсат берілсін бе?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"музыка мазмұнына кіру"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына музыка мазмұнына кіруге рұқсат етілсін бе?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Суреттер және бейнелер"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"суреттер мен бейнелерге кіру"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына суреттер мен бейнелерге кіруге рұқсат етілсін бе?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмұнын оқып отыру"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Explore by Touch функциясын қосу"</string>
@@ -510,7 +513,7 @@
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"экран бекітпесін істен шығару"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Қолданбаларға кілтперне және басқа кілтсөзге қатысты қауіпсіздік шараларын өшіру мүмкіндігін береді. Мысалы, телефон кіріс қоңырауларын алғанда кілтпернені өшіреді және қоңырау аяқталғанда қайта қосады."</string>
<string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"экранды құлыптау күрделілігін сұрау"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Қолданбаға экранды құлыптаудың күрделілік деңгейін (жоғары, орташа, төмен немесе жоқ), соның ішінде ұзақтығы мен түрін анықтауға мүмкіндік береді. Сонымен қатар қолданба пайдаланушыларға экранды құлыптауды белгілі бір деңгейге жаңартуды ұсынады. Бірақ бұл ұсыныстарды елемеуге болады. Экранды құлыптау қарапайым мәтін түрінде сақталмайтынын және қолданбаға белгісіз болатынын ескеріңіз."</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Қолданбаға экранды құлыптаудың күрделілік деңгейін (жоғары, орташа, төмен немесе жоқ), соның ішінде ұзақтығы мен түрін анықтауға мүмкіндік береді. Сонымен қатар қолданба пайдаланушыларға құлыпты белгілі бір деңгейге жаңартуды ұсынады. Бірақ бұл ұсыныстарды елемеуге болады. Экран құлпы қарапайым мәтін түрінде сақталмайтынын және құпия сөз қолданбаға белгісіз болатынын ескеріңіз."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"биометрикалық жабдықты пайдалану"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Аутентификациялау үшін қолданбаға биометрикалық жабдықты пайдалануға рұқсат береді"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"саусақ ізі жабдығын басқару"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Реттеу"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Шығару"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Зерттеу"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Шығысты ауыстыру"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Құрылғыны қайта салыңыз"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> тасымалдануда"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"№<xliff:g id="ID">%1$d</xliff:g> қабаттама"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", қауіпсіз"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтындағы фондық әрекеттерге болашақ Q құрамаларында тыйым салынады. go/q-bg-block бетін қараңыз."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтындағы фондық әрекеттерге тыйым салынған. go/q-bg-block бетін қараңыз."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Кескінді ұмытып қалу"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Қате өрнек"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Қате кілтсөз"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Режим туралы хабарландыру"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея заряды азаюы мүмкін"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батарея ұзаққа жетуі үшін, Battery Saver іске қосылды"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Қалта"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android қолданбасы"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> файлы"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> аудиофайлы"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Бейне"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> бейнесі"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Сурет"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> суреті"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Мұрағат"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> мұрағаты"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Құжат"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> құжаты"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Электрондық кесте"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> электрондық кестесі"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентация"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> презентациясы"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Жүктелуде"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index d5690b82ab38..60169b6b9dfd 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ទូរសព្ទ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ហៅទូរស័ព្ទ និងគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; គ្រប់គ្រង និង​ធ្វើការហៅទូរសព្ទ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ឧបករណ៍ចាប់សញ្ញារាងកាយ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ចូលដំណើរការទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទិន្នន័យឧបករណ៍ចាប់សញ្ញាអំពីស្ថានភាពសុខភាពរបស់អ្នក?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"តន្ត្រី"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ចូលប្រើ​តន្ត្រី​របស់អ្នក"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"អនុញ្ញាត​ឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​តន្រ្តី​របស់​អ្នក?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"រូបថត និង​វីដេអូ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ចូលប្រើ​រូបថត និង​វីដេអូ​របស់អ្នក"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"អនុញ្ញាត​ឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​រូបថត និង​វីដេអូ​របស់​អ្នក?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ទាញយក​ខ្លឹមសារ​វិនដូ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ពិនិត្យ​ខ្លឹមសារវិនដូ​ដែល​អ្នក​កំពុង​ទាក់ទង​ជា​មួយ។"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"បើក​ការ​រក​មើល​​ដោយ​ប៉ះ"</string>
@@ -510,7 +513,7 @@
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"បិទ​ការ​ចាក់​សោ​អេក្រង់​របស់​អ្នក"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ឲ្យ​កម្មវិធី​បិទ​ការ​ចាក់សោ​សុវត្ថិភាព​ពាក្យ​សម្ងាត់​ដែល​បាន​ភ្ជាប់​ណា​មួយ។ ​ឧទាហរណ៍​ត្រឹមត្រូវ​​​នៃ​ការ​បិទ​ទូរស័ព្ទ​ពេល​ទទួលការ​ហៅ​ចូល បន្ទាប់​ម​បើក​សោ​ពេល​ការ​ហៅ​បាន​បញ្ចប់។"</string>
<string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"ស្នើ​សុំកម្រិត​​ស្មុគស្មាញ​នៃការចាក់សោអេក្រង់"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"អនុញ្ញាតឱ្យ​កម្មវិធី​រៀនអំពី​កម្រិតស្មុគស្មាញ​ការនៃការចាក់សោអេក្រង់ (ខ្ពស់ មធ្យម​ ទាប ឬគ្មាន) ដែល​បញ្ជាក់អំពី​​ប្រវែង និងប្រភេទ​នៃការចាក់សោអេក្រង់។ កម្មវិធី​នេះ​ក៏​អាច​ណែនាំឱ្យ​អ្នកប្រើប្រាស់​ធ្វើបច្ចុប្បន្នភាព​ការចាក់សោ​អេក្រង់​ទៅកម្រិតជាក់លាក់​ផងដែរ ប៉ុន្តែ​អ្នកប្រើប្រាស់​អាច​មិនអើពើនឹង​ការណែនាំនេះ​ដោយសេរី។ សូម​ចំណាំថា ការចាក់សោអេក្រង់​មិន​ត្រូវបាន​រក្សាទុក​ជាអត្ថបទ​ធម្មតាទេ ដូច្នេះ​កម្មវិធីនេះ​មិន​ស្គាល់​ពាក្យសម្ងាត់​ពិតប្រាកដ​ឡើយ។"</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"អនុញ្ញាតឱ្យ​កម្មវិធី​រៀនអំពី​កម្រិតស្មុគស្មាញ​នៃការចាក់សោអេក្រង់ (ខ្ពស់ មធ្យម​ ទាប ឬគ្មាន) ដែល​បញ្ជាក់អំពី​​ចន្លោះប្រវែងដែលអាចមាន និងប្រភេទ​នៃការចាក់សោអេក្រង់។ កម្មវិធី​នេះ​ក៏​អាច​ណែនាំឱ្យ​អ្នកប្រើប្រាស់​ធ្វើបច្ចុប្បន្នភាព​ការចាក់សោ​អេក្រង់​ទៅកម្រិតជាក់លាក់​ផងដែរ ប៉ុន្តែ​អ្នកប្រើប្រាស់​អាច​មិនអើពើនឹង​ការណែនាំនេះ​ដោយសេរី។ សូម​ចំណាំថា ការចាក់សោអេក្រង់​មិន​ត្រូវបាន​រក្សាទុក​ជាអត្ថបទ​ធម្មតាទេ ដូច្នេះ​កម្មវិធីនេះ​មិន​ស្គាល់​ពាក្យសម្ងាត់​ពិតប្រាកដ​ឡើយ។"</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"ប្រើ​ឧបករណ៍​ស្កេន​ស្នាមម្រាមដៃ"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ឧបករណ៍​ស្កេន​ស្នាមម្រាមដៃ​សម្រាប់​ការផ្ទៀងផ្ទាត់"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"គ្រប់គ្រងផ្នែករឹងស្នាមម្រាមដៃ"</string>
@@ -1398,8 +1401,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ដំឡើង"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ដកចេញ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"រុករក"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"លទ្ធផល Switch"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"បាត់ <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"បញ្ចូល​ឧបករណ៍​ម្តងទៀត"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"កំពុងផ្លាស់ទី <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1613,6 +1615,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ត្រួត​គ្នា"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", សុវត្ថិភាព"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"មុខងារចាប់ផ្ដើម​សកម្មភាព​នៅផ្ទៃខាងក្រោយ​ពី <xliff:g id="PACKAGENAME">%1$s</xliff:g> នេះ​នឹងត្រូវ​ទប់ស្កាត់​នៅក្នុង​កំណែបង្កើត Q នាពេលអនាគត។ សូមមើល go/q-bg-block ។"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"បានទប់ស្កាត់​មុខងារចាប់ផ្ដើម​សកម្មភាព​នៅផ្ទៃខាងក្រោយ​ពី <xliff:g id="PACKAGENAME">%1$s</xliff:g> ។ សូមមើល go/q-bg-block ។"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លេច​​លំនាំ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំ​មិន​ត្រឹមត្រូវ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ"</string>
@@ -1998,6 +2002,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ការ​ជូនដំណឹង​ព័ត៌មាន​របស់​មុខងារ​ទម្លាប់"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ថ្ម​អាច​នឹង​អស់ មុនពេល​សាកថ្មធម្មតា"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"បាន​បើក​ដំណើរការកម្មវិធី​សន្សំ​ថ្ម ដើម្បីបង្កើនកម្រិត​ថាមពល​​ថ្ម"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ថត"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"​កម្មវិធី Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ឯកសារ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"​ឯកសារ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"សំឡេង"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"សំឡេង ​<xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"វីដេអូ​"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"វីដេអូ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"រូបភាព"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"រូបភាព <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"បណ្ណសារ​"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"បណ្ណសារ​ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ឯកសារ​"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"ឯកសារ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"បញ្ជី​"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"បញ្ជី​ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"បទ​បង្ហាញ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"បទបង្ហាញ​ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"កំពុងផ្ទុក"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other">ឯកសារ <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 4dce499a02a6..d54f7ca2bb99 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ಫೋನ್"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ದೇಹ ಸೆನ್ಸರ್‌ಗಳು"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸರ್ ಡೇಟಾವನ್ನು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ಸಂಗೀತ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ನಿಮ್ಮ ಸಂಗೀತವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ನಿಮ್ಮ ಸಂಗೀತವನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ಫೋಟೋಗಳು &amp; ವೀಡಿಯೊಗಳು"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ನಿಮ್ಮ ಫೋಟೋಗಳು &amp; ವೀಡಿಯೊಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"ನಿಮ್ಮ ಫೋಟೋಗಳು &amp; ವೀಡಿಯೊಗಳನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ಸ್ಪರ್ಶ-ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಆನ್ ಮಾಡುತ್ತದೆ"</string>
@@ -1612,6 +1615,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ಓವರ್‌ಲೇ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ಸುರಕ್ಷಿತ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"ಈ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯು <xliff:g id="PACKAGENAME">%1$s</xliff:g> ನಿಂದ ಆರಂಭವಾಗುತ್ತದೆ. ಭವಿಷ್ಯದ ಕ್ಯು ರಚನೆಗಳಲ್ಲಿ ನಿರ್ಬಂಧವಾಗುತ್ತದೆ. go/q-bg-block ನೋಡಿ."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ನಿಂದ ಆರಂಭವಾಗುತ್ತದೆ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. go/q-bg-block ನೋಡಿ."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್"</string>
@@ -1997,6 +2002,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ಚಾರ್ಜ್‌ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ಫೋಲ್ಡರ್"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ಆ್ಯಪ್‌"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ಫೈಲ್"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಫೈಲ್"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ಆಡಿಯೋ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಆಡಿಯೋ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ವೀಡಿಯೊ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ವೀಡಿಯೊ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ಚಿತ್ರ"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಚಿತ್ರ"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ಆರ್ಕೈವ್"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಆರ್ಕೈವ್"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ಡಾಕ್ಯುಮೆಂಟ್"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಡಾಕ್ಯುಮೆಂಟ್"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ಸ್ಪ್ರೆಡ್‌ಶೀಟ್"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಸ್ಪ್ರೆಡ್‌ಶೀಟ್"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ಪ್ರಸ್ತುತಿ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ಪ್ರಸ್ತುತಿ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ಲೋಡ್ ಆಗುತ್ತಿದೆ"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ಫೈಲ್‌ಗಳು</item>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 8b1ee4af33f7..b220ecafbfe2 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 전화를 걸고 관리하도록 허용하시겠습니까?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"인체 감지 센서"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 생체 신호에 관한 센서 데이터에 액세스하도록 허용하시겠습니까?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"음악"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"음악에 액세스"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 음악에 액세스하도록 허용하시겠습니까?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"사진 및 동영상"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"사진 및 동영상에 액세스"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 사진 및 동영상에 액세스하도록 허용하시겠습니까?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>번째 오버레이"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", 보안"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>의 백그라운드 활동 시작은 향후 Q 빌드에서 차단됩니다. go/q-bg-block을 참조하세요."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>의 백그라운드 활동 시작이 차단되었습니다. go/q-bg-block을 참조하세요."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"패턴을 잊음"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"잘못된 패턴"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"잘못된 비밀번호"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"루틴 모드 정보 알림"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다."</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"배터리 수명을 연장하기 위해 배터리 세이버가 활성화되었습니다."</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"폴더"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android 애플리케이션"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"파일"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> 파일"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"오디오"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> 오디오"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"동영상"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> 동영상"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"이미지"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> 이미지"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"보관 파일"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> 보관 파일"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"문서"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> 문서"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"스프레드시트"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> 스프레드시트"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"프레젠테이션"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> 프레젠테이션"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"로드 중"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> 및 파일 <xliff:g id="COUNT_3">%d</xliff:g>개</item>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 59a8b18b0cb5..1893b39dcf0a 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна телефон чалууга жана чалууларды башкарууга уруксат берилсинби?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Дене сенсорлору"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна организмдин абалына көз салган сенсордун дайындарын пайдаланууга уруксат берилсинби?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"музыкага кирүү мүмкүнчүлүгү"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна музыканы пайдаланууга уруксат берилсинби?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Сүрөттөр жана видеолор"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"сүрөттөр менен видеолорго кирүү мүмкүнчүлүгү"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна сүрөттөр менен видеолорду пайдаланууга уруксат берилсинби?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезедеги мазмунду алып турат"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Учурда ачылып турган терезедеги маалыматты талдайт."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Сыйпалап изилдөө\" мүмкүнчүлүгүн иштетет"</string>
@@ -1398,8 +1401,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Орнотуу"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Чыгаруу"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Изилдөө"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Аудио түзмөктү которуштуруу"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> табылбай жатат"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Түзмөктү кайра салыңыз"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулууда"</string>
@@ -1613,6 +1615,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Катмар №<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", корголгон"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтынын фондук режимде иштеши Q курамдарында бөгөттөлүп турат. Төмөнкүгө өтүңүз: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> сайтынын фондук режимде иштеши бөгөттөлдү. Төмөнкүгө өтүңүз: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Үлгү унутулду"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Графикалык ачкыч туура эмес"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Сырсөз туура эмес"</string>
@@ -1998,6 +2002,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Режимдин адаттагы билдирмеси"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея кубаттоого чейин отуруп калышы мүмкүн"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батареянын отуруп калбашы үчүн Батареяны үнөмдөгүч режими иштетилди"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android колдонмосу"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы файл"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы аудио файл"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы видео файл"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Сүрөт"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы сүрөт"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архив"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы архив"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы документ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Электрондук жадыбал"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы электр. жадыбал"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентация"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> форматындагы презентация"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Жүктөлүүдө"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 3f1a6ef0a739..55a5018db163 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ໂທລະສັບ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ໂທ ແລະ​ຈັດ​ການ​ການ​ໂທ​ລະ​ສັບ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ໂທ ແລະ ຈັດການການໂທບໍ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ເຊັນ​ເຊີ​ຮ່າງ​ກາຍ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ເຂົ້າ​ຫາ​ຂໍ້​ມູນ​ເຊັນ​ເຊີ​ກ່ຽວ​ກັບ​ສັນ​ຍານ​ຊີບ​ຂອງ​ທ່ານ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີກ່ຽວກັບສັນຍານຊີບຂອງທ່ານບໍ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ເພງ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ເຂົ້າເຖິງເພງຂອງທ່ານ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງເພງຂອງທ່ານບໍ?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ຮູບພາບ ແລະ ວິດີໂອ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງຮູບພາບ ແລະ ວິດີໂອຂອງທ່ານບໍ?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ດຶງຂໍ້ມູນເນື້ອຫາໃນໜ້າຈໍ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ກວດກາເນື້ອຫາຂອງໜ້າຈໍທີ່ທ່ານກຳລັງມີປະຕິສຳພັນນຳ."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ເປີດໃຊ້ \"ການສຳຫຼວດໂດຍສຳຜັດ\""</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ຕິດ​ຕັ້ງ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ເອົາອອກ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ຄົ້ນຫາ"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ສະຫຼັບການສົ່ງຂໍ້ມູນອອກ"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ຂາດ​ໄປ"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ໃສ່ອຸປະກອນອີກຄັ້ງ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"ກຳ​ລັງ​ຍ້າຍ <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ການວາງຊ້ອນ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ປອດໄພ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"ການເລີ່ມການເຄື່ອນໄຫວໃນພື້ນຫຼັງນີ້ຈາກ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ຈະຖືກບລັອກໄວ້ໃນ Q ເວີຊັນອະນາຄົດ. ກະລຸນາເບິ່ງ go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"ການເຄື່ອນໄຫວພື້ນຫຼັງເລີ່ມຈາກ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ຖືກບລັອກໄວ້ແລ້ວ. ກະລຸນາເບິ່ງ go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບແບບປົດລັອກ?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບແບບຜິດ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ການແຈ້ງເຕືອນຂໍ້ມູນໂໝດກິດຈະວັດປະຈຳວັນ"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ແບັດເຕີຣີອາດໝົດກ່ອນການສາກຕາມປົກກະຕິ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ເປີດຕົວປະຢັດແບັດເຕີຣີເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ໂຟນເດີ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"ແອັບພລິເຄຊັນ Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ໄຟລ໌"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"ໄຟລ໌ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ສຽງ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"ສຽງ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ວິດີໂອ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"ວິດີໂອ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ຮູບພາບ"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"ຮູບພາບ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ແຟ້ມຈັດເກັບ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"ແຟມຈັດເກັບ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ເອກະສານ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"ເອກະສານ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ສະເປຣດຊີດ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"ສະເປຣດຊີດ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ພຣີເຊັນເທເຊິນ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"ພຣີເຊັນເທເຊິນ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ກຳລັງໂຫລດ"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ໄຟລ໌</item>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 43995a936934..2f7673bb5a14 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefonas"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"skambinti ir tvarkyti telefonų skambučius"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Leisti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; skambinti ir tvarkyti telefono skambučius?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kūno jutikliai"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pasiekti jutiklių duomenis apie gyvybinius ženklus"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Suteikti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; galimybę pasiekti jutiklių duomenis apie gyvybinius ženklus?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"pasiekti muziką"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Suteikti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prieigą prie muzikos?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Nuotraukos ir vaizdo įrašai"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"pasiekti nuotraukas ir vaizdo įrašus"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Suteikti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prieigą prie nuotraukų ir vaizdo įrašų?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Gauti lango turinį"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Tikrinti lango, su kuriuo sąveikaujate, turinį."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Įjungti „Naršyti paliečiant“"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Nustatyti"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Pašalinti"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Naršyti"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Išvesties perjungimas"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Trūksta <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Įdėkite įrenginį dar kartą"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Perkeliama programa „<xliff:g id="NAME">%s</xliff:g>“"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Perdanga nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"„<xliff:g id="NAME">%1$s</xliff:g>“: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> tašk. colyje"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", saugu"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Šios fono veiklos paleidimas iš „<xliff:g id="PACKAGENAME">%1$s</xliff:g>“ bus užblokuotas būsimose Q versijose. Žr. go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Fono veiklos paleidimas iš „<xliff:g id="PACKAGENAME">%1$s</xliff:g>“ užblokuotas. Žr. go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pamiršau atrakinimo piešinį"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Netinkamas atrakinimo piešinys"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Netinkamas slaptažodis"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Veiksmų sekos režimo informacijos pranešimas"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumuliatoriaus energija gali išsekti prieš įprastą įkrovimą"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Akumuliatoriaus tausojimo priemonė suaktyvinta, kad akumuliatorius veiktų ilgiau"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Aplankas"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"„Android“ programa"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Failas"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> failas"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Garso įrašas"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> garso įrašas"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vaizdo įrašas"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> vaizdo įrašas"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Vaizdas"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> vaizdas"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archyvas"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> archyvas"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumentas"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokumentas"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Skaičiuoklė"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> skaičiuoklė"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Pristatymas"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> pristatymas"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Įkeliama"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one">„<xliff:g id="FILE_NAME_2">%s</xliff:g>“ ir <xliff:g id="COUNT_3">%d</xliff:g> failas</item>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 669a44844d9d..1c53ddaea7be 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Tālrunis"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"veikt un pārvaldīt tālruņa zvanus"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; veikt un pārvaldīt tālruņa zvanus?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Ķermeņa sensori"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"piekļūt sensoru datiem par jūsu veselības rādījumiem"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt sensoru uztvertajiem veselības rādījumiem?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Mūzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"Piekļūt jūsu mūzikai"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt jūsu mūzikai?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotoattēli un videoklipi"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"Piekļūt jūsu fotoattēliem un videoklipiem"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt jūsu fotoattēliem videoklipiem?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Izgūt loga saturu."</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Skatīt tā loga saturu, ar kuru mijiedarbojaties."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizēt funkciju “Pārlūkot pieskaroties”."</string>
@@ -1418,8 +1421,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Iestatīt"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izstumt"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Izpētīt"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Slēdža izeja"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Nav ierīces <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Vēlreiz pievienojiet ierīci."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Notiek lietotnes <xliff:g id="NAME">%s</xliff:g> pārvietošana"</string>
@@ -1634,6 +1636,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Pārklājums Nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", drošs"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Šīs fona darbības sākšana no pakotnes <xliff:g id="PACKAGENAME">%1$s</xliff:g> tiks bloķēta turpmākajās Q versijās. Skatiet: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Fona darbības sākšana no pakotnes <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloķēta. Skatiet: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Aizmirsu kombināciju"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nepareiza kombinācija"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nepareiza parole"</string>
@@ -2031,6 +2035,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatīvs paziņojums par akumulatoru"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulators var izlādēties pirms parastā uzlādes laika"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Aktivizēts akumulatora jaudas taupīšanas režīms, lai palielinātu akumulatora darbības ilgumu"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mape"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android lietojumprogramma"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fails"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> fails"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Attēls"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> attēls"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhīvs"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arhīvs"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokuments"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> dokuments"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Izklājlapa"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> izklājlapa"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentācija"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> prezentācija"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ielāde"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="zero"><xliff:g id="FILE_NAME_2">%s</xliff:g> un <xliff:g id="COUNT_3">%d</xliff:g> failu</item>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 24871532a83a..5447056aa96c 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упатува и управува со телефонски повици"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да повикува и да управува со телефонските повици?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"пристапува до податоците од сензорите за виталните знаци"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до податоците на сензорот за витални знаци?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"пристапува до музиката"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до музиката?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Фотографии и видеа"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"пристапува до фотографиите и видеата"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до фотографиите и видеата?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преземе содржина на прозорец"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ја следи содржината на прозорецот со кој се комуницира."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Вклучи „Истражувај со допир“"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Постави"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Извади"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Истражувај"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Сменете го излезот"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> недостасува"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Вметнете го уредот повторно"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Се преместува <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1614,6 +1616,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Прекривка #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g> : <xliff:g id="WIDTH">%2$d</xliff:g>х<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безбедно"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ова стартување активност во заднина од <xliff:g id="PACKAGENAME">%1$s</xliff:g> ќе се блокира во идните верзии на Q. Погледнете на go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Блокирано е стартување активност во заднина од <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Погледнете на go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборавив шема"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешна шема"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string>
@@ -1999,6 +2003,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Известување за информации за режимот за рутини"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батеријата може да се потроши пред вообичаеното време за полнење"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Активиран е „Штедачот на батерија“ за да се продолжи траењето на батеријата"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Апликација за Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Датотека"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-датотека"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-аудио"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-видео"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Слика"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-слика"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архива"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-архива"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-документ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Табела"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-табела"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентација"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-презентација"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Се вчитува"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 3f4c4411ae5b..0e2e7da0572b 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ഫോൺ കോളുകൾ ചെയ്യാനും അവ നിയന്ത്രിക്കാനും &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ബോഡി സെൻസറുകൾ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"നിങ്ങളുടെ ജീവധാരണ ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ ഡാറ്റ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"സംഗീതം"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"നിങ്ങളുടെ സംഗീതം ആക്‌സസ് ചെയ്യുക"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; എന്നതിനെ നിങ്ങളുടെ സംഗീതം ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കണോ?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ഫോട്ടോകളും &amp; വീഡിയോകളും"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"നിങ്ങളുടെ ഫോട്ടോകളും &amp; വീഡിയോകളും"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; എന്നതിനെ നിങ്ങളുടെ ഫോട്ടോകൾ &amp; വീഡിയോകൾ എന്നിവ ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കണോ?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"സ്‌പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക, ഓണാക്കുക"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"സജ്ജമാക്കുക"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"നിരസിക്കുക"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"അടുത്തറിയുക"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ഔട്ട്പുട്ട് മാറുക"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> കാണുന്നില്ല"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ഉപകരണത്തിലേക്ക് വീണ്ടും ഇടുക"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> നീക്കുന്നു"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ഓവർലേ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", സുരക്ഷിതമാക്കുക"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-ൽ നിന്ന് ഈ പശ്ചാത്തല പ്രവർത്തനം ആരംഭിക്കുന്നത് ഭാവി Q നിർമ്മാണങ്ങളിൽ ബ്ലോക്ക് ചെയ്യപെടും. go/q-bg-block കാണുക."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-ൽ നിന്ന് പശ്ചാത്തല പ്രവർത്തനം ആരംഭിക്കുന്നത് ബ്ലോക്ക് ചെയ്‌തു. go/q-bg-block കാണുക."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"പാറ്റേൺ മറന്നു"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"പാസ്‌വേഡ് തെറ്റാണ്"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ദിനചര്യ മോഡ് വിവരത്തെ കുറിച്ചുള്ള അറിയിപ്പ്"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"സാധാരണയുള്ളതിലും നേരത്തെ ബാറ്ററിയുടെ ചാർജ് തീർന്നേക്കാം"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ബാറ്ററി ലൈഫ് വര്‍ദ്ധിപ്പിക്കാൻ, ബാറ്ററി ലാഭിക്കൽ സജീവമാക്കി"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ഫോള്‍ഡര്‍"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ആപ്പ്"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ഫയൽ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ഫയൽ"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ഓഡിയോ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ഓഡിയോ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"വീഡിയോ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> വീഡിയോ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ഇമേജ്"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ചിത്രം"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ആർക്കൈവ്"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ആർക്കൈവ്"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"പ്രമാണം"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> പ്രമാണം"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"സ്പ്രെഡ്ഷീറ്റ്"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> സ്പ്രെഡ്ഷീറ്റ്"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"അവതരണം"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> അവതരണം"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ലോഡ് ചെയ്യുന്നു"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ഫയലുകൾ</item>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index bf668e7d9d01..cc7272d5b009 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Утас"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"утасны дуудлага хийх, дуудлага удирдах"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д утасны дуудлага хийх, дуудлагад хариулахыг зөвшөөрөх үү?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Биеийн мэдрэгч"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд нэвтрэх"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны биеийн ерөнхий байдлын үзүүлэлтүүдийн мэдрэгчийн өгөгдөлд хандахыг зөвшөөрөх үү?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Хөгжим"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"хөгжимдөө хандах"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны хөгжимд хандахыг зөвшөөрөх үү?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Зураг &amp; видео"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"зураг &amp; видеондоо хандах"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны зураг &amp; видеонд хандахыг зөвшөөрөх үү?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Цонхны агуулгыг авах"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Таны харилцан үйлчлэх цонхны контентоос шалгах."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Хүрч танихыг асаах"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Тохируулах"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Салгах"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Судлах"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Гаралтыг сэлгэх"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> байхгүй байна"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Tөхөөрөмжийг дахин оруулна уу"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>-ыг зөөж байна"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Давхарга #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", найдвартай"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-с эхлэх арын үйл ажиллагааг цаашдын Q боловсруулагдсан программд хориглоно Go/q-bg-block-г харна уу."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g>-с эхлэх арын үйл ажиллагааг хориглосон. Go/q-bg-block-г харна уу."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Хээг мартсан"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Нууц үг буруу"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Хэвшлийн горимын мэдээллийн мэдэгдэл"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарей ихэвчлэн цэнэглэдэг хугацаанаас өмнө дуусаж болзошгүй"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Батарейны ажиллах хугацааг уртасгахын тулд Батарей хэмнэгчийг идэвхжүүллээ"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Фолдер"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Андройд апп"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н файл"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н аудио"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н видео"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Зураг"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н зураг"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архив"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н архив"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н документ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Хүснэгт"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н хүснэгт"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Үзүүлэн"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-н үзүүлэн"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ачаалж байна"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 1ee3a358ed94..7f99d1131695 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कॉल आणि व्यवस्थापित"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला फोन कॉल करू आणि ते व्यवस्थापित करू द्यायचे?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"शरीर सेन्सर"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"आपल्‍या महत्त्वाच्या मापनांविषयी सेंसर डेटा अॅक्सेस करा"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमच्या महत्त्वाच्या लक्षणांविषयीचा सेन्सर डेटा अॅक्सेस करू द्यायचे?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"संगीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"तुमचे संगीत अॅक्सेस करा"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचे संगीत अॅक्सेस करू द्यायचे का?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"फोटो आणि व्हिडिओ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"तुमचे फोटो आणि व्हिडिओ अॅक्सेस करा"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचे फोटो आणि व्हिडिओ अॅक्सेस करू द्यायचे का?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विंडोमधील आशय पुन्हा मिळवा"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तुम्ही वापरत असलेल्‍या विंडोमधील आशय तपासा."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"स्पर्श करून अन्वेषण चालू करा"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"सेट करा"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"बाहेर काढा"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"एक्सप्लोर करा"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"आउटपुट स्विच करा"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> गहाळ आहे"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"डिव्हाइस पुन्हा घाला"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> हलवित आहे"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओव्हरले #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> पासून सुरुवात होणारी ही बॅकग्राउंड अॅक्टिव्हिटी भविष्यातील Q बिल्डमध्ये ब्लॉक केली जाईल. go/q-bg-block पाहा."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> वरून सुरुवात होणारी बॅकग्राउंड अॅक्टिव्हिटी ब्लॉक करण्यात आली. go/q-bg-block पाहा."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"पॅटर्न विसरलात"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा पॅटर्न"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"चुकीचा पासवर्ड"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"दिनक्रम मोडची माहिती सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"चार्जिंगची सामान्य पातळी गाठेपर्यंत कदाचित बॅटरी संपू शकते"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर सुरू केला आहे"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"फोल्डर"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android अ‍ॅप्लिकेशन"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"फाइल"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> फाइल"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ऑडिओ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ऑडिओ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"व्हिडिओ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> व्हिडिओ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"इमेज"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> इमेज"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"संग्रहित करा"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> संग्रहण"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"दस्तऐवज"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> दस्तऐवज"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"स्प्रेडशीट"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> स्प्रेडशीट"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"सादरीकरण"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> सादरीकरण"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"लोड होत आहे"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइल</item>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index ad84062abe0c..bf8172736feb 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"membuat dan mengurus panggilan telefon"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; membuat dan mengurus panggilan telefon?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Penderia Badan"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"akses data penderia tentang tanda vital anda"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses data penderia tentang tanda vital anda?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"akses muzik anda"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses muzik anda?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto &amp; Video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"akses foto &amp; video anda"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses foto &amp; video anda?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dapatkan kembali kandungan tetingkap"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Hidupkan Jelajah melalui Sentuhan"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tindih #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", selamat"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Permulaan aktiviti latar belakang daripada <xliff:g id="PACKAGENAME">%1$s</xliff:g> ini akan disekat dalam binaan Q pada masa hadapan. Lihat go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Permulaan aktiviti latar belakang daripada <xliff:g id="PACKAGENAME">%1$s</xliff:g> disekat. Lihat go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Corak"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Kata Laluan Salah"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Pemberitahuan maklumat Mod Rutin"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateri mungkin habis sebelum pengecasan biasa"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Penjimat Bateri diaktifkan untuk memanjangkan hayat bateri"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikasi Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fail"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Fail <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imej"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imej <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkib"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arkib <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumen"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokumen <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Hamparan"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Hamparan <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Pembentangan"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Pembentangan <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Memuatkan"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fail</item>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 1c0daafb8f47..b6b2f47ad682 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ဖုန်း"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ခန္ဓာကိုယ် အာရုံခံကိရိယာများ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏ အရေးကြီးသောလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"တေးဂီတ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"သင့်တေးဂီတသို့ ဝင်သည်"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင့်တေးဂီတကို ဝင်ခွင့်ပေးလိုပါသလား။"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ဓာတ်ပုံနှင့် ဗီဒီယိုများ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများသို့ ဝင်သည်"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများကို ဝင်ခွင့်ပေးလိုပါသလား။"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ဝင်းဒိုးတွင် ပါရှိသည်များကို ပြန်လည်ရယူရန်"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"သင်အသုံးပြုနေသော ဝင်းဒိုးတွင် ပါရှိသည်များကို ကြည့်ရှုစစ်ဆေးသည်။"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"တို့ထိခြင်းဖြင့် ရှာဖွေမှုကို ဖွင့်ရန်"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"စဖွင့်သတ်မှတ်"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ထုတ်မည်"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"စူးစမ်းရန်"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"မီဒီယာအထွက် ပြောင်းရန်"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ပျောက်နေသည်"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"စက်ပစ္စည်းကို ထပ်မံထည့်သွင်းပါ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ရွှေ့နေစဉ်"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"အပေါ်မှ ထပ်သောအရာ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", လုံခြုံသော"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> မှစတင်သော ဤနောက်ခံလုပ်ဆောင်ချက်ကို အနာဂတ် Q တည်ဆောက်ပုံများတွင် ပိတ်ထားပါမည်။ go/q-bg-block ကိုကြည့်ပါ။"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> မှစတင်သော နောက်ခံလုပ်ဆောင်ချက်ကို ပိတ်ထားသည်။ go/q-bg-block ကိုကြည့်ပါ။"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ပုံဖော်မှုအား မေ့လျော့ခြင်း"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ပုံဆွဲအမှား"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"စကားဝှက်အမှား"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ပုံမှန်မုဒ်အတွက် အချက်အလက်ပြသည့် အကြောင်းကြားချက်"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ပုံမှန်အားသွင်းမှုမပြုလုပ်မီ ဘက်ထရီကုန်သွားနိုင်သည်"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ဘက်ထရီသက်တမ်းကို တိုးမြှင့်ရန် \'ဘက်ထရီအားထိန်း\' စတင်ပြီးပါပြီ"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ဖိုင်တွဲ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android အပလီကေးရှင်း"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ဖိုင်"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ဖိုင်"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"အသံ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> အသံ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ဗီဒီယို"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ဗီဒီယို"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ပုံ"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ပုံ"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"မှတ်တမ်း"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> မှတ်တမ်း"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"စာရွက်စာတမ်း"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> စာရွက်စာတမ်း"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"တင်ပြမှု"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> တင်ပြမှု"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"တင်နေသည်"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ဖိုင်</item>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3a2aed74d74d..add20ef9f47c 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ring og administrer anrop"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vil du la &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ringe og administrere telefonsamtaler?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få tilgang til sensordata om de vitale tegnene dine"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til sensordata om de vitale tegnene dine?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musikk"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"få tilgang til musikken din"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til musikken din?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Bilder og videoer"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"få tilgang til bildene og videoene dine"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til bildene og videoene dine?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"hente innhold i vinduer"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Appen analyserer innholdet i vinduer du samhandler med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"slå på berøringsutforsking"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Løs ut"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Utforsk"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Bytt utenhet"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mangler"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Sett inn enheten på nytt"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlegg #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", sikker"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Denne bakgrunnsaktiviteten som starter fra <xliff:g id="PACKAGENAME">%1$s</xliff:g>, blir blokkert i fremtidige Q-delversjoner. Se go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Bakgrunnsaktivitet som starter fra <xliff:g id="PACKAGENAME">%1$s</xliff:g>, er blokkert. Se go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glemt mønsteret?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Feil mønster"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Feil passord"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Varsel med informasjon om rutinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan gå tomt før den vanlige ladingen"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparing er aktivert for å forlenge batterilevetiden"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mappe"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-fil"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Lyd"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-lyd"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Bilde"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-bilde"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arkiv"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Regneark"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-regneark"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentasjon"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentasjon"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laster inn"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 40a0c12ef98f..156a3e587c3e 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई फोन कलहरू गर्न र तिनीहरूको व्यवस्थापन गर्न दिने हो?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्ना महत्त्वपूर्ण लक्षणहरूसम्बन्धी सेन्सर डेटामाथि पहुँच राख्न दिने हो?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"सङ्गीत"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"आफ्नो सङ्गीतमाथि पहुँच राख्नुहोस्‌"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई तपाईंको सङ्गीतमाथि पहुँच राख्न दिने हो?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"तस्बिर तथा भिडियोहरू"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"आफ्नो तस्बिर &amp; भिडियोहरूमाथि पहुँच राख्नुहोस्‌"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्नो तस्बिर तथा भिडियोहरूमाथि पहुँच राख्न दिने हो?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -1402,8 +1405,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"सेटअप गर्नुहोस्"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"निकाल्नुहोस्"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"अन्वेषण गर्नुहोस्"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"आउटपुट बदल्नुहोस्"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> हराइरहेको"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"यन्त्र फेरि घुसाउनुहोस्"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> सार्दै"</string>
@@ -1617,6 +1619,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"आवरण #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", सुरक्षित"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"यो पृष्ठभूमिमा चल्ने क्रियाकलापलाई <xliff:g id="PACKAGENAME">%1$s</xliff:g> बाट भविष्यका Q build हरूमा रोक लगाइने छ। go/q-bg-block हेर्नुहोस्।"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"यो पृष्ठभूमिमा चल्ने क्रियाकलापलाई<xliff:g id="PACKAGENAME">%1$s</xliff:g> माथि रोक लगाएपछि सुरु गरिन्छ। go/q-bg-block हेर्नुहोस्।"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाँचा बिर्सनु भयो"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाँचा"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string>
@@ -2002,6 +2006,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"फोल्डर"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android अनुप्रयोग"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"फाइल"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> फाइल"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"अडियो"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> अडियो"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"भिडियो"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> भिडियो"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"छवि"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> छवि"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"अभिलेख"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> अभिलेख"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"कागजात"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> कागजात"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"स्प्रेडसिट"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> स्प्रेडसिट"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"प्रस्तुति"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> प्रस्तुति"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"लोड गर्दै"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> फाइलहरू</item>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index ddc378151553..7d9e90a928c0 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefoneren en gesprekken beheren"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om telefoongesprekken te starten en te beheren?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Lichaamssensoren"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"toegang krijgen tot sensorgegevens over je vitale functies"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot sensorgegevens over je vitale functies?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muziek"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"toegang tot je muziek"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je muziek?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foto\'s en video\'s"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"toegang tot je foto\'s en video\'s"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Wil je &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je foto\'s en video\'s?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Content van vensters ophalen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"De content inspecteren van een venster waarmee je interactie hebt."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'Verkennen via aanraking\' inschakelen"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configureren"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Uitwerpen"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Verkennen"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Uitvoer wijzigen"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ontbreekt"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Voer apparaat opnieuw in"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> verplaatsen"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", beveiligd"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Het starten van deze achtergrondactiviteit voor <xliff:g id="PACKAGENAME">%1$s</xliff:g> wordt geblokkeerd in toekomstige Q-builds. Zie go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Starten van achtergrondactiviteit voor <xliff:g id="PACKAGENAME">%1$s</xliff:g> is geblokkeerd. Zie go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patroon vergeten"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Onjuist patroon"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Onjuist wachtwoord"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Informatiemelding voor routinemodus"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"De batterij raakt mogelijk leeg voordat deze normaal gesproken wordt opgeladen"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterijbesparing is geactiveerd om de batterijduur te verlengen"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Map"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Bestand"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-bestand"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Afbeelding"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-afbeelding"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archief"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-archief"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-document"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentatie"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentatie"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Laden"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> bestanden</item>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 1724aea6e11e..3a29712b0d9a 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ଫୋନ୍‍"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ଫୋନ୍‍ କଲ୍‍ କରେ ଏବଂ ପରିଚାଳନା କରେ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଫୋନ୍‍ କଲ୍‍ କରିବାକୁ ତଥା ପରିଚାଳନା କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ବଡୀ ସେନ୍ସର୍"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ଆପଣଙ୍କ ଗୁରୁତପୂର୍ଣ୍ଣ ସଂକେତଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍‍ ଡାଟା ଆକ୍ସେସ୍‍ କରେ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଆପଣଙ୍କ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଲକ୍ଷଣଗୁଡ଼ିକ ବିଷୟରେ ସେନ୍ସର୍‍ ଡାଟା ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ସଙ୍ଗୀତ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ଆପଣଙ୍କ ସଙ୍ଗୀତ ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ଆପଣଙ୍କ ସଙ୍ଗୀତକୁ ଆକ୍ସେସ୍‍ କରିବାକୁ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଅନୁମତି ଦେବେ କି?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ଫଟୋ ଏବଂ ଭିଡିଓ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓ ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"ଆପଣଙ୍କ ଫଟୋ ଏବଂ ଭିଡିଓକୁ Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ଆକ୍ସେସ୍‍ କରିବାକୁ ଅନୁମତି ଦେବେ କି?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ୱିଣ୍ଡୋ କଣ୍ଟେଣ୍ଟ ହାସଲ କରନ୍ତୁ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ଆପଣ କାମ କରୁଥିବା ୱିଣ୍ଡୋର କଣ୍ଟେଣ୍ଟକୁ ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ସ୍ପର୍ଶ ଦ୍ୱାରା ଏକ୍ସପ୍ଲୋର୍‍ ଅନ୍‍ କରନ୍ତୁ"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ବାହାର କରନ୍ତୁ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ଖୋଜନ୍ତୁ"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ଆଉଟ୍‌ପୁଟ୍ ସ୍ୱିଚ୍‌ କରନ୍ତୁ"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ନାହିଁ"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ଡିଭାଇସ୍‌କୁ ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ନିଆଯାଉଛି"</string>
@@ -1612,6 +1614,10 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ପ୍ରାୟତଃ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ସୁରକ୍ଷିତ"</string>
+ <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
+ <skip />
+ <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
+ <skip />
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ଭୁଲ ପାଟର୍ନ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
@@ -1997,6 +2003,42 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ନିୟମିତ ମୋଡ୍‍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍‍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string>
+ <!-- no translation found for mime_type_folder (7111951698626315204) -->
+ <skip />
+ <!-- no translation found for mime_type_apk (5518003630972506900) -->
+ <skip />
+ <!-- no translation found for mime_type_generic (6833871596845900027) -->
+ <skip />
+ <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
+ <skip />
+ <!-- no translation found for mime_type_audio (6289777657172050926) -->
+ <skip />
+ <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
+ <skip />
+ <!-- no translation found for mime_type_video (4093025777317307426) -->
+ <skip />
+ <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
+ <skip />
+ <!-- no translation found for mime_type_image (3144284451605236371) -->
+ <skip />
+ <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed (1645486037074943257) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
+ <skip />
+ <!-- no translation found for mime_type_document (1596838147256375966) -->
+ <skip />
+ <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation (6145604688774787357) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
+ <skip />
<string name="car_loading_profile" msgid="3545132581795684027">"ଲୋଡ୍ ହେଉଛି"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g>ଟି ଫାଇଲ୍</item>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index decb624f1680..6c1837c281cf 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ਫ਼ੋਨ ਕਰੋ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੇਣਾ ਹੈ?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ਸਰੀਰ ਸੰਵੇਦਕ"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਲੱਛਣਾਂ ਸੰਬੰਧੀ ਸੈਂਸਰ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"ਸੰਗੀਤ"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ਤੁਹਾਡੇ ਸੰਗੀਤ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਸੰਗੀਤ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਉਸ ਵਿੰਡੋ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਅੰਤਰਕਿਰਿਆ ਕਰ ਰਹੇ ਹੋ"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\'ਸਪੱਰਸ਼ ਰਾਹੀਂ ਪੜਚੋਲ ਕਰੋ\' ਚਾਲੂ ਕਰਨਾ"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ਬਾਹਰ ਕੱਢੋ"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ਐਕਸਪਲੋਰ ਕਰੋ"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ਆਊਟਪੁੱਟ ਬਦਲੋ"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ਲਾਪਤਾ"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ਦੁਬਾਰਾ ਡੀਵਾਈਸ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ਓਵਰਲੇ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ਸੁਰੱਖਿਅਤ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"ਇਹ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ <xliff:g id="PACKAGENAME">%1$s</xliff:g> ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਭਵਿੱਖ ਦੇ Q ਬਿਲਡ ਵਿੱਚ ਬਲਾਕ ਕੀਤੀ ਜਾਵੇਗੀ। go/q-bg-block ਦੇਖੋ।"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> ਬਲਾਕ ਕਰਕੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ ਸ਼ੁਰੂ ਕੀਤੀ ਗਈ। go/q-bg-block ਦੇਖੋ।"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ਗ਼ਲਤ ਪੈਟਰਨ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ਗਲਤ ਪਾਸਵਰਡ"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ਫੋਲਡਰ"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ਐਪਲੀਕੇਸ਼ਨ"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ਫ਼ਾਈਲ"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਫ਼ਾਈਲ"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ਆਡੀਓ"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਆਡੀਓ"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ਵੀਡੀਓ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਵੀਡੀਓ"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ਚਿੱਤਰ"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਚਿੱਤਰ"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ਪੁਰਾਲੇਖਬੱਧ ਕਰੋ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਪੁਰਾਲੇਖਬੱਧ ਕਰੋ"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ਦਸਤਾਵੇਜ਼"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਦਸਤਾਵੇਜ਼"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"ਸਪਰੈੱਡਸ਼ੀਟ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਸਪਰੈੱਡਸ਼ੀਟ"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ਪੇਸ਼ਕਾਰੀ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ਪੇਸ਼ਕਾਰੀ"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ਫ਼ਾਈਲ</item>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 3e3ee3ce490d..dc4fa9762d08 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -314,15 +314,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"nawiązywanie połączeń telefonicznych i zarządzanie nimi"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na wykonywanie połączeń telefonicznych i zarządzanie nimi?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Czujniki na ciele"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Czujniki na ciele"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostęp do danych czujnika podstawowych funkcji życiowych"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do danych z czujnika podstawowych funkcji życiowych?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzyka"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"dostęp do muzyki"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do muzyki?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Zdjęcia i filmy"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Zdjęcia i filmy"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"dostęp do zdjęć i filmów"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do zdjęć i filmów?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Zezwolić aplikacji „<xliff:g id="APP_NAME">%1$s</xliff:g>” na dostęp do Twoich zdjęć i filmów, w tym do otagowanych lokalizacji?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pobieranie zawartości okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Sprawdzanie zawartości okna, z którego korzystasz."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Włączenie czytania dotykiem"</string>
@@ -1440,8 +1440,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Skonfiguruj"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odłącz"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Przeglądaj"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Przełącz urządzenie wyjściowe"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Brak: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Włóż nośnik ponownie"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Przenoszę <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1656,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Nakładka nr <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", bezpieczny"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Rozpoczęcie tej aktywności w tle przez pakiet <xliff:g id="PACKAGENAME">%1$s</xliff:g> zostanie zablokowane w przyszłych kompilacjach Q. Więcej informacji: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Rozpoczęcie aktywności w tle przez pakiet <xliff:g id="PACKAGENAME">%1$s</xliff:g> zostało zablokowane. Więcej informacji: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nie pamiętam wzoru"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nieprawidłowy wzór"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nieprawidłowe hasło"</string>
@@ -2066,6 +2067,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Powiadomienie z informacją o trybie rutynowym"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria może się wyczerpać przed zwykłą porą ładowania"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Włączono Oszczędzanie baterii, by wydłużyć czas pracy na baterii"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikacja na Androida"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Plik"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Plik <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Plik audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Plik audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Plik wideo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Plik wideo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Obraz"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Grafika <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archiwum"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archiwum <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Arkusz kalkulacyjny"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Arkusz kalkulacyjny <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentacja"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Prezentacja <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Ładuję"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> pliki</item>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c51a06e2b497..c8f114d40dff 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; gerencie e faça chamadas telefônicas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse os dados do sensor sobre seus sinais vitais?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Músicas"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acessar suas músicas"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse suas músicas?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos e vídeos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acessar suas fotos e seus vídeos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse suas fotos e seus vídeos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse seus vídeos e fotos, incluindo os locais marcados?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Acessar conteúdo de uma janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspeciona o conteúdo de uma janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Alterar saída"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ausente"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insira o dispositivo novamente"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Movendo <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição nº <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Esse início de atividade em segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado nas versões futuras do Android Q. Consulte go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"O início da atividade em segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> foi bloqueado. Consulte go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Pasta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicativo Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Arquivo"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Arquivo em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Áudio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Áudio em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagem"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagem <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arquivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arquivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Planilha"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Planilha em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Apresentação"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Carregando"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index a68b86561c7e..cafcd8b59926 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telemóvel"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fazer e gerir chamadas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; faça e gira chamadas telefónicas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores de corpo"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores de corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aceder a dados do sensor acerca dos seus sinais vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos dados do sensor acerca dos seus sinais vitais?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"aceder à sua música"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda à sua música?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos e vídeos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"aceder aos seus vídeos e fotos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda às suas fotos e vídeos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda aos seus vídeos e fotos, incluindo localizações etiquetadas?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Obter conteúdo da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo de uma janela com a qual está a interagir."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar Através do Toque"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Saída do interruptor"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> em falta"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Volte a inserir o dispositivo."</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"A mover <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppp"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", protegido"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Este início da atividade em segundo plano do pacote <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado em compilações Q futuras. Aceda a go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Início da atividade em segundo plano do pacote <xliff:g id="PACKAGENAME">%1$s</xliff:g> bloqueado. Aceda a go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueceu-se da Sequência"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequência Incorreta"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Palavra-passe Incorreta"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informações do Modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pode ficar sem bateria antes do carregamento habitual"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Poupança de bateria ativada para prolongar a duração da bateria"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Pasta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicação para Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Ficheiro"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Ficheiro <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Áudio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Áudio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagem"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagem <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arquivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arquivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Folha de cálculo"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Folha de cálculo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Apresentação"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Apresentação <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"A carregar…"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ficheiros</item>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c51a06e2b497..c8f114d40dff 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -308,15 +308,15 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faça e gerencie chamadas telefônicas"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; gerencie e faça chamadas telefônicas?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
+ <string name="permgrouplab_sensors" msgid="4838614103153567532">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acesse dados do sensor sobre seus sinais vitais"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse os dados do sensor sobre seus sinais vitais?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Músicas"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"acessar suas músicas"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse suas músicas?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotos e vídeos"</string>
+ <string name="permgrouplab_visual" msgid="6477382108771145134">"Fotos e vídeos"</string>
<string name="permgroupdesc_visual" msgid="3415827902566663546">"acessar suas fotos e seus vídeos"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse suas fotos e seus vídeos?"</string>
+ <string name="permgrouprequest_visual" msgid="3043752127595243314">"Permitir que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse seus vídeos e fotos, incluindo os locais marcados?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Acessar conteúdo de uma janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspeciona o conteúdo de uma janela com a qual você está interagindo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
@@ -1396,8 +1396,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ejetar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Alterar saída"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ausente"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Insira o dispositivo novamente"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Movendo <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1610,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição nº <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", seguro"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Esse início de atividade em segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> será bloqueado nas versões futuras do Android Q. Consulte go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"O início da atividade em segundo plano de <xliff:g id="PACKAGENAME">%1$s</xliff:g> foi bloqueado. Consulte go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string>
@@ -1996,6 +1997,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificação de informação do modo rotina"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"A bateria pode acabar antes da recarga normal"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"A \"Economia de bateria\" foi ativada para aumentar a duração da carga"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Pasta"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicativo Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Arquivo"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Arquivo em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Áudio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Áudio em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Vídeo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Vídeo em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagem"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagem <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arquivo"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arquivo <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Documento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Documento em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Planilha"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Planilha em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Apresentação"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Apresentação em <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Carregando"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> arquivo</item>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 61bc9b8413d9..843f00548c02 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"inițieze și să gestioneze apeluri telefonice"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să inițieze și să gestioneze apeluri telefonice?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori corporali"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceseze datele de la senzori despre semnele vitale"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele dvs. vitale?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzică"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"accesați muzica"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze muzica?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotografii și videoclipuri"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"accesați fotografiile și videoclipurile"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze fotografiile și videoclipurile?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Analizează conținutul ferestrei"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Activează funcția Explorați prin atingere"</string>
@@ -1418,8 +1421,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Configurați"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Scoateți"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Explorați"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Schimbați ieșirea"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> lipsește"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Reintroduceți dispozitivul"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Se mută <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1634,6 +1636,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Suprapunerea <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", securizat"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Începerea activității în fundal de la <xliff:g id="PACKAGENAME">%1$s</xliff:g> va fi blocată în versiunile Q viitoare. Consultați go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Începerea activității din fundal de la <xliff:g id="PACKAGENAME">%1$s</xliff:g> este blocată. Consultați go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Model uitat"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greșit"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Parolă greșită"</string>
@@ -2031,6 +2035,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notificare pentru informații despre modul Rutină"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria se poate descărca înainte de încărcarea obișnuită"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Economisirea bateriei este activată pentru a prelungi durata de funcționare a bateriei"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Dosar"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplicație Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fișier"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Fișier <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Videoclip"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Videoclip <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imagine"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imagine <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhivă"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arhivă <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Document"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Document <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Foaie de calcul"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Foaie de calcul <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentare"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Prezentare <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Se încarcă"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fișiere</item>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 6931e260db7b..e4e75357eb14 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"осуществлять вызовы и управлять ими"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; совершать звонки и управлять ими?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Нательные датчики"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"доступ к данным датчиков о состоянии организма"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к данным датчиков о состоянии организма?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музыка"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ к музыке"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к музыке?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Фото и видео"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ к фото и видео"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к фото и видео?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Включать Изучение касанием"</string>
@@ -1657,6 +1660,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наложение № <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> х <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> тчк/дюйм"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безопасный"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Действия приложения \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" в фоновом режиме будут блокироваться в последующих сборках Android Q. Подробнее: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Действие приложения \"<xliff:g id="PACKAGENAME">%1$s</xliff:g>\" в фоновом режиме заблокировано. Подробнее: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забыли графический ключ?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильный графический ключ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Неправильный пароль"</string>
@@ -2066,6 +2071,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Уведомление о батарее"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батарея может разрядиться"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Чтобы увеличить время работы от батареи, был включен режим энергосбережения."</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Приложение Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Файл <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Аудиофайл <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Видео <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Изображение"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Изображение <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архив"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Архив <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Документ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Таблица"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Таблица <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентация"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Презентация <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Загрузка"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one">\"<xliff:g id="FILE_NAME_2">%s</xliff:g>\" и ещё <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index f98ec7d91e3d..ad15ff37fe8e 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"දුරකථනය"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"දුරකථන ඇමතුම් සිදු කිරීම සහ කළමනාකරණය කිරීම"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත දුරකථන ඇමතුම් ලබා ගැනීමට සහ කළමනාකරණය කිරීමට ඉඩ දෙන්නද?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"ශරීර සංවේදක"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ඔබේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත ප්‍රවේශ වීමට ඉඩ දෙන්නද?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"සංගීතය"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"ඔබේ සංගීතයට පිවිසෙන්න"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; හට ඔබගේ දින දර්ශනය වෙත පිවිසීමට ඉඩ දෙන්නද?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ඡායාරූප සහ වීඩියෝ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"ඔබගේ ඡායාරූප සහ වීඩියෝ වෙත පිවිසෙන්න"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; හට ඔබගේ ඡායාරූප වෙත පිවිසීමට ඉඩ දෙන්නද?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබාගන්න"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්‍රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ස්පර්ශයෙන් ගවේෂණය සක්‍රිය කරන්න"</string>
@@ -1398,8 +1401,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"පිහිටුවන්න"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"ගැලවීම"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"ගවේෂණය කරන්න"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"ප්‍රතිදාන මාරු කරන්න"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> අස්ථානගතයි"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"නැවත උපාංගය ඇතුළු කරන්න"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ගෙන යමින්"</string>
@@ -1613,6 +1615,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"උඩැතිරිය #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ආරක්‍ෂිත"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> සිට පසුබිම් ක්‍රියාකාරකම අනාගත Q නිමැවුම්වල අවහිර කෙරේ. go/q-bg-block බලන්න."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> සිට පසුබිම් ක්‍රියාකාරකම අවහිර කර ඇත. go/q-bg-block බලන්න."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටාව අමතකයි"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"වැරදි රටාවකි"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"වැරදි මුරපදය"</string>
@@ -1998,6 +2002,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"දිනචරියා ප්‍රකාර තතු දැනුම්දීම"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"බැටරිය සුපුරුදු ආරෝපණයට පෙර ඉවර විය හැක"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"බැටරි සුරැකුම බැටරි ආයු කාලය දීර්ඝ කිරීමට සක්‍රිය කෙරිණි"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ෆෝල්ඩරය"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android යෙදුම"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ගොනුව"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ගොනුව"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ශ්‍රව්‍ය"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"ශ්‍රව්‍ය <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"වීඩියෝව"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> වීඩියෝව"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"රූපය"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> රූපය"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"සංරක්‍ෂණය"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> සංරක්‍ෂණ කරන්න"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ලේඛනය"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> ලේඛනය"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"පැතුරුම්පත"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> පැතුරුම්පත"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ඉදිරිපත් කිරීම"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ඉදිරිපත් කිරීම"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"පූරණය කරමින්"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one">ගොනු<xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 9a392cb32256..462a9e935be6 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefón"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonovanie a správu hovorov"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uskutočňovať a spravovať telefonické hovory?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Telesné senzory"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"prístup k dátam senzorov vašich životných funkcií"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; používať údaje senzorov o vašich životných funkciách?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Hudba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"prístup k hudbe"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Chcete povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k hudbe?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotky a videá"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"prístup k fotkám a videám"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Chcete povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k fotkám a videám?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítať obsah okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Môžete preskúmať obsah okna, s ktorým pracujete."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Zapnúť funkciu Preskúmanie dotykom"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastaviť"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Odpojiť"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Preskúmať"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Prepnúť výstup"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Chýba: <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Zariadenie vložte znova"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Presúva sa aplikácia <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrytie č. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", zabezpečené"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Toto spustenie aktivity na pozadí v režime <xliff:g id="PACKAGENAME">%1$s</xliff:g> bude blokované v budúcich zostavách Q. Prejdite na go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Spustenie aktivity na pozadí v režime <xliff:g id="PACKAGENAME">%1$s</xliff:g> je blokované. Prejdite na go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nepamätám si vzor"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávny vzor"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávne heslo"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Upozornenie s informáciami o rutinnom režime"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batéria sa môže vybiť pred obvyklým nabitím"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Bol aktivovaný šetrič batérie na predĺženie výdrže batérie"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Priečinok"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikácia pre Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Súbor"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Súbor <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Zvuk"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Zvuk <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Obrázok"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Obrázok <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archív"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Archív <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Tabuľka"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Tabuľka <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezentácia"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Prezentácia <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Načítava sa"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="few"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> súbory</item>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index cdd9ed8d5f1a..8157635ff021 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"opravljanje in upravljanje telefonskih klicev"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti opravljanje in upravljanje telefonskih klicev?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Tipala telesnih funkcij"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"dostop do podatkov tipala o vaših vitalnih znakih"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do podatkov tipala o vitalnih znakih?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Glasba"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"dostop do glasbe"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do glasbe?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotografije in videoposnetki"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"dostop do fotografij in videoposnetkov"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do fotografij in videoposnetkov?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pridobiti vsebino okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Preverjanje vsebine okna, ki ga uporabljate."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vklopiti raziskovanje z dotikom"</string>
@@ -1440,8 +1443,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Nastavi"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izvrzite"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Raziščite"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Preklopite izhod"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Ni shrambe <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Znova vstavite napravo"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Premikanje aplikacije <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1657,6 +1659,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrivanje #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> pik na palec"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", varen"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ta zagon dejavnosti v ozadju za paket <xliff:g id="PACKAGENAME">%1$s</xliff:g> bo blokiran v prihodnjih različicah Androida Q. Obiščite go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Zagon dejavnosti v ozadju za paket <xliff:g id="PACKAGENAME">%1$s</xliff:g> je bil blokiran. Obiščite go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pozabljen vzorec"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Napačen vzorec"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Napačno geslo"</string>
@@ -2066,6 +2070,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutinsko informativno obvestilo o načinu delovanja"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Akumulator se bo morda izpraznil, preden ga običajno priključite na polnjenje"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Vklopilo se je varčevanje z energijo akumulatorja za podaljšanje časa delovanja akumulatorja"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mapa"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikacija za Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Datoteka"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Datoteka <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Zvočna datoteka"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Zvočna datoteka <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Videoposnetek"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Videoposnetek <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Slika"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Slika <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arhiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arhivska datoteka <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Preglednica"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Preglednica <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Predstavitev"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Predstavitev <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Nalaganje"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> in še <xliff:g id="COUNT_3">%d</xliff:g> datoteka</item>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 1474dfcf46e0..0feeffa1733a 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"kryej dhe menaxho telefonata"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të kryejë dhe të menaxhojë telefonata?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensorët e trupit"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"qasu tek të dhënat e sensorëve rreth shenjave të tua jetësore"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te të dhënat e sensorëve rreth shenjave të tua jetësore?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muzika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"qasu te muzika jote"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te muzika jote?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotografitë dhe videot"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"qasu te fotografitë dhe videot e tua"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te fotografitë dhe videot e tua?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Nxjerrë përmbajtjen e dritares"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspekton përmbajtjen e dritares me të cilën po ndërvepron."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivizojë funksionin \"Eksploro me prekje\""</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguro"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Nxirr"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Eksploro"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Ndrysho daljen"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mungon"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Fut përsëri pajisjen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Po zhvendos <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Mbivendosja #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> ppi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", i sigurt"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Kjo nisje e aktivitetit në sfond nga <xliff:g id="PACKAGENAME">%1$s</xliff:g> do të bllokohet në ndërtimet e ardhshme të Q. Shiko në go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Nisja e aktivitetit në sfond nga <xliff:g id="PACKAGENAME">%1$s</xliff:g> u bllokua. Shiko në go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Harrova motivin"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Motivi është i gabuar"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Fjalëkalim i gabuar"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"\"Kursyesi i baterisë\" u aktivizua për të zgjatur jetëgjatësinë e baterisë"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Dosje"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Aplikacion i Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Skedar"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Skedar <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Audio <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Imazh"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Imazh <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Arkiv <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Dokument <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Fletëllogaritëse"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Fletëllogaritëse <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Prezantim"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Prezantim <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Po ngarkohet"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> skedarë</item>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index ef28488c9e69..e7b6b22bb91c 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -311,15 +311,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упућује телефонске позиве и управља њима"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; упућује позиве и управља њима?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Сензори за тело"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"приступа подацима сензора о виталним функцијама"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;приступа подацима сензора о виталним функцијама?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"приступ музици"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа музици?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Слике и видео снимци"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"приступ сликама и видео снимцима"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа сликама и видео снимцима?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"да преузима садржај прозора"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"да укључи Истраживања додиром"</string>
@@ -1418,8 +1421,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Активирај"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Избаци"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Истражи"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Промените излаз"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> недостаје"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Поново уметните уређај"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Преноси се <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1634,6 +1636,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Постављени елемент бр. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>×<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безбедно"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Ово покретање активности у позадини са <xliff:g id="PACKAGENAME">%1$s</xliff:g> биће блокирано у будућим Q верзијама. Погледајте go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Покретање активности у позадини са <xliff:g id="PACKAGENAME">%1$s</xliff:g> је блокирано. Погледајте go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборављени шаблон"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string>
@@ -2031,6 +2035,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Обавештење о информацијама Рутинског режима"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Батерија ће се можда испразнити пре уобичајеног пуњења"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Уштеда батерије је активирана да би се продужило трајање батерије"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Директоријум"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android апликација"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Датотека"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> датотека"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудио датотека"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> аудио датотека"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Видео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> видео"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Слика"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> слика"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архива"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> архива"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> документ"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Табела"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> табела"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентација"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> презентација"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Учитава се"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> и још <xliff:g id="COUNT_3">%d</xliff:g> датотека</item>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index df9a5c6f58f8..698b342e45f3 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ringa och hantera telefonsamtal"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; behörighet att ringa och hantera telefonsamtal?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få åtkomst till sensordata om dina vitalparametrar"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till sensordata om vitalparametrar?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"åtkomstbehörighet till din musik"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till din musik?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Foton och videor"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"åtkomstbehörighet till dina foton &amp; videor"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till dina foton och videor?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hämta fönsterinnehåll"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by touch"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurera"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Mata ut"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Utforska"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Utdata som styrs med reglaget"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> saknas"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Sätt i enheten igen"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flyttar <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Överlagring #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", säker"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Denna start bakgrundsaktivitet från <xliff:g id="PACKAGENAME">%1$s</xliff:g> blockeras i framtida Q-versioner. Besök go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Start av bakgrundsaktivitet från <xliff:g id="PACKAGENAME">%1$s</xliff:g> blockerades. Besök go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glömt ditt grafiska lösenord?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Fel grafiskt lösenord"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Fel lösenord"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Avisering om rutinläge"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batteriet kan ta slut innan du brukar ladda det"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batterisparläget har aktiverats för att utöka batteritiden"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Mapp"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android-app"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fil"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g>-fil"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Ljud"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g>-ljud"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g>-video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Bild"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g>-bild"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arkiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g>-arkiv"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokument"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g>-dokument"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Kalkylark"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g>-kalkylark"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g>-presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Läser in"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> filer</item>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index ae0acd562363..db56058d8ea6 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Simu"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ipige na kudhibiti simu?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Vihisi vya Mwili"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Muziki"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"kufikia muziki wako"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie muziki wako?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Picha na Video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"kufikia picha na video zako"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Ungependa kuruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie picha na video zako?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kufikia maudhui ya dirisha"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kuchunguza maudhui ya dirisha unalotumia."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Kuwasha \'Chunguza kwa Kugusa\'"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Weka mipangilio"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Ondoa"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Chunguza"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Badilisha kifaa cha kutoa maudhui"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> haipo"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Weka kifaa tena"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Inahamisha <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Uwekeleaji #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", salama"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Itazuia shughuli hii ya chinichini inayoanzia <xliff:g id="PACKAGENAME">%1$s</xliff:g> katika miundo ya baadaye ya Q. Angalia go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Imezuia shughuli za chinichini zinazoanzia <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Angalia go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Umesahau Ruwaza"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Mchoro huo si sahihi"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Nenosiri Lisilo sahihi"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Arifa ya maelezo ya Hali ya Kawaida"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Huenda betri itakwisha chaji mapema"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Imewasha Kiokoa Betri ili kurefusha muda wa matumizi ya betri"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folda"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Programu ya Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Faili"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Faili ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Faili ya sauti"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Faili ya sauti ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Picha"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Picha ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Kumbukumbu"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Faili ya kumbukumbu ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Hati"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Hati ya <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Lahajedwali"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Lahajedwali la <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Wasilisho"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Wasilisho la <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Inapakia"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other">Faili <xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g></item>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 5d0ab3449018..2c3e5d71c516 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ஃபோன்"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"யாரையும் தொலைபேசியில் அழைக்கலாம்"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"மொபைல் அழைப்புகள் செய்யவும், அவற்றை நிர்வகிக்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் சென்சார்கள்"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"உங்கள் உடலியக்கக் குறிகள் பற்றிய சென்சார் தரவை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"இசை"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"இசையைக் கேட்கலாம்"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"இசையை அணுக &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"படங்கள் &amp; வீடியோக்கள்"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"படங்கள் &amp; வீடியோக்களைப் பார்க்கலாம்"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"படங்கள் &amp; வீடியோக்களை அணுக &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"சாளர உள்ளடக்கத்தைப் பெறும்"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"நீங்கள் பணியாற்றிக் கொண்டிருக்கும் சாளரத்தின் உள்ளடக்கத்தைப் பார்க்கலாம்."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"தொடுவதன் மூலம் அறிவதை இயக்கும்"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"அமை"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"வெளியேற்று"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"உலாவுக"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"வெளியீட்டை மாற்று"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> இல்லை"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"மீண்டும் சாதனத்தைச் செருகவும்"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ஐ நகர்த்துகிறது"</string>
@@ -1612,6 +1614,10 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"மேலோட்ட #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", பாதுகாப்பானது"</string>
+ <!-- no translation found for activity_starter_block_bg_activity_starts_permissive (5692097903712956720) -->
+ <skip />
+ <!-- no translation found for activity_starter_block_bg_activity_starts_enforcing (8299522481076404353) -->
+ <skip />
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"வடிவத்தை மறந்துவிட்டீர்களா"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string>
@@ -1997,6 +2003,42 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது"</string>
+ <!-- no translation found for mime_type_folder (7111951698626315204) -->
+ <skip />
+ <!-- no translation found for mime_type_apk (5518003630972506900) -->
+ <skip />
+ <!-- no translation found for mime_type_generic (6833871596845900027) -->
+ <skip />
+ <!-- no translation found for mime_type_generic_ext (8450275970061657174) -->
+ <skip />
+ <!-- no translation found for mime_type_audio (6289777657172050926) -->
+ <skip />
+ <!-- no translation found for mime_type_audio_ext (3270880987725816210) -->
+ <skip />
+ <!-- no translation found for mime_type_video (4093025777317307426) -->
+ <skip />
+ <!-- no translation found for mime_type_video_ext (5643771615714173159) -->
+ <skip />
+ <!-- no translation found for mime_type_image (3144284451605236371) -->
+ <skip />
+ <!-- no translation found for mime_type_image_ext (1514613218742736590) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed (1645486037074943257) -->
+ <skip />
+ <!-- no translation found for mime_type_compressed_ext (4232293058067801528) -->
+ <skip />
+ <!-- no translation found for mime_type_document (1596838147256375966) -->
+ <skip />
+ <!-- no translation found for mime_type_document_ext (6327266601345501281) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet (2639138255207123557) -->
+ <skip />
+ <!-- no translation found for mime_type_spreadsheet_ext (5508653032786106725) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation (6145604688774787357) -->
+ <skip />
+ <!-- no translation found for mime_type_presentation_ext (2982650207774823437) -->
+ <skip />
<string name="car_loading_profile" msgid="3545132581795684027">"ஏற்றுகிறது"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ஃபைல்கள்</item>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 7406b5ac0936..e113a432399d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"ఫోన్"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ఫోన్ కాల్‌లు చేయడం మరియు నిర్వహించడం"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"ఫోన్ కాల్‌లు చేయడానికి మరియు నిర్వహించడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"శరీర సెన్సార్‌లు"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"సంగీతం"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"మీ సంగీతాన్ని యాక్సెస్ చేయండి"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"మీ సంగీతాన్ని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"ఫోటోలు &amp; వీడియోలు"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"మీ ఫోటోలను &amp; వీడియోలను యాక్సెస్ చేయండి"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"మీ ఫోటోలు &amp; వీడియోలు యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"విండో కంటెంట్‍ను తిరిగి పొందుతుంది"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"మీరు పరస్పర చర్య చేస్తున్న విండో కంటెంట్‌‍ను పరిశీలిస్తుంది."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"తాకడం ద్వారా విశ్లేషణను ప్రారంభిస్తుంది"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"సెటప్ చేయండి"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"తొలగించు"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"విశ్లేషించు"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"అవుట్‌పుట్ మార్చండి"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> కనుగొనబడటం లేదు"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"పరికరాన్ని మళ్లీ చొప్పించండి"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ని తరలిస్తోంది"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"అతివ్యాప్తి #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", సురక్షితం"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం భవిష్యత్తు Q బిల్డ్‌లలో బ్లాక్ చేయబడుతుంది. go/q-bg-block చూడండి."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం బ్లాక్ చేయబడింది. go/q-bg-block చూడండి."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"నమూనాను మర్చిపోయాను"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ఆకృతి తప్పు"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"పాస్‌వర్డ్ తప్పు"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"రొటీన్ మోడ్ సమాచార నోటిఫికేషన్"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"ఫోల్డర్"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android అప్లికేషన్"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ఫైల్"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ఫైల్"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ఆడియో"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ఆడియో"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"వీడియో"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> వీడియో"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"చిత్రం"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> చిత్రం"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ఆర్కైవ్"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ఆర్కైవ్"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"పత్రం"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> పత్రం"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"స్ప్రెడ్‌షీట్"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> స్ప్రెడ్‌షీట్"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ప్రదర్శన"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> ప్రదర్శన"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"లోడవుతోంది"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ఫైల్‌లు</item>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 271949d9277c..00c94da8d933 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"โทรศัพท์"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"โทรและจัดการการโทร"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; โทรและจัดการการโทรไหม"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"เซ็นเซอร์ร่างกาย"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพของคุณ"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงข้อมูลเซ็นเซอร์เกี่ยวกับสัญญาณชีพไหม"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"เพลง"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"เข้าถึงเพลง"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงเพลงไหม"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"รูปภาพและวิดีโอ"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"เข้าถึงรูปภาพและวิดีโอ"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงรูปภาพและวิดีโอไหม"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกข้อมูลเนื้อหาของหน้าต่าง"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"ตั้งค่า"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"นำอุปกรณ์ออก"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"สำรวจ"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"เปลี่ยนเอาต์พุต"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"ไม่มี <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"ใส่อุปกรณ์อีกครั้ง"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"กำลังย้าย <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"การวางซ้อน #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", ปลอดภัย"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"การเริ่มกิจกรรมในเบื้องหลังจาก <xliff:g id="PACKAGENAME">%1$s</xliff:g> นี้จะถูกบล็อกในบิวด์ Q ในอนาคต ดู go/q-bg-block"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"บล็อกการเริ่มกิจกรรมในเบื้องหลังจาก <xliff:g id="PACKAGENAME">%1$s</xliff:g> แล้ว ดู go/q-bg-block"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ลืมรูปแบบใช่หรือไม่"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"รูปแบบไม่ถูกต้อง"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"รหัสผ่านไม่ถูกต้อง"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"การแจ้งเตือนข้อมูลโหมดกิจวัตร"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"แบตเตอรี่อาจหมดก่อนการชาร์จปกติ"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"เปิดใช้งานโหมดประหยัดแบตเตอรี่แล้วเพื่อยืดอายุการใช้งานแบตเตอรี่"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"โฟลเดอร์"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"ไฟล์แอปพลิเคชัน Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"ไฟล์"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"ไฟล์ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"ไฟล์เสียง"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"ไฟล์เสียง <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ไฟล์วิดีโอ"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"ไฟล์วิดีโอ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"ไฟล์รูปภาพ"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"ไฟล์รูปภาพ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"ไฟล์ที่เก็บถาวร"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"ไฟล์ที่เก็บถาวร <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"ไฟล์เอกสาร"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"ไฟล์เอกสาร <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"สเปรดชีต"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"ไฟล์สเปรดชีต <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"ไฟล์งานนำเสนอ"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"ไฟล์งานนำเสนอ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"กำลังโหลด"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> และอีก <xliff:g id="COUNT_3">%d</xliff:g> ไฟล์</item>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 287234fc713d..036ce2578b77 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telepono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"tumawag at mamahala ng mga tawag sa telepono"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na tumawag at mamahala ng mga tawag sa telepono?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Mga Sensor ng Katawan"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"i-access ang data ng sensor tungkol sa iyong vital signs"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang data ng sensor tungkol sa iyong mga vital sign?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musika"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"i-access ang iyong musika"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang iyong musika?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Mga Larawan at Video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"i-access ang iyong mga larawan at video"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang iyong mga larawan at video?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Kunin ang content ng window"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"I-on ang Explore by Touch"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"I-set up"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"I-eject"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"I-explore"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Ilipat ang output"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"Nawawala ang <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Ikabit muli ang device"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Inililipat ang <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", secure"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Iba-block ang pagsisimula ng aktibidad sa background na ito mula sa <xliff:g id="PACKAGENAME">%1$s</xliff:g> sa mga Q build sa hinaharap. Tingnan ang go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Na-block ang pagsisimula ng aktibidad sa background mula sa <xliff:g id="PACKAGENAME">%1$s</xliff:g>. Tingnan ang go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nakalimutan ang Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Maling Pattern"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Maling Password"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Notification ng impormasyon ng Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Na-activate ang Pangtipid sa Baterya para patagalin ang buhay ng baterya"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Folder"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android application"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"File"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> file"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> na audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> na video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Larawan"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> na larawan"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Archive"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> na archive"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Dokumento"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> na dokumento"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Spreadsheet"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> na spreadsheet"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Presentation"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> na presentation"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Naglo-load"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> file</item>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 783c7a6e0059..9e84f5a7e818 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon çağrıları yapma ve yönetme"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının telefon etmesine ve çağrıları yönetmesine izin verilsin mi?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Vücut Sensörleri"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"hayati belirtilerinizle ilgili sensör verilerine erişme"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının hayati belirtilerinizle ilgili sensör verilerine erişmesine izin verilsin mi?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Müzik"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"müziğinize erişme"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının müziğinize erişmesine izin veriyor musunuz?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Fotoğraflar ve Videolar"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"fotoğraflarınıza ve videolarınıza erişme"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının fotoğraflarınıza ve videolarınıza erişmesine izin veriyor musunuz?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alma"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Dokunarak Keşfet\'i açma"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Kur"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Çıkar"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Keşfet"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Çıkışı değiştir"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> bulunamıyor"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Cihazı tekrar takın"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> taşınıyor"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Yer Paylaşımı No. <xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", güvenli"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketinden bu arka plan etkinliği başlangıcı, ilerideki Q derlemelerinde engellenecek. go/q-bg-block adresine bakın."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> paketinden arka plan etkinliği başlangıcı engellendi. go/q-bg-block adresine bakın."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Deseni Unuttunuz mu?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Desen"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifre"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Rutin Modu bilgi bildirimi"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pil normal şarjdan önce bitebilir"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Pilin ömrünü uzatmak için Pil Tasarrufu etkinleştirildi"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Klasör"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android uygulaması"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Dosya"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> dosyası"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Ses"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> ses dosyası"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video dosyası"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Resim"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> resim dosyası"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arşiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arşiv dosyası"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Doküman"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> doküman dosyası"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"E-tablo"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> e-tablo dosyası"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Sunu"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> sunu dosyası"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yükleniyor"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> dosya</item>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index c49c94f4a74e..5f1fb17e855d 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -314,15 +314,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефонувати та керувати дзвінками"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Дозволити додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; здійснювати телефонні дзвінки та керувати ними?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Датчики на тілі"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"отримувати доступ до інформації датчиків про ваші життєві показники"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до життєвих показників із датчиків?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Музика"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"доступ до музики"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до музики?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Фото й відео"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"доступ до фото й відео"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до фото й відео?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Отримувати вміст вікна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Перевіряти вміст вікна, з яким ви взаємодієте."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Увімкнути функцію дослідження дотиком"</string>
@@ -515,8 +518,8 @@
<string name="permdesc_nfc" msgid="7120611819401789907">"Дозволяє програмі обмінюватися даними з тегами, картками та читачами екрана Near Field Communication (NFC)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"вимикати блокування екрана"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Дозволяє програмі вимикати блокування клавіатури та будь-який пов’язаний паролем захист. Наприклад: телефон вимикає блокування клавіатури під час отримання вхідного дзвінка, після закінчення якого блокування клавіатури відновлюється."</string>
- <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"запит складності пароля для блокування екрана"</string>
- <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дає додатку змогу визначати рівень складності пароля для блокування екрана (високий, середній, низький або нульовий). Враховуються кількість символів і тип блокування. Додаток також може пропонувати користувачам підвищити рівень складності пароля для блокування екрана, але цю пропозицію можна ігнорувати. Примітка: оскільки пароль зашифрований, додаток його не знає."</string>
+ <string name="permlab_requestScreenLockComplexity" msgid="7028982116060987169">"запит складності способу блокування екрана"</string>
+ <string name="permdesc_requestScreenLockComplexity" msgid="2806396846128185677">"Дозволяє додатку визначати рівень складності способу блокування екрана (високий, середній, низький або нульовий). Враховуються кількість символів і тип блокування. Додаток також може пропонувати користувачам вибрати складніший тип блокування екрана, але це не обов’язково робити. Примітка: оскільки пароль зашифрований, додаток його не знає."</string>
<string name="permlab_useBiometric" msgid="8837753668509919318">"використовувати біометричне апаратне забезпечення"</string>
<string name="permdesc_useBiometric" msgid="8389855232721612926">"Додаток може використовувати біометричне апаратне забезпечення для автентифікації"</string>
<string name="permlab_manageFingerprint" msgid="5640858826254575638">"керувати апаратним забезпеченням для цифрових відбитків"</string>
@@ -1657,6 +1660,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Накладання №<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>х<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", безпечний"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Активність пакета <xliff:g id="PACKAGENAME">%1$s</xliff:g> у фоновому режимі буде заблоковано в майбутніх складаннях Q. Докладнішу інформацію наведено на сторінці go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Активність додатка <xliff:g id="PACKAGENAME">%1$s</xliff:g> у фоновому режимі заблоковано. Докладнішу інформацію наведено на сторінці go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Не пам’ятаю ключ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильний ключ"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Неправильний пароль"</string>
@@ -2066,6 +2071,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Сповіщення про послідовнсть дій"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятор може розрядитися раніше ніж зазвичай"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режим економії заряду акумулятора активовано для збільшення часу його роботи"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Папка"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Додаток Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Файл"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Файл у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Аудіо"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Аудіо у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Відео"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Відео у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Зображення"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Зображення у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Архів"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Архів у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Документ"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Документ у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Таблиця"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Таблиця у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Презентація"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Презентація у форматі <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Завантаження"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> і ще <xliff:g id="COUNT_3">%d</xliff:g> файл</item>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 1d661e822b5c..57ff15cec275 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"فون"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"فون کالز کریں اور ان کا نظم کریں"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"‏&lt;/b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو فون کالز کرنے اور ان کا نظم کرنے کی اجازت دیں؟"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"باڈی سینسرز"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کے اہم اشاروں کے متعلق سینسر ڈیٹا تک رسائی کی اجازت دیں؟"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"موسیقی"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"اپنی موسیقی تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کی موسیقی تک رسائی کی اجازت دیں؟"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"تصاویر اور ویڈیوز"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"اپنی تصاویر اور ویڈیوز تک رسائی حاصل کریں"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کی تصاویر اور ویڈیوز تک رسائی کی اجازت دیں؟"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ٹچ کے ذریعے دریافت کریں کو آن کرنے کی"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"سیٹ اپ کریں"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"خارج کریں"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"دریافت کریں"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"آؤٹ پٹ سوئچ کریں"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> غائب ہے"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"آلہ دوبارہ داخل کریں"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> کو منتقل کیا جا رہا ہے"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"‏اوور لے ‎#<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"، محفوظ"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"‏<xliff:g id="PACKAGENAME">%1$s</xliff:g> سے شروع ہونے والی پس منظر کی اس سرگرمی کو مستقبل کے Q بلڈز میں مسدود کر دیا جائے گا۔ go/q-bg-block دیکھیں۔"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"‏<xliff:g id="PACKAGENAME">%1$s</xliff:g> سے شروع ہونے والی پس منظر کی سرگرمی کو مسدود کر دیا گیا ہے۔ go/q-bg-block دیکھیں۔"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"پیٹرن بھول گئے"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"غلط پیٹرن"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"غلط پاس ورڈ"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"روٹین موڈ معلومات کی اطلاع"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"معمول چارج سے پہلے بیٹری ختم ہو سکتی ہے"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"بیٹری لائف کو بڑھانے کے لیے بیٹری سیور کو فعال کر دیا گیا ہے"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"فولڈر"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"‏Android ایپلیکیشن"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"فائل"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> فائل"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"آڈیو"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> آڈیو"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"ویڈیو"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ویڈیو"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"تصویر"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> تصویر"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"آرکائیو"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> آرکائيو"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"دستاویز"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> دستاویز"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"اسپریڈشیٹ"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> اسپریڈشیٹ"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"پیشکش"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> پیشکش"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"لوڈ ہو رہا ہے"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> فائلز</item>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 5597a8b31a84..d6e2d0265211 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon qo‘ng‘iroqlarini amalga oshirish va boshqarish"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun telefon chaqiruvlarini amalga oshirish va boshqarishga ruxsat berilsinmi?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Tana sezgichlari"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"organizm holati haqidagi sezgich ma’lumotlariga kirish"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun organizm holati haqidagi sezgichlar axborotlariga ruxsat berilsinmi?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Musiqa"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"musiqaga kirish"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun musiqangizga kirishga ruxsat berilsinmi?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Surat va videolar"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"surat va videolarga kirish"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun surat va videolaringizga kirishga ruxsat berilsinmi?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni o‘qiydi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Teginib o‘rganish xizmatini yoqadi"</string>
@@ -1397,8 +1400,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Sozlash"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Chiqarish"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"O‘rganish"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Audio chiqishni almashtirish"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> topilmadi"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Qurilmani yana ulang"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ko‘chirib o‘tkazilmoqda"</string>
@@ -1612,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tasvir uzatish #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", xavfsiz"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Keyingi Android Q nashrlarida fondagi ushbu <xliff:g id="PACKAGENAME">%1$s</xliff:g> jarayoni bloklanadi. Batafsil: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Fondagi <xliff:g id="PACKAGENAME">%1$s</xliff:g> jarayoni bloklandi. Batafsil: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Grafik kalit esimdan chiqdi"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Grafik kalit xato"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string>
@@ -1997,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Kun tartibi rejimi haqidagi bildirishnoma"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Batareya quvvati odatdagidan ertaroq tugashi mumkin"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Batareya quvvati uzoqroq ishlashi uchun Tejamkor rejim yoqildi"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Jild"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android ilova"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Fayl"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> fayl"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Audio"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> audio"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> video"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Rasm"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> rasm"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Arxiv"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> arxiv"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Hujjat"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> hujjat"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Jadval"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> jadval"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Taqdimot"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> taqdimot"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Yuklanmoqda"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> ta fayl</item>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index ca4e96732c20..9d4fcc0f2c2e 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Điện thoại"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"thực hiện và quản lý cuộc gọi điện thoại"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; thực hiện và quản lý cuộc gọi điện thoại?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Cảm biến cơ thể"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"truy cập dữ liệu cảm biến về dấu hiệu sinh tồn của bạn"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào dữ liệu cảm biến về các dấu hiệu sinh tồn của bạn?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Nhạc"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"sử dụng nhạc"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Bạn có muốn cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; sử dụng nhạc không?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Ảnh và video"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"sử dụng ảnh và video"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Bạn có muốn cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; sử dụng ảnh và video không?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Truy xuất nội dung cửa sổ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kiểm tra nội dung của cửa sổ bạn đang tương tác."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Bật Khám phá bằng cách chạm"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Lớp phủ #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", an toàn"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Tính năng bắt đầu hoạt động trong nền từ <xliff:g id="PACKAGENAME">%1$s</xliff:g> này sẽ bị chặn ở các bản dựng Q trong tương lai. Bạn có thể xem thông tin tại: go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Tính năng bắt đầu hoạt động trong nền từ <xliff:g id="PACKAGENAME">%1$s</xliff:g> đã bị chặn. Bạn có thể xem thông tin tại: go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Đã quên hình"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Hình sai"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Mật khẩu sai"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Thông báo cung cấp thông tin về chế độ sạc thông thường"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Pin có thể hết trước khi sạc bình thường"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Trình tiết kiệm pin được kích hoạt để kéo dài thời lượng pin"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Thư mục"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Ứng dụng Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Tệp"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"Tệp <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Âm thanh"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"Âm thanh <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Video"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"Video <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Hình ảnh"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"Hình ảnh <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Lưu trữ"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"Lưu trữ <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Tài liệu"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"Tài liệu <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Bảng tính"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"Bảng tính <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Bản trình bày"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"Bản trình bày <xliff:g id="EXTENSION">%1$s</xliff:g>"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Đang tải"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> tệp</item>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index ba27f5a256a2..fca067f12656 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"允许“&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;”拨打电话和管理通话吗?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"身体传感器"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问与您的生命体征相关的传感器数据吗?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音乐"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"访问您的音乐"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问您的音乐吗?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"照片和视频"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"访问您的照片和视频"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问您的照片和视频吗?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检测您正访问的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"设置"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"弹出"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"浏览"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"切换输出"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"缺少<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"请再次插入设备"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"正在移动<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"叠加视图 #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">",安全"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> 的这类后台活动启动程序会在日后的 Android Q 版本中遭到屏蔽。请查看 go/q-bg-block。"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"已屏蔽 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 的后台活动启动程序。请查看 go/q-bg-block。"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘记了图案"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"图案错误"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密码错误"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式信息通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"电池电量可能会在您平时的充电时间之前耗尽"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已启用省电模式以延长电池续航时间"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"文件夹"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android 应用"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"文件"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> 文件"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"音频"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> 音频"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"视频"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> 视频"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"图片"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> 图片"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"归档文件"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> 归档文件"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"文档"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> 文档"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"电子表格"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> 电子表格"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"演示文稿"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> 演示文稿"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"正在加载"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 个文件</item>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 443cd9164135..1bcb8ee91dce 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;撥打電話和管理通話嗎?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命體徵相關的感應器資料"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取與您身體機能相關的感應器資料嗎?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音樂"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"存取您的音樂"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;」存取您的音樂嗎?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"相片和影片"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取您的相片和影片"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"要允許「&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;」存取您的相片和影片嗎?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"開啟「輕觸探索」功能"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"設定"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"移除"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"探索"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"切換輸出"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"找不到<xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"請再插入裝置"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"正在轉移<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"重疊效果 #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"(安全)"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"在日後的 Q 版本中,系統將會封鎖這個由 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 啟動的背景活動。請參閱 go/q-bg-block。"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"已封鎖 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 啟動的背景活動。請參閱 go/q-bg-block。"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖形不對"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"「日常安排模式」資料通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"電量可能會在日常充電前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"「省電模式」已啟用,以便延長電池壽命"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"資料夾"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android 應用程式"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"檔案"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> 檔案"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"音訊"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> 音訊"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"影片"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> 影片"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"圖片"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> 圖片"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"封存"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> 封存檔案"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"文件"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> 文件"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"試算表"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> 試算表"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"簡報"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> 簡報"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"正在載入"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index db5cbf4c35cd..cdfdd18ce23f 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」撥打電話及管理通話嗎?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與你生命徵象相關的感應器資料"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取與你生命徵象相關的感應器資料嗎?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"音樂"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"存取你的音樂"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取你的音樂嗎?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"相片和影片"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"存取你的相片和影片"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取你的相片和影片嗎?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查你存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
@@ -1611,6 +1614,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"第 <xliff:g id="ID">%1$d</xliff:g> 個重疊效果"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>:<xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>,<xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">"(安全)"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"<xliff:g id="PACKAGENAME">%1$s</xliff:g> 的這類背景活動啟動程序會在日後的 Android Q 版本遭到封鎖。請前往 go/q-bg-block 查看。"</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"已封鎖 <xliff:g id="PACKAGENAME">%1$s</xliff:g> 的背景活動啟動程序。請前往 go/q-bg-block 查看。"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string>
@@ -1996,6 +2001,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"日常安排模式資訊通知"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"電池電力可能會在你平常的充電時間前耗盡"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"已啟用節約耗電量模式以延長電池續航力"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"資料夾"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Android 應用程式"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"檔案"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> 檔案"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"音訊"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> 音訊"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"影片"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> 影片"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"圖片"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> 圖片"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"封存檔"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> 封存檔"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"文件"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> 文件"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"試算表"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> 試算表"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"簡報"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> 簡報"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"載入中"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="other">「<xliff:g id="FILE_NAME_2">%s</xliff:g>」及另外 <xliff:g id="COUNT_3">%d</xliff:g> 個檔案</item>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 2b960396c008..7e28530d1602 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -308,15 +308,18 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Ifoni"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"yenza uphinde uphathe amakholi wefoni"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi yenze iphinde iphathe amakholi efoni?"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"Izinzwa zomzimba"</string>
+ <!-- no translation found for permgrouplab_sensors (4838614103153567532) -->
+ <skip />
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"finyelela idatha yesizweli mayelana nezimpawu zakho ezibalulekile"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele kudatha yenzwa emayelana nezimpawu zakho ezibalulekile?"</string>
<string name="permgrouplab_aural" msgid="965607064083134896">"Umculo"</string>
<string name="permgroupdesc_aural" msgid="4870189506255958055">"finyelela umculo wakho"</string>
<string name="permgrouprequest_aural" msgid="6787926123071735620">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele umculo wakho?"</string>
- <string name="permgrouplab_visual" msgid="8030190588123857921">"Izithombe namavidiyo"</string>
+ <!-- no translation found for permgrouplab_visual (6477382108771145134) -->
+ <skip />
<string name="permgroupdesc_visual" msgid="3415827902566663546">"finyelela izithombe zakho namavidiyo"</string>
- <string name="permgrouprequest_visual" msgid="6907523945030290376">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele kuzithombe zakho namavidiyo?"</string>
+ <!-- no translation found for permgrouprequest_visual (3043752127595243314) -->
+ <skip />
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Thola okuqukethwe kwewindi"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Hlola okuqukethwe kwewindi ohlanganyela nalo."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Vula ukuhlola ngokuthinta"</string>
@@ -1396,8 +1399,7 @@
<string name="ext_media_init_action" msgid="7952885510091978278">"Setha"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Khipha"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Hlola"</string>
- <!-- no translation found for ext_media_seamless_action (6575980560886881233) -->
- <skip />
+ <string name="ext_media_seamless_action" msgid="6575980560886881233">"Shintsha okukhiphayo"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> okulahlekile"</string>
<string name="ext_media_missing_message" msgid="4012389235250987930">"Faka idivayisi futhi"</string>
<string name="ext_media_move_specific_title" msgid="1471100343872375842">"Ihambisa i-<xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1611,6 +1613,8 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Isendlalelo #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", kuphephile"</string>
+ <string name="activity_starter_block_bg_activity_starts_permissive" msgid="5692097903712956720">"Lesi siqalo somsebenzi ongemuva kusukela ku-<xliff:g id="PACKAGENAME">%1$s</xliff:g> sizovinjelwa ekwakhiweni okuzayo kwe-Q. Bona i-go/q-bg-block."</string>
+ <string name="activity_starter_block_bg_activity_starts_enforcing" msgid="8299522481076404353">"Umsebenzi ongemuva oqala kusukela ku-<xliff:g id="PACKAGENAME">%1$s</xliff:g> uvinjelwe. Bona i-go/q-bg-block."</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ukhohlwe iphethini?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Iphatheni engalungile"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Iphasiwedi engalungile"</string>
@@ -1996,6 +2000,24 @@
<string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Isaziso solwazi lwe-Routine Mode"</string>
<string name="dynamic_mode_notification_title" msgid="508815255807182035">"Ibhethri lingaphela ngaphambi kokushaja okuvamile"</string>
<string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Isilondolozi sebhethri siyasebenza ngaphandle kwempilo yebhethri"</string>
+ <string name="mime_type_folder" msgid="7111951698626315204">"Ifolda"</string>
+ <string name="mime_type_apk" msgid="5518003630972506900">"Uhlelo lokusebenza lwe-Android"</string>
+ <string name="mime_type_generic" msgid="6833871596845900027">"Ifayela"</string>
+ <string name="mime_type_generic_ext" msgid="8450275970061657174">"<xliff:g id="EXTENSION">%1$s</xliff:g> ifayela"</string>
+ <string name="mime_type_audio" msgid="6289777657172050926">"Umsindo"</string>
+ <string name="mime_type_audio_ext" msgid="3270880987725816210">"<xliff:g id="EXTENSION">%1$s</xliff:g> umsindo"</string>
+ <string name="mime_type_video" msgid="4093025777317307426">"Ividiyo"</string>
+ <string name="mime_type_video_ext" msgid="5643771615714173159">"<xliff:g id="EXTENSION">%1$s</xliff:g> ividiyo"</string>
+ <string name="mime_type_image" msgid="3144284451605236371">"Isithombe"</string>
+ <string name="mime_type_image_ext" msgid="1514613218742736590">"<xliff:g id="EXTENSION">%1$s</xliff:g> isithombe"</string>
+ <string name="mime_type_compressed" msgid="1645486037074943257">"Ingobo yomlando"</string>
+ <string name="mime_type_compressed_ext" msgid="4232293058067801528">"<xliff:g id="EXTENSION">%1$s</xliff:g> ingobo yomlando"</string>
+ <string name="mime_type_document" msgid="1596838147256375966">"Idokhumenti"</string>
+ <string name="mime_type_document_ext" msgid="6327266601345501281">"<xliff:g id="EXTENSION">%1$s</xliff:g> idokhumenti"</string>
+ <string name="mime_type_spreadsheet" msgid="2639138255207123557">"Isipredishithi"</string>
+ <string name="mime_type_spreadsheet_ext" msgid="5508653032786106725">"<xliff:g id="EXTENSION">%1$s</xliff:g> isipredishithi"</string>
+ <string name="mime_type_presentation" msgid="6145604688774787357">"Iphrezentheshini"</string>
+ <string name="mime_type_presentation_ext" msgid="2982650207774823437">"<xliff:g id="EXTENSION">%1$s</xliff:g> iphrezentheshini"</string>
<string name="car_loading_profile" msgid="3545132581795684027">"Iyalayisha"</string>
<plurals name="file_count" formatted="false" msgid="1628600959752419449">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> amafayela</item>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 4e174c42fe73..2f2fdca7f279 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -486,22 +486,16 @@
- the return value of TelephonyManager.getTetherApnRequired()
determines how the array is further modified:
- * DUN_REQUIRED
- TYPE_MOBILE is removed (if present)
- TYPE_MOBILE_HIPRI is removed (if present)
- TYPE_MOBILE_DUN is appended (if not already present)
-
- * DUN_NOT_REQUIRED
- TYPE_MOBILE_DUN is removed (if present)
- TYPE_MOBILE is appended (if not already present)
- TYPE_MOBILE_HIPRI is appended (if not already present)
-
- * DUN_UNSPECIFIED
- if any of TYPE_MOBILE{,_DUN,_HIPRI} are present:
- change nothing
- else:
- TYPE_MOBILE is appended
- TYPE_MOBILE_HIPRI is appended
+ * TRUE (DUN REQUIRED).
+ TYPE_MOBILE is removed (if present).
+ TYPE_MOBILE_HIPRI is removed (if present).
+ TYPE_MOBILE_DUN is appended (if not already present).
+
+ * FALSE (DUN NOT REQUIRED).
+ TYPE_MOBILE_DUN is removed (if present).
+ If both of TYPE_MOBILE{,_HIPRI} are not present:
+ TYPE_MOBILE is appended.
+ TYPE_MOBILE_HIPRI is appended.
For other changes applied to this list, now and in the future, see
com.android.server.connectivity.tethering.TetheringConfiguration.
@@ -3951,4 +3945,7 @@
and a second time clipped to the fill level to indicate charge -->
<bool name="config_batterymeterDualTone">false</bool>
+ <!-- The default peak refresh rate for a given device. Change this value if you want to allow
+ for higher refresh rates to be automatically used out of the box -->
+ <integer name="config_defaultPeakRefreshRate">60</integer>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 426d813885fe..d5444c0e760c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3688,4 +3688,6 @@
<java-symbol type="string" name="mime_type_spreadsheet_ext" />
<java-symbol type="string" name="mime_type_presentation" />
<java-symbol type="string" name="mime_type_presentation_ext" />
+
+ <java-symbol type="integer" name="config_defaultPeakRefreshRate" />
</resources>
diff --git a/core/tests/BroadcastRadioTests/Android.mk b/core/tests/BroadcastRadioTests/Android.mk
index 6b0484ec366d..faffc4b28a58 100644
--- a/core/tests/BroadcastRadioTests/Android.mk
+++ b/core/tests/BroadcastRadioTests/Android.mk
@@ -25,7 +25,7 @@ LOCAL_MODULE_TAGS := tests
# LOCAL_SDK_VERSION := current
LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util androidx.test.rules testng
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util-axt androidx.test.rules testng
LOCAL_JAVA_LIBRARIES := android.test.base
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 69632c1d4167..ebc6be72bea6 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -92,7 +92,8 @@ public class SettingsBackupTest {
Settings.System.VOLUME_SYSTEM, // deprecated since API 2?
Settings.System.VOLUME_VOICE, // deprecated since API 2?
Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug?
- Settings.System.WINDOW_ORIENTATION_LISTENER_LOG // used for debugging only
+ Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only
+ Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities
);
private static final Set<String> BACKUP_BLACKLISTED_GLOBAL_SETTINGS =
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
index 5dddd1afbb60..e6e7a85ae16e 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuThreadReaderTest.java
@@ -518,6 +518,17 @@ public class KernelCpuThreadReaderTest {
}
@Test
+ public void testUidPredicate_zero() {
+ KernelCpuThreadReaderSettingsObserver.UidPredicate uidPredicate =
+ KernelCpuThreadReaderSettingsObserver.UidPredicate.fromString("0-0");
+ assertTrue(uidPredicate.test(0));
+ assertFalse(uidPredicate.test(1));
+ assertFalse(uidPredicate.test(2000));
+ assertFalse(uidPredicate.test(10000));
+ assertFalse(uidPredicate.test(-100));
+ }
+
+ @Test
public void testUidPredicate_emptyRangeString() {
assertThrows(
NumberFormatException.class,
diff --git a/data/etc/com.android.settings.xml b/data/etc/com.android.settings.xml
index 2110a8fa7e3d..3e53a3838543 100644
--- a/data/etc/com.android.settings.xml
+++ b/data/etc/com.android.settings.xml
@@ -33,6 +33,7 @@
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE" />
<permission name="android.permission.MASTER_CLEAR"/>
+ <permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<permission name="android.permission.MOVE_PACKAGE"/>
diff --git a/graphics/TEST_MAPPING b/graphics/TEST_MAPPING
new file mode 100644
index 000000000000..10bd0ee906fd
--- /dev/null
+++ b/graphics/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsGraphicsTestCases"
+ }
+ ]
+}
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 7016cc741e90..d3ca11c7f8b4 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -59,6 +59,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Retention;
import java.nio.ByteBuffer;
+import java.util.Locale;
+import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -838,6 +840,39 @@ public final class ImageDecoder implements AutoCloseable {
}
/**
+ * Return if the given MIME type is a supported file format that can be
+ * decoded by this class. This can be useful to determine if a file can be
+ * decoded directly, or if it needs to be converted into a more general
+ * format using an API like {@link ContentResolver#openTypedAssetFile}.
+ */
+ public static boolean isMimeTypeSupported(@NonNull String mimeType) {
+ Objects.requireNonNull(mimeType);
+ switch (mimeType.toLowerCase(Locale.US)) {
+ case "image/png":
+ case "image/jpeg":
+ case "image/webp":
+ case "image/gif":
+ case "image/heif":
+ case "image/bmp":
+ case "image/x-ico":
+ case "image/vnd.wap.wbmp":
+ case "image/x-sony-arw":
+ case "image/x-canon-cr2":
+ case "image/x-adobe-dng":
+ case "image/x-nikon-nef":
+ case "image/x-nikon-nrw":
+ case "image/x-olympus-orf":
+ case "image/x-fuji-raf":
+ case "image/x-panasonic-rw2":
+ case "image/x-pentax-pef":
+ case "image/x-samsung-srw":
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
* Create a new {@link Source Source} from a resource.
*
* @param res the {@link Resources} object containing the image data.
diff --git a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
index 5181d8992be5..ee4d1e72c130 100644
--- a/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorStateListDrawable.java
@@ -17,6 +17,7 @@ package android.graphics.drawable;
import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -40,14 +41,14 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
initializeColorDrawable();
}
- public ColorStateListDrawable(ColorStateList colorStateList) {
+ public ColorStateListDrawable(@NonNull ColorStateList colorStateList) {
mState = new ColorStateListDrawableState();
initializeColorDrawable();
setColorStateList(colorStateList);
}
@Override
- public void draw(Canvas canvas) {
+ public void draw(@NonNull Canvas canvas) {
mColorDrawable.draw(canvas);
}
@@ -73,7 +74,7 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
}
@Override
- public void applyTheme(Resources.Theme t) {
+ public void applyTheme(@NonNull Resources.Theme t) {
super.applyTheme(t);
if (mState.mColor != null) {
@@ -106,26 +107,26 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
}
@Override
- public void setTintList(ColorStateList tint) {
+ public void setTintList(@Nullable ColorStateList tint) {
mState.mTint = tint;
mColorDrawable.setTintList(tint);
onStateChange(getState());
}
@Override
- public void setTintMode(PorterDuff.Mode tintMode) {
+ public void setTintMode(@NonNull PorterDuff.Mode tintMode) {
mState.mTintMode = tintMode;
mColorDrawable.setTintMode(tintMode);
onStateChange(getState());
}
@Override
- public ColorFilter getColorFilter() {
+ public @Nullable ColorFilter getColorFilter() {
return mColorDrawable.getColorFilter();
}
@Override
- public void setColorFilter(ColorFilter colorFilter) {
+ public void setColorFilter(@Nullable ColorFilter colorFilter) {
mColorDrawable.setColorFilter(colorFilter);
}
@@ -156,28 +157,28 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
}
@Override
- public void invalidateDrawable(Drawable who) {
+ public void invalidateDrawable(@NonNull Drawable who) {
if (who == mColorDrawable && getCallback() != null) {
getCallback().invalidateDrawable(this);
}
}
@Override
- public void scheduleDrawable(Drawable who, Runnable what, long when) {
+ public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) {
if (who == mColorDrawable && getCallback() != null) {
getCallback().scheduleDrawable(this, what, when);
}
}
@Override
- public void unscheduleDrawable(Drawable who, Runnable what) {
+ public void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what) {
if (who == mColorDrawable && getCallback() != null) {
getCallback().unscheduleDrawable(this, what);
}
}
@Override
- public ConstantState getConstantState() {
+ public @NonNull ConstantState getConstantState() {
mState.mChangingConfigurations = mState.mChangingConfigurations
| (getChangingConfigurations() & ~mState.getChangingConfigurations());
return mState;
@@ -203,7 +204,7 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
}
@Override
- public Drawable mutate() {
+ public @NonNull Drawable mutate() {
if (!mMutated && super.mutate() == this) {
mState = new ColorStateListDrawableState(mState);
mMutated = true;
@@ -226,7 +227,7 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
*
* @param colorStateList A color state list to attach.
*/
- public void setColorStateList(ColorStateList colorStateList) {
+ public void setColorStateList(@NonNull ColorStateList colorStateList) {
mState.mColor = colorStateList;
onStateChange(getState());
}
@@ -278,7 +279,7 @@ public class ColorStateListDrawable extends Drawable implements Drawable.Callbac
}
}
- private ColorStateListDrawable(ColorStateListDrawableState state) {
+ private ColorStateListDrawable(@NonNull ColorStateListDrawableState state) {
mState = state;
initializeColorDrawable();
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 6ecb62140532..1894e32c723c 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -581,9 +581,9 @@ public class GradientDrawable extends Drawable {
* The default value for this property is {@code false}.
* <p>
* <strong>Note</strong>: This property corresponds to the
- * {@code android:useLevel} attribute on the inner {@code &lt;gradient&gt;}
+ * {@code android:useLevel} attribute on the inner {@code <gradient>}
* tag, NOT the {@code android:useLevel} attribute on the outer
- * {@code &lt;shape&gt;} tag. For example,
+ * {@code <shape>} tag. For example,
* <pre>{@code
* <shape ...>
* <gradient
diff --git a/keystore/tests/Android.mk b/keystore/tests/Android.mk
index 596e5f530970..99d3197f8bf3 100644
--- a/keystore/tests/Android.mk
+++ b/keystore/tests/Android.mk
@@ -21,7 +21,7 @@ LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test
+ androidx.test.rules hamcrest-library
LOCAL_PACKAGE_NAME := KeystoreTests
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/keystore/tests/AndroidManifest.xml b/keystore/tests/AndroidManifest.xml
index 9bf2d0c761e6..6833cd1e35b9 100644
--- a/keystore/tests/AndroidManifest.xml
+++ b/keystore/tests/AndroidManifest.xml
@@ -20,7 +20,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.security.tests"
android:label="Tests for Keystore">
</instrumentation>
diff --git a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
index 32f8ec44d11f..fca2775a34bb 100644
--- a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
+++ b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
@@ -22,16 +22,20 @@ import static org.junit.Assert.assertThat;
import android.os.Parcel;
import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.ParcelableKeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.support.test.runner.AndroidJUnit4;
+import android.security.keystore.ParcelableKeyGenParameterSpec;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.math.BigInteger;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Date;
+
import javax.security.auth.x500.X500Principal;
-import org.junit.Test;
-import org.junit.runner.RunWith;
/** Unit tests for {@link ParcelableKeyGenParameterSpec}. */
@RunWith(AndroidJUnit4.class)
diff --git a/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java
index 865cad472eb5..b2edfd05d13f 100644
--- a/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java
+++ b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java
@@ -20,10 +20,12 @@ import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
+import android.security.ParcelableKeyGenParameterSpecTest;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.security.ParcelableKeyGenParameterSpecTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index 117d05e837ef..d74f27cca200 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -1052,6 +1052,8 @@ void AssetManager2::RebuildFilterList(bool filter_incompatible_configs) {
}
void AssetManager2::InvalidateCaches(uint32_t diff) {
+ cached_bag_resid_stacks_.clear();
+
if (diff == 0xffffffffu) {
// Everything must go.
cached_bags_.clear();
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index bb75c77f7e64..c371c5fa0448 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -103,6 +103,7 @@ interface ILocationManager
void removeTestProvider(String provider, String opPackageName);
void setTestProviderLocation(String provider, in Location loc, String opPackageName);
void setTestProviderEnabled(String provider, boolean enabled, String opPackageName);
+ List<LocationRequest> getTestProviderCurrentRequests(String provider, String opPackageName);
// --- deprecated ---
void setTestProviderStatus(String provider, int status, in Bundle extras, long updateTime,
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 586ee2a43683..6828c597fe9a 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -1626,6 +1626,23 @@ public class LocationManager {
setTestProviderStatus(provider, LocationProvider.AVAILABLE, null, 0L);
}
+ /**
+ * Get the last list of {@link LocationRequest}s sent to the provider.
+ *
+ * @hide
+ */
+ @TestApi
+ @NonNull
+ public List<LocationRequest> getTestProviderCurrentRequests(String providerName) {
+ checkProvider(providerName);
+ try {
+ return mService.getTestProviderCurrentRequests(providerName,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
// --- GPS-specific support ---
// This class is used to send Gnss status events to the client's specific thread.
diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java
index 99b2dee0d3a7..6fd063eb62f0 100644
--- a/location/java/android/location/LocationRequest.java
+++ b/location/java/android/location/LocationRequest.java
@@ -270,7 +270,7 @@ public final class LocationRequest implements Parcelable {
* Set the quality of the request.
*
* <p>Use with a accuracy constant such as {@link #ACCURACY_FINE}, or a power
- * constant such as {@link #POWER_LOW}. You cannot request both and accuracy and
+ * constant such as {@link #POWER_LOW}. You cannot request both accuracy and
* power, only one or the other can be specified. The system will then
* maximize accuracy or minimize power as appropriate.
*
@@ -384,10 +384,8 @@ public final class LocationRequest implements Parcelable {
*
* @param locationSettingsIgnored Whether to ignore location settings
* @return the same object, so that setters can be chained
- * @hide
*/
@RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
- @SystemApi
public LocationRequest setLocationSettingsIgnored(boolean locationSettingsIgnored) {
mLocationSettingsIgnored = locationSettingsIgnored;
return this;
@@ -395,10 +393,7 @@ public final class LocationRequest implements Parcelable {
/**
* Returns true if location settings will be ignored in order to satisfy this request.
- *
- * @hide
*/
- @SystemApi
public boolean isLocationSettingsIgnored() {
return mLocationSettingsIgnored;
}
@@ -558,9 +553,6 @@ public final class LocationRequest implements Parcelable {
}
}
-
- /** @hide */
- @SystemApi
public LocationRequest setProvider(String provider) {
checkProvider(provider);
mProvider = provider;
diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index 866634e17513..e5fd0d342e9d 100644
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -118,8 +118,8 @@ public class GpsNetInitiatedHandler {
static private boolean mIsHexInput = true;
// End time of emergency call, and extension, if set
- private long mCallEndElapsedRealtimeMillis = 0;
- private long mEmergencyExtensionMillis = 0;
+ private volatile long mCallEndElapsedRealtimeMillis = 0;
+ private volatile long mEmergencyExtensionMillis = 0;
public static class GpsNiNotification
{
@@ -242,8 +242,9 @@ public class GpsNetInitiatedHandler {
*/
public boolean getInEmergency() {
boolean isInEmergencyExtension =
- (SystemClock.elapsedRealtime() - mCallEndElapsedRealtimeMillis) <
- mEmergencyExtensionMillis;
+ (mCallEndElapsedRealtimeMillis > 0)
+ && ((SystemClock.elapsedRealtime() - mCallEndElapsedRealtimeMillis)
+ < mEmergencyExtensionMillis);
boolean isInEmergencyCallback = mTelephonyManager.getEmergencyCallbackMode();
return mIsInEmergencyCall || isInEmergencyCallback || isInEmergencyExtension;
}
diff --git a/location/java/com/android/internal/location/ProviderRequest.java b/location/java/com/android/internal/location/ProviderRequest.java
index af8123ac52f4..155f788cb33e 100644
--- a/location/java/com/android/internal/location/ProviderRequest.java
+++ b/location/java/com/android/internal/location/ProviderRequest.java
@@ -56,7 +56,7 @@ public final class ProviderRequest implements Parcelable {
* low power fast interval request.
*/
@UnsupportedAppUsage
- public List<LocationRequest> locationRequests = new ArrayList<LocationRequest>();
+ public final List<LocationRequest> locationRequests = new ArrayList<>();
@UnsupportedAppUsage
public ProviderRequest() {
diff --git a/media/apex/java/android/media/CallbackDataSourceDesc.java b/media/apex/java/android/media/CallbackDataSourceDesc.java
index cd364145e8a4..9209ca94897f 100644
--- a/media/apex/java/android/media/CallbackDataSourceDesc.java
+++ b/media/apex/java/android/media/CallbackDataSourceDesc.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.NonNull;
+import android.annotation.Nullable;
/**
* Structure of data source descriptor for sources using callback.
@@ -37,7 +38,7 @@ public class CallbackDataSourceDesc extends DataSourceDesc {
* Return the DataSourceCallback of this data source.
* @return the DataSourceCallback of this data source
*/
- public DataSourceCallback getDataSourceCallback() {
+ public @NonNull DataSourceCallback getDataSourceCallback() {
return mDataSourceCallback;
}
@@ -70,7 +71,7 @@ public class CallbackDataSourceDesc extends DataSourceDesc {
* @param dsd the {@link CallbackDataSourceDesc} object whose data will be reused
* in the new Builder.
*/
- public Builder(CallbackDataSourceDesc dsd) {
+ public Builder(@Nullable CallbackDataSourceDesc dsd) {
super(dsd);
if (dsd == null) {
return; // use default
@@ -86,6 +87,11 @@ public class CallbackDataSourceDesc extends DataSourceDesc {
* @return a new {@link CallbackDataSourceDesc} object
*/
public @NonNull CallbackDataSourceDesc build() {
+ if (mDataSourceCallback == null) {
+ throw new IllegalStateException(
+ "DataSourceCallback should not be null");
+ }
+
CallbackDataSourceDesc dsd = new CallbackDataSourceDesc();
super.build(dsd);
dsd.mDataSourceCallback = mDataSourceCallback;
diff --git a/media/apex/java/android/media/DataSourceCallback.java b/media/apex/java/android/media/DataSourceCallback.java
index 1afcd2075ba4..6515bd6a2c09 100644
--- a/media/apex/java/android/media/DataSourceCallback.java
+++ b/media/apex/java/android/media/DataSourceCallback.java
@@ -17,6 +17,8 @@
package android.media;
+import android.annotation.NonNull;
+
import java.io.Closeable;
import java.io.IOException;
@@ -49,7 +51,7 @@ public abstract class DataSourceCallback implements Closeable {
* @throws IOException on fatal errors.
* @return the number of bytes read, or -1 if end of stream is reached.
*/
- public abstract int readAt(long position, byte[] buffer, int offset, int size)
+ public abstract int readAt(long position, @NonNull byte[] buffer, int offset, int size)
throws IOException;
/**
diff --git a/media/apex/java/android/media/DataSourceDesc.java b/media/apex/java/android/media/DataSourceDesc.java
index 7fc6f794cff8..e6fd120b6d5b 100644
--- a/media/apex/java/android/media/DataSourceDesc.java
+++ b/media/apex/java/android/media/DataSourceDesc.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.NonNull;
+import android.annotation.Nullable;
/**
* Base class of data source descriptor.
@@ -64,7 +65,7 @@ public class DataSourceDesc {
* Return the media Id of data source.
* @return the media Id of data source
*/
- public String getMediaId() {
+ public @Nullable String getMediaId() {
return mMediaId;
}
@@ -149,7 +150,7 @@ public class DataSourceDesc {
* @param mediaId the media Id of this data source
* @return the same Builder instance.
*/
- public @NonNull T setMediaId(String mediaId) {
+ public @NonNull T setMediaId(@Nullable String mediaId) {
mMediaId = mediaId;
return (T) this;
}
diff --git a/media/apex/java/android/media/FileDataSourceDesc.java b/media/apex/java/android/media/FileDataSourceDesc.java
index e29bd006c00a..4b703670abf1 100644
--- a/media/apex/java/android/media/FileDataSourceDesc.java
+++ b/media/apex/java/android/media/FileDataSourceDesc.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.ParcelFileDescriptor;
import android.util.Log;
@@ -106,7 +107,7 @@ public class FileDataSourceDesc extends DataSourceDesc {
* Return the ParcelFileDescriptor of this data source.
* @return the ParcelFileDescriptor of this data source
*/
- public ParcelFileDescriptor getParcelFileDescriptor() {
+ public @NonNull ParcelFileDescriptor getParcelFileDescriptor() {
return mPFD;
}
@@ -159,7 +160,7 @@ public class FileDataSourceDesc extends DataSourceDesc {
* @param dsd the {@link FileDataSourceDesc} object whose data will be reused
* in the new Builder.
*/
- public Builder(FileDataSourceDesc dsd) {
+ public Builder(@Nullable FileDataSourceDesc dsd) {
super(dsd);
if (dsd == null) {
return; // use default
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index 89a954061958..f6b2031bc456 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -344,7 +344,7 @@ public class MediaPlayer2 implements AutoCloseable
* to free the resources. If not released, too many MediaPlayer2 instances may
* result in an exception.</p>
*/
- public MediaPlayer2(Context context) {
+ public MediaPlayer2(@NonNull Context context) {
mGuard.open("close");
mContext = context;
@@ -488,7 +488,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object play() {
+ public @NonNull Object play() {
return addTask(new Task(CALL_COMPLETED_PLAY, false) {
@Override
void process() {
@@ -508,7 +508,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object prepare() {
+ public @NonNull Object prepare() {
return addTask(new Task(CALL_COMPLETED_PREPARE, true) {
@Override
void process() {
@@ -524,7 +524,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object pause() {
+ public @NonNull Object pause() {
return addTask(new Task(CALL_COMPLETED_PAUSE, false) {
@Override
void process() {
@@ -542,7 +542,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object skipToNext() {
+ public @NonNull Object skipToNext() {
return addTask(new Task(CALL_COMPLETED_SKIP_TO_NEXT, false) {
@Override
void process() {
@@ -700,7 +700,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setAudioAttributes(@NonNull AudioAttributes attributes) {
+ public @NonNull Object setAudioAttributes(@NonNull AudioAttributes attributes) {
return addTask(new Task(CALL_COMPLETED_SET_AUDIO_ATTRIBUTES, false) {
@Override
void process() {
@@ -735,7 +735,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setDataSource(@NonNull DataSourceDesc dsd) {
+ public @NonNull Object setDataSource(@NonNull DataSourceDesc dsd) {
return addTask(new Task(CALL_COMPLETED_SET_DATA_SOURCE, false) {
@Override
void process() throws IOException {
@@ -768,7 +768,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setNextDataSource(@NonNull DataSourceDesc dsd) {
+ public @NonNull Object setNextDataSource(@NonNull DataSourceDesc dsd) {
return addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCE, false) {
@Override
void process() {
@@ -791,7 +791,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setNextDataSources(@NonNull List<DataSourceDesc> dsds) {
+ public @NonNull Object setNextDataSources(@NonNull List<DataSourceDesc> dsds) {
return addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCES, false) {
@Override
void process() {
@@ -853,7 +853,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object clearNextDataSources() {
+ public @NonNull Object clearNextDataSources() {
return addTask(new Task(CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES, false) {
@Override
void process() {
@@ -962,7 +962,7 @@ public class MediaPlayer2 implements AutoCloseable
return;
}
} catch (NullPointerException | SecurityException | IOException ex) {
- Log.w(TAG, "Couldn't open " + uri + ": " + ex);
+ Log.w(TAG, "Couldn't open " + uri == null ? "null uri" : uri.toSafeString(), ex);
// Fallback to media server
}
handleDataSource(isCurrent, srcId, uri.toString(), headers, cookies, startPos, endPos);
@@ -1194,7 +1194,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object loopCurrent(boolean loop) {
+ public @NonNull Object loopCurrent(boolean loop) {
return addTask(new Task(CALL_COMPLETED_LOOP_CURRENT, false) {
@Override
void process() {
@@ -1216,7 +1216,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setPlayerVolume(float volume) {
+ public @NonNull Object setPlayerVolume(float volume) {
return addTask(new Task(CALL_COMPLETED_SET_PLAYER_VOLUME, false) {
@Override
void process() {
@@ -1257,7 +1257,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object notifyWhenCommandLabelReached(@NonNull Object label) {
+ public @NonNull Object notifyWhenCommandLabelReached(@NonNull Object label) {
return addTask(new Task(CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED, false) {
@Override
void process() {
@@ -1285,7 +1285,7 @@ public class MediaPlayer2 implements AutoCloseable
* @param sh the SurfaceHolder to use for video display
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
- public Object setDisplay(SurfaceHolder sh) {
+ public @NonNull Object setDisplay(@Nullable SurfaceHolder sh) {
return addTask(new Task(CALL_COMPLETED_SET_DISPLAY, false) {
@Override
void process() {
@@ -1321,7 +1321,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setSurface(Surface surface) {
+ public @NonNull Object setSurface(@Nullable Surface surface) {
return addTask(new Task(CALL_COMPLETED_SET_SURFACE, false) {
@Override
void process() {
@@ -1355,7 +1355,7 @@ public class MediaPlayer2 implements AutoCloseable
* @see android.os.PowerManager
*/
// This is an asynchronous call.
- public Object setWakeLock(@NonNull PowerManager.WakeLock wakeLock) {
+ public @NonNull Object setWakeLock(@NonNull PowerManager.WakeLock wakeLock) {
return addTask(new Task(CALL_COMPLETED_SET_WAKE_LOCK, false) {
@Override
void process() {
@@ -1390,7 +1390,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setScreenOnWhilePlaying(boolean screenOn) {
+ public @NonNull Object setScreenOnWhilePlaying(boolean screenOn) {
return addTask(new Task(CALL_COMPLETED_SET_SCREEN_ON_WHILE_PLAYING, false) {
@Override
void process() {
@@ -1466,7 +1466,7 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is a synchronous call.
@Override
- public boolean setPreferredDevice(AudioDeviceInfo deviceInfo) {
+ public boolean setPreferredDevice(@Nullable AudioDeviceInfo deviceInfo) {
boolean status = native_setPreferredDevice(deviceInfo);
if (status) {
synchronized (this) {
@@ -1483,7 +1483,7 @@ public class MediaPlayer2 implements AutoCloseable
* is not guaranteed to correspond to the actual device being used for playback.
*/
@Override
- public AudioDeviceInfo getPreferredDevice() {
+ public @Nullable AudioDeviceInfo getPreferredDevice() {
synchronized (this) {
return mPreferredDevice;
}
@@ -1496,7 +1496,7 @@ public class MediaPlayer2 implements AutoCloseable
* selected device when the player was last active.
*/
@Override
- public native AudioDeviceInfo getRoutedDevice();
+ public @Nullable native AudioDeviceInfo getRoutedDevice();
/**
* Adds an {@link AudioRouting.OnRoutingChangedListener} to receive notifications of routing
@@ -1508,8 +1508,8 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is a synchronous call.
@Override
- public void addOnRoutingChangedListener(AudioRouting.OnRoutingChangedListener listener,
- Handler handler) {
+ public void addOnRoutingChangedListener(@NonNull AudioRouting.OnRoutingChangedListener listener,
+ @Nullable Handler handler) {
if (listener == null) {
throw new IllegalArgumentException("addOnRoutingChangedListener: listener is NULL");
}
@@ -1527,7 +1527,8 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is a synchronous call.
@Override
- public void removeOnRoutingChangedListener(AudioRouting.OnRoutingChangedListener listener) {
+ public void removeOnRoutingChangedListener(
+ @NonNull AudioRouting.OnRoutingChangedListener listener) {
if (listener == null) {
throw new IllegalArgumentException("removeOnRoutingChangedListener: listener is NULL");
}
@@ -1547,7 +1548,7 @@ public class MediaPlayer2 implements AutoCloseable
* notification {@code EventCallback.onVideoSizeChanged} when the size
* is available.
*/
- public Size getVideoSize() {
+ public @NonNull Size getVideoSize() {
return mVideoSize;
}
@@ -1560,7 +1561,7 @@ public class MediaPlayer2 implements AutoCloseable
*
* Additional vendor-specific fields may also be present in the return value.
*/
- public PersistableBundle getMetrics() {
+ public @Nullable PersistableBundle getMetrics() {
PersistableBundle bundle = native_getMetrics();
return bundle;
}
@@ -1592,7 +1593,7 @@ public class MediaPlayer2 implements AutoCloseable
*/
// TODO: make it public when ready
// This is an asynchronous call.
- Object setBufferingParams(@NonNull BufferingParams params) {
+ @NonNull Object setBufferingParams(@NonNull BufferingParams params) {
return addTask(new Task(CALL_COMPLETED_SET_BUFFERING_PARAMS, false) {
@Override
void process() {
@@ -1614,7 +1615,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setPlaybackParams(@NonNull PlaybackParams params) {
+ public @NonNull Object setPlaybackParams(@NonNull PlaybackParams params) {
return addTask(new Task(CALL_COMPLETED_SET_PLAYBACK_PARAMS, false) {
@Override
void process() {
@@ -1642,7 +1643,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setSyncParams(@NonNull SyncParams params) {
+ public @NonNull Object setSyncParams(@NonNull SyncParams params) {
return addTask(new Task(CALL_COMPLETED_SET_SYNC_PARAMS, false) {
@Override
void process() {
@@ -1671,7 +1672,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object seekTo(long msec) {
+ public @NonNull Object seekTo(long msec) {
return seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */);
}
@@ -1745,7 +1746,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object seekTo(long msec, @SeekMode int mode) {
+ public @NonNull Object seekTo(long msec, @SeekMode int mode) {
return addTask(new Task(CALL_COMPLETED_SEEK_TO, true) {
@Override
void process() {
@@ -1846,7 +1847,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setAudioSessionId(int sessionId) {
+ public @NonNull Object setAudioSessionId(int sessionId) {
final AudioTrack dummyAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 2,
AudioTrack.MODE_STATIC, sessionId);
@@ -1887,7 +1888,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object attachAuxEffect(int effectId) {
+ public @NonNull Object attachAuxEffect(int effectId) {
return addTask(new Task(CALL_COMPLETED_ATTACH_AUX_EFFECT, false) {
@Override
void process() {
@@ -1912,7 +1913,7 @@ public class MediaPlayer2 implements AutoCloseable
* @return a token which can be used to cancel the operation later with {@link #cancelCommand}.
*/
// This is an asynchronous call.
- public Object setAuxEffectSendLevel(float level) {
+ public @NonNull Object setAuxEffectSendLevel(float level) {
return addTask(new Task(CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL, false) {
@Override
void process() {
@@ -1984,7 +1985,7 @@ public class MediaPlayer2 implements AutoCloseable
* When the language is unknown or could not be determined,
* ISO-639-2 language code, "und", is returned.
*/
- public String getLanguage() {
+ public @Nullable String getLanguage() {
String language = mFormat.getString(MediaFormat.KEY_LANGUAGE);
return language == null ? "und" : language;
}
@@ -1993,7 +1994,7 @@ public class MediaPlayer2 implements AutoCloseable
* Gets the {@link MediaFormat} of the track. If the format is
* unknown or could not be determined, null is returned.
*/
- public MediaFormat getFormat() {
+ public @Nullable MediaFormat getFormat() {
if (mTrackType == MEDIA_TRACK_TYPE_TIMEDTEXT
|| mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) {
return mFormat;
@@ -2201,7 +2202,7 @@ public class MediaPlayer2 implements AutoCloseable
* @see MediaPlayer2#getTrackInfo()
*/
// This is an asynchronous call.
- public Object selectTrack(int index) {
+ public @NonNull Object selectTrack(int index) {
return selectTrack(getCurrentDataSource(), index);
}
@@ -2235,7 +2236,7 @@ public class MediaPlayer2 implements AutoCloseable
* @see MediaPlayer2#getTrackInfo(DataSourceDesc)
*/
// This is an asynchronous call.
- public Object selectTrack(@NonNull DataSourceDesc dsd, int index) {
+ public @NonNull Object selectTrack(@NonNull DataSourceDesc dsd, int index) {
return addTask(new Task(CALL_COMPLETED_SELECT_TRACK, false) {
@Override
void process() {
@@ -2257,7 +2258,7 @@ public class MediaPlayer2 implements AutoCloseable
* @see MediaPlayer2#getTrackInfo()
*/
// This is an asynchronous call.
- public Object deselectTrack(int index) {
+ public @NonNull Object deselectTrack(int index) {
return deselectTrack(getCurrentDataSource(), index);
}
@@ -2277,7 +2278,7 @@ public class MediaPlayer2 implements AutoCloseable
* @see MediaPlayer2#getTrackInfo(DataSourceDesc)
*/
// This is an asynchronous call.
- public Object deselectTrack(@NonNull DataSourceDesc dsd, int index) {
+ public @NonNull Object deselectTrack(@NonNull DataSourceDesc dsd, int index) {
return addTask(new Task(CALL_COMPLETED_DESELECT_TRACK, false) {
@Override
void process() {
@@ -2928,7 +2929,7 @@ public class MediaPlayer2 implements AutoCloseable
* @param eventCallback the callback to be unregistered
*/
// This is a synchronous call.
- public void unregisterEventCallback(EventCallback eventCallback) {
+ public void unregisterEventCallback(@NonNull EventCallback eventCallback) {
synchronized (mEventCbLock) {
for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
if (cb.second == eventCallback) {
@@ -3850,7 +3851,7 @@ public class MediaPlayer2 implements AutoCloseable
*/
// This is an asynchronous call.
@TestApi
- public Object prepareDrm(@NonNull DataSourceDesc dsd, @NonNull UUID uuid) {
+ public @NonNull Object prepareDrm(@NonNull DataSourceDesc dsd, @NonNull UUID uuid) {
return addTask(newPrepareDrmTask(dsd, uuid));
}
diff --git a/media/apex/java/android/media/UriDataSourceDesc.java b/media/apex/java/android/media/UriDataSourceDesc.java
index 4eb9e8d3376f..c0b3c825323c 100644
--- a/media/apex/java/android/media/UriDataSourceDesc.java
+++ b/media/apex/java/android/media/UriDataSourceDesc.java
@@ -51,7 +51,7 @@ public class UriDataSourceDesc extends DataSourceDesc {
* Return the Uri of this data source.
* @return the Uri of this data source
*/
- public Uri getUri() {
+ public @NonNull Uri getUri() {
return mUri;
}
@@ -59,7 +59,7 @@ public class UriDataSourceDesc extends DataSourceDesc {
* Return the Uri headers of this data source.
* @return the Uri headers of this data source
*/
- public Map<String, String> getHeaders() {
+ public @Nullable Map<String, String> getHeaders() {
if (mHeader == null) {
return null;
}
@@ -70,7 +70,7 @@ public class UriDataSourceDesc extends DataSourceDesc {
* Return the Uri cookies of this data source.
* @return the Uri cookies of this data source
*/
- public List<HttpCookie> getCookies() {
+ public @Nullable List<HttpCookie> getCookies() {
if (mCookies == null) {
return null;
}
@@ -81,7 +81,7 @@ public class UriDataSourceDesc extends DataSourceDesc {
* Return the Context used for resolving the Uri of this data source.
* @return the Context used for resolving the Uri of this data source
*/
- public Context getContext() {
+ public @NonNull Context getContext() {
return mContext;
}
@@ -117,7 +117,7 @@ public class UriDataSourceDesc extends DataSourceDesc {
* @param dsd the {@link UriDataSourceDesc} object whose data will be reused
* in the new Builder.
*/
- public Builder(UriDataSourceDesc dsd) {
+ public Builder(@Nullable UriDataSourceDesc dsd) {
super(dsd);
if (dsd == null) {
return; // use default
@@ -136,6 +136,11 @@ public class UriDataSourceDesc extends DataSourceDesc {
* @return a new {@link UriDataSourceDesc} object
*/
public @NonNull UriDataSourceDesc build() {
+ if (mUri == null || mContext == null) {
+ throw new IllegalStateException(
+ "Uri and Context should not be null");
+ }
+
UriDataSourceDesc dsd = new UriDataSourceDesc();
super.build(dsd);
dsd.mUri = mUri;
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 15f9b47ede09..669baeadad65 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -4068,6 +4068,10 @@ public class AudioManager {
/**
* Indicate Hearing Aid connection state change and eventually suppress
* the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent.
+ * This operation is asynchronous but its execution will still be sequentially scheduled
+ * relative to calls to {@link #setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
+ * * BluetoothDevice, int, int, boolean, int)} and
+ * and {@link #handleBluetoothA2dpDeviceConfigChange(BluetoothDevice)}.
* @param device Bluetooth device connected/disconnected
* @param state new connection state (BluetoothProfile.STATE_xxx)
* @param musicDevice Default get system volume for the connecting device.
@@ -4075,27 +4079,27 @@ public class AudioManager {
* {@link android.bluetooth.BluetoothProfile.HEARING_AID})
* @param suppressNoisyIntent if true the
* {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent will not be sent.
- * @return a delay in ms that the caller should wait before broadcasting
- * BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED intent.
* {@hide}
*/
- public int setBluetoothHearingAidDeviceConnectionState(
+ public void setBluetoothHearingAidDeviceConnectionState(
BluetoothDevice device, int state, boolean suppressNoisyIntent,
int musicDevice) {
final IAudioService service = getService();
- int delay = 0;
try {
- delay = service.setBluetoothHearingAidDeviceConnectionState(device,
+ service.setBluetoothHearingAidDeviceConnectionState(device,
state, suppressNoisyIntent, musicDevice);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
- return delay;
}
/**
* Indicate A2DP source or sink connection state change and eventually suppress
* the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent.
+ * This operation is asynchronous but its execution will still be sequentially scheduled
+ * relative to calls to {@link #setBluetoothHearingAidDeviceConnectionState(BluetoothDevice,
+ * int, boolean, int)} and
+ * {@link #handleBluetoothA2dpDeviceConfigChange(BluetoothDevice)}.
* @param device Bluetooth device connected/disconnected
* @param state new connection state, {@link BluetoothProfile#STATE_CONNECTED}
* or {@link BluetoothProfile#STATE_DISCONNECTED}
@@ -4105,26 +4109,27 @@ public class AudioManager {
* {@link android.bluetooth.BluetoothProfile.A2DP_SINK})
* @param suppressNoisyIntent if true the
* {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent will not be sent.
- * @return a delay in ms that the caller should wait before broadcasting
- * BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent.
* {@hide}
*/
- public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
+ public void setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
BluetoothDevice device, int state,
int profile, boolean suppressNoisyIntent, int a2dpVolume) {
final IAudioService service = getService();
- int delay = 0;
try {
- delay = service.setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(device,
+ service.setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(device,
state, profile, suppressNoisyIntent, a2dpVolume);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
- return delay;
}
/**
* Indicate A2DP device configuration has changed.
+ * This operation is asynchronous but its execution will still be sequentially scheduled
+ * relative to calls to
+ * {@link #setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(BluetoothDevice, int, int,
+ * boolean, int)} and
+ * {@link #setBluetoothHearingAidDeviceConnectionState(BluetoothDevice, int, boolean, int)}
* @param device Bluetooth device whose configuration has changed.
* {@hide}
*/
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 3440cde415d5..7cfe0dd4b596 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -17,7 +17,9 @@
package android.media;
import android.annotation.CallbackExecutor;
+import android.annotation.FloatRange;
import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
@@ -389,6 +391,14 @@ public class AudioTrack extends PlayerBase
* Indicates whether the track is intended to play in offload mode.
*/
private boolean mOffloaded = false;
+ /**
+ * When offloaded track: delay for decoder in frames
+ */
+ private int mOffloadDelayFrames = 0;
+ /**
+ * When offloaded track: padding for decoder in frames
+ */
+ private int mOffloadPaddingFrames = 0;
//--------------------------------
// Used exclusively by native code
@@ -827,7 +837,7 @@ public class AudioTrack extends PlayerBase
* @return the same Builder instance.
* @throws IllegalArgumentException
*/
- public @NonNull Builder setBufferSizeInBytes(int bufferSizeInBytes)
+ public @NonNull Builder setBufferSizeInBytes(@IntRange(from = 0) int bufferSizeInBytes)
throws IllegalArgumentException {
if (bufferSizeInBytes <= 0) {
throw new IllegalArgumentException("Invalid buffer size " + bufferSizeInBytes);
@@ -865,7 +875,7 @@ public class AudioTrack extends PlayerBase
* @return the same Builder instance.
* @throws IllegalArgumentException
*/
- public @NonNull Builder setSessionId(int sessionId)
+ public @NonNull Builder setSessionId(@IntRange(from = 1) int sessionId)
throws IllegalArgumentException {
if ((sessionId != AudioManager.AUDIO_SESSION_ID_GENERATE) && (sessionId < 1)) {
throw new IllegalArgumentException("Invalid audio session ID " + sessionId);
@@ -1007,7 +1017,8 @@ public class AudioTrack extends PlayerBase
* @param paddingInFrames number of frames to be ignored at the end of the stream. A value of 0
* of 0 indicates no delay is to be applied.
*/
- public void setOffloadDelayPadding(int delayInFrames, int paddingInFrames) {
+ public void setOffloadDelayPadding(@IntRange(from = 0) int delayInFrames,
+ @IntRange(from = 0) int paddingInFrames) {
if (paddingInFrames < 0) {
throw new IllegalArgumentException("Illegal negative padding");
}
@@ -1020,10 +1031,48 @@ public class AudioTrack extends PlayerBase
if (mState == STATE_UNINITIALIZED) {
throw new IllegalStateException("Uninitialized track");
}
+ mOffloadDelayFrames = delayInFrames;
+ mOffloadPaddingFrames = paddingInFrames;
native_set_delay_padding(delayInFrames, paddingInFrames);
}
/**
+ * Return the decoder delay of an offloaded track, expressed in frames, previously set with
+ * {@link #setOffloadDelayPadding(int, int)}, or 0 if it was never modified.
+ * <p>This delay indicates the number of frames to be ignored at the beginning of the stream.
+ * This value can only be queried on a track successfully initialized with
+ * {@link AudioTrack.Builder#setOffloadedPlayback(boolean)}.
+ * @return decoder delay expressed in frames.
+ */
+ public @IntRange(from = 0) int getOffloadDelay() {
+ if (!mOffloaded) {
+ throw new IllegalStateException("Illegal query of delay on non-offloaded track");
+ }
+ if (mState == STATE_UNINITIALIZED) {
+ throw new IllegalStateException("Illegal query of delay on uninitialized track");
+ }
+ return mOffloadDelayFrames;
+ }
+
+ /**
+ * Return the decoder padding of an offloaded track, expressed in frames, previously set with
+ * {@link #setOffloadDelayPadding(int, int)}, or 0 if it was never modified.
+ * <p>This padding indicates the number of frames to be ignored at the end of the stream.
+ * This value can only be queried on a track successfully initialized with
+ * {@link AudioTrack.Builder#setOffloadedPlayback(boolean)}.
+ * @return decoder padding expressed in frames.
+ */
+ public @IntRange(from = 0) int getOffloadPadding() {
+ if (!mOffloaded) {
+ throw new IllegalStateException("Illegal query of padding on non-offloaded track");
+ }
+ if (mState == STATE_UNINITIALIZED) {
+ throw new IllegalStateException("Illegal query of padding on uninitialized track");
+ }
+ return mOffloadPaddingFrames;
+ }
+
+ /**
* Declares that the last write() operation on this track provided the last buffer of this
* stream.
* After the end of stream, previously set padding and delay values are ignored.
@@ -1040,6 +1089,15 @@ public class AudioTrack extends PlayerBase
}
/**
+ * Returns whether the track was built with {@link Builder#setOffloadedPlayback(boolean)} set
+ * to {@code true}.
+ * @return true if the track is using offloaded playback.
+ */
+ public boolean isOffloadedPlayback() {
+ return mOffloaded;
+ }
+
+ /**
* Returns whether direct playback of an audio format with the provided attributes is
* currently supported on the system.
* <p>Direct playback means that the audio stream is not resampled or downmixed
@@ -1491,7 +1549,7 @@ public class AudioTrack extends PlayerBase
* @return current size in frames of the <code>AudioTrack</code> buffer.
* @throws IllegalStateException if track is not initialized.
*/
- public int getBufferSizeInFrames() {
+ public @IntRange (from = 0) int getBufferSizeInFrames() {
return native_get_buffer_size_frames();
}
@@ -1518,7 +1576,7 @@ public class AudioTrack extends PlayerBase
* {@link #ERROR_BAD_VALUE}, {@link #ERROR_INVALID_OPERATION}
* @throws IllegalStateException if track is not initialized.
*/
- public int setBufferSizeInFrames(int bufferSizeInFrames) {
+ public int setBufferSizeInFrames(@IntRange (from = 0) int bufferSizeInFrames) {
if (mDataLoadMode == MODE_STATIC || mState == STATE_UNINITIALIZED) {
return ERROR_INVALID_OPERATION;
}
@@ -1547,7 +1605,7 @@ public class AudioTrack extends PlayerBase
* @return maximum size in frames of the <code>AudioTrack</code> buffer.
* @throws IllegalStateException if track is not initialized.
*/
- public int getBufferCapacityInFrames() {
+ public @IntRange (from = 0) int getBufferCapacityInFrames() {
return native_get_buffer_capacity_frames();
}
@@ -2054,7 +2112,7 @@ public class AudioTrack extends PlayerBase
* @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},
* {@link #ERROR_INVALID_OPERATION}
*/
- public int setPlaybackHeadPosition(int positionInFrames) {
+ public int setPlaybackHeadPosition(@IntRange (from = 0) int positionInFrames) {
if (mDataLoadMode == MODE_STREAM || mState == STATE_UNINITIALIZED ||
getPlayState() == PLAYSTATE_PLAYING) {
return ERROR_INVALID_OPERATION;
@@ -2096,7 +2154,8 @@ public class AudioTrack extends PlayerBase
* @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},
* {@link #ERROR_INVALID_OPERATION}
*/
- public int setLoopPoints(int startInFrames, int endInFrames, int loopCount) {
+ public int setLoopPoints(@IntRange (from = 0) int startInFrames,
+ @IntRange (from = 0) int endInFrames, @IntRange (from = -1) int loopCount) {
if (mDataLoadMode == MODE_STREAM || mState == STATE_UNINITIALIZED ||
getPlayState() == PLAYSTATE_PLAYING) {
return ERROR_INVALID_OPERATION;
@@ -2849,7 +2908,7 @@ public class AudioTrack extends PlayerBase
* @return error code or success, see {@link #SUCCESS},
* {@link #ERROR_INVALID_OPERATION}, {@link #ERROR}
*/
- public int setAuxEffectSendLevel(float level) {
+ public int setAuxEffectSendLevel(@FloatRange(from = 0.0) float level) {
if (mState == STATE_UNINITIALIZED) {
return ERROR_INVALID_OPERATION;
}
@@ -3095,21 +3154,22 @@ public class AudioTrack extends PlayerBase
* gets invalidated by the system to prevent any other offload.
* @param track the {@link AudioTrack} on which the event happened.
*/
- public void onTearDown(AudioTrack track) { }
+ public void onTearDown(@NonNull AudioTrack track) { }
/**
* Called when all the buffers of an offloaded track that were queued in the audio system
* (e.g. the combination of the Android audio framework and the device's audio hardware)
* have been played after {@link AudioTrack#stop()} has been called.
* @param track the {@link AudioTrack} on which the event happened.
*/
- public void onPresentationEnded(AudioTrack track) { }
+ public void onPresentationEnded(@NonNull AudioTrack track) { }
/**
* Called when more audio data can be written without blocking on an offloaded track.
* @param track the {@link AudioTrack} on which the event happened.
* @param sizeInFrames the number of frames available to write without blocking.
* Note that the frame size of a compressed stream is 1 byte.
*/
- public void onDataRequest(AudioTrack track, int sizeInFrames) { }
+ public void onDataRequest(@NonNull AudioTrack track, @IntRange(from = 0) int sizeInFrames) {
+ }
}
/**
diff --git a/media/java/android/media/HwAudioSource.java b/media/java/android/media/HwAudioSource.java
index 8bdb8a63f470..d9be0a593e4b 100644
--- a/media/java/android/media/HwAudioSource.java
+++ b/media/java/android/media/HwAudioSource.java
@@ -165,7 +165,7 @@ public class HwAudioSource extends PlayerBase {
* If the audio attributes are not set with {@link #setAudioAttributes(AudioAttributes)},
* attributes comprising {@link AudioAttributes#USAGE_MEDIA} will be used.
*/
- public static class Builder {
+ public static final class Builder {
private AudioAttributes mAudioAttributes;
private AudioDeviceInfo mAudioDeviceInfo;
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 1b82fcc48bf8..02856678879e 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -228,10 +228,10 @@ interface IAudioService {
oneway void playerHasOpPlayAudio(in int piid, in boolean hasOpPlayAudio);
- int setBluetoothHearingAidDeviceConnectionState(in BluetoothDevice device,
+ void setBluetoothHearingAidDeviceConnectionState(in BluetoothDevice device,
int state, boolean suppressNoisyIntent, int musicDevice);
- int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(in BluetoothDevice device,
+ void setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(in BluetoothDevice device,
int state, int profile, boolean suppressNoisyIntent, int a2dpVolume);
oneway void setFocusRequestResultFromExtPolicy(in AudioFocusInfo afi, int requestResult,
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index f30dda0eed07..abbfa888bb4b 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -1103,7 +1103,7 @@ public class MediaPlayer extends PlayerBase
setDataSource(afd);
return true;
} catch (NullPointerException | SecurityException | IOException ex) {
- Log.w(TAG, "Couldn't open " + uri + ": " + ex);
+ Log.w(TAG, "Couldn't open " + uri == null ? "null uri" : uri.toSafeString(), ex);
return false;
}
}
diff --git a/media/java/android/media/MediaTimestamp.java b/media/java/android/media/MediaTimestamp.java
index 03e454c1e962..da3362a019b9 100644
--- a/media/java/android/media/MediaTimestamp.java
+++ b/media/java/android/media/MediaTimestamp.java
@@ -134,7 +134,7 @@ public final class MediaTimestamp
* @hide
*/
@SystemApi
- public static class Builder {
+ public static final class Builder {
long mMediaTimeUs;
long mNanoTime;
float mClockRate = 1.0f;
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index 34d56ede8385..b302b06df782 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -21,8 +21,6 @@ import android.annotation.Nullable;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.content.Context;
-import android.media.VolumeShaper;
-import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -35,7 +33,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
-import java.lang.IllegalArgumentException;
import java.lang.ref.WeakReference;
import java.util.Objects;
@@ -574,13 +571,14 @@ public abstract class PlayerBase {
// Utilities
/**
+ * @hide
* Use to generate warning or exception in legacy code paths that allowed passing stream types
* to qualify audio playback.
* @param streamType the stream type to check
* @throws IllegalArgumentException
*/
- public static void deprecateStreamTypeForPlayback(int streamType, String className,
- String opName) throws IllegalArgumentException {
+ public static void deprecateStreamTypeForPlayback(int streamType, @NonNull String className,
+ @NonNull String opName) throws IllegalArgumentException {
// STREAM_ACCESSIBILITY was introduced at the same time the use of stream types
// for audio playback was deprecated, so it is not allowed at all to qualify a playback
// use case
diff --git a/media/java/android/media/SubtitleData.java b/media/java/android/media/SubtitleData.java
index 852babe1ecea..31622a9d467c 100644
--- a/media/java/android/media/SubtitleData.java
+++ b/media/java/android/media/SubtitleData.java
@@ -155,7 +155,7 @@ public final class SubtitleData
* @hide
*/
@SystemApi
- public static class Builder {
+ public static final class Builder {
private int mTrackIndex;
private long mStartTimeUs;
private long mDurationUs;
diff --git a/media/java/android/media/TimedMetaData.java b/media/java/android/media/TimedMetaData.java
index 2a8988855168..990760cf32ae 100644
--- a/media/java/android/media/TimedMetaData.java
+++ b/media/java/android/media/TimedMetaData.java
@@ -104,7 +104,7 @@ public final class TimedMetaData {
* @hide
*/
@SystemApi
- public static class Builder {
+ public static final class Builder {
private long mTimestampUs;
private byte[] mMetaData = new byte[0];
diff --git a/media/java/android/media/audiopolicy/AudioProductStrategies.java b/media/java/android/media/audiopolicy/AudioProductStrategies.java
index 98b6d97ec992..c305b683f136 100644
--- a/media/java/android/media/audiopolicy/AudioProductStrategies.java
+++ b/media/java/android/media/audiopolicy/AudioProductStrategies.java
@@ -85,7 +85,7 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate
* Returns an {@link Iterator}
*/
@Override
- public Iterator<AudioProductStrategy> iterator() {
+ public @NonNull Iterator<AudioProductStrategy> iterator() {
return mAudioProductStrategyList.iterator();
}
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.java b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
index 0b4ba937ad29..b60947f13c1f 100644
--- a/media/java/android/media/audiopolicy/AudioVolumeGroup.java
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.java
@@ -77,7 +77,7 @@ public final class AudioVolumeGroup implements Parcelable {
/**
* @return List of {@link AudioAttributes} involved in this {@link AudioVolumeGroup}.
*/
- public List<AudioAttributes> getAudioAttributes() {
+ public @NonNull List<AudioAttributes> getAudioAttributes() {
return Arrays.asList(mAudioAttributes);
}
diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.java b/media/java/android/media/audiopolicy/AudioVolumeGroups.java
index 301bec7a10c4..2e56f846e574 100644
--- a/media/java/android/media/audiopolicy/AudioVolumeGroups.java
+++ b/media/java/android/media/audiopolicy/AudioVolumeGroups.java
@@ -70,7 +70,7 @@ public final class AudioVolumeGroups implements Iterable<AudioVolumeGroup>, Parc
* Returns an {@link Iterator}
*/
@Override
- public Iterator<AudioVolumeGroup> iterator() {
+ public @NonNull Iterator<AudioVolumeGroup> iterator() {
return mAudioVolumeGroupList.iterator();
}
diff --git a/media/tests/MediaFrameworkTest/Android.mk b/media/tests/MediaFrameworkTest/Android.mk
index fb473f0581c9..167d255af74c 100644
--- a/media/tests/MediaFrameworkTest/Android.mk
+++ b/media/tests/MediaFrameworkTest/Android.mk
@@ -9,7 +9,7 @@ LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
LOCAL_STATIC_JAVA_LIBRARIES := \
mockito-target-minus-junit4 \
- android-support-test \
+ androidx.test.rules \
android-ex-camera2
LOCAL_PACKAGE_NAME := mediaframeworktest
diff --git a/media/tests/MediaFrameworkTest/AndroidManifest.xml b/media/tests/MediaFrameworkTest/AndroidManifest.xml
index e50a3757d14f..fb2d630faaf6 100644
--- a/media/tests/MediaFrameworkTest/AndroidManifest.xml
+++ b/media/tests/MediaFrameworkTest/AndroidManifest.xml
@@ -86,7 +86,7 @@
android:label="MediaFramework integration tests InstrumentationRunner">
</instrumentation>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.mediaframeworktest"
android:label="media framework tests">
</instrumentation>
diff --git a/media/tests/MediaFrameworkTest/AndroidTest.xml b/media/tests/MediaFrameworkTest/AndroidTest.xml
index 204959ff2749..132028ce98dc 100644
--- a/media/tests/MediaFrameworkTest/AndroidTest.xml
+++ b/media/tests/MediaFrameworkTest/AndroidTest.xml
@@ -21,7 +21,7 @@
<option name="test-tag" value="MediaFrameworkTest" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.mediaframeworktest" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
index d8c975f44c6a..87a59df19e8e 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraBinderTest.java
@@ -309,6 +309,10 @@ public class CameraBinderTest extends AndroidTestCase {
Log.v(TAG, String.format("Camera %s has torch status changed to 0x%x",
cameraId, status));
}
+ @Override
+ public void onCameraAccessPrioritiesChanged() {
+ Log.v(TAG, "Camera access permission change");
+ }
}
/**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaFileTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaFileTest.java
index feac63d40710..701454c32e4b 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaFileTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaFileTest.java
@@ -28,7 +28,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.mtp.MtpConstants;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import libcore.net.MimeUtils;
diff --git a/packages/BackupRestoreConfirmation/res/values-de/strings.xml b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
index fbfe78b5135b..1913578b58e5 100644
--- a/packages/BackupRestoreConfirmation/res/values-de/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
@@ -21,7 +21,7 @@
<string name="backup_confirm_text" msgid="1878021282758896593">"Es wurde eine vollständige Sicherung sämtlicher Daten auf einen verbundenen Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Sicherung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Meine Daten sichern"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nicht sichern"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"Es wurde eine vollständige Wiederherstellung aller Daten von einem verbundenen Desktop-Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Wiederherstellung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen. Dadurch werden alle derzeit auf dem Gerät befindlichen Daten ersetzt!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Es wurde eine vollständige Wiederherstellung aller Daten von einem verbundenen Computer angefordert. Möchtest du dies zulassen?\n\nWenn du die Wiederherstellung nicht selbst angefordert hast, solltest du dem Vorgang nicht zustimmen. Dadurch werden alle derzeit auf dem Gerät befindlichen Daten ersetzt!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Meine Daten wiederherstellen"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Nicht wiederherstellen"</string>
<string name="current_password_text" msgid="8268189555578298067">"Gib dein aktuelles Sicherungspasswort unten ein:"</string>
diff --git a/packages/ExtServices/tests/Android.bp b/packages/ExtServices/tests/Android.bp
index 930b783aaa98..ae60d4e32c04 100644
--- a/packages/ExtServices/tests/Android.bp
+++ b/packages/ExtServices/tests/Android.bp
@@ -14,14 +14,14 @@ android_test {
static_libs: [
"ExtServices-core",
- "android-support-test",
- "compatibility-device-util",
+ "androidx.test.rules",
+ "compatibility-device-util-axt",
"mockito-target-minus-junit4",
- "espresso-core",
+ "androidx.test.espresso.core",
"truth-prebuilt",
"testables",
"testng",
],
platform_apis: true,
-} \ No newline at end of file
+}
diff --git a/packages/ExtServices/tests/AndroidManifest.xml b/packages/ExtServices/tests/AndroidManifest.xml
index 3cf152753e65..a08a10e5b5df 100644
--- a/packages/ExtServices/tests/AndroidManifest.xml
+++ b/packages/ExtServices/tests/AndroidManifest.xml
@@ -23,7 +23,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.ext.services.tests.unit"
android:label="ExtServices Test Cases">
</instrumentation>
diff --git a/packages/ExtServices/tests/AndroidTest.xml b/packages/ExtServices/tests/AndroidTest.xml
index c3d32de4bfaf..cd26ebc407c1 100644
--- a/packages/ExtServices/tests/AndroidTest.xml
+++ b/packages/ExtServices/tests/AndroidTest.xml
@@ -23,7 +23,7 @@
<option name="test-tag" value="ExtServicesUnitTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.ext.services.tests.unit" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration> \ No newline at end of file
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AgingHelperTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AgingHelperTest.java
index 90018e5f8e6d..3db275acfd06 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/AgingHelperTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/AgingHelperTest.java
@@ -39,10 +39,11 @@ import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.testing.TestableContext;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
index 851e2f269a95..eeabb866f03f 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantSettingsTest.java
@@ -31,11 +31,12 @@ import android.os.Handler;
import android.os.Looper;
import android.provider.DeviceConfig;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.testing.TestableContext;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import org.junit.After;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
index f6328149b076..459cd407a586 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
@@ -44,11 +44,12 @@ import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.NotificationListenerService.RankingMap;
import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
import android.test.ServiceTestCase;
import android.testing.TestableContext;
import android.util.AtomicFile;
+import androidx.test.InstrumentationRegistry;
+
import com.android.internal.util.FastXmlSerializer;
import org.junit.Before;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/EntityTypeCounterTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/EntityTypeCounterTest.java
index 2d29c7b77759..ada61d0488c9 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/EntityTypeCounterTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/EntityTypeCounterTest.java
@@ -17,9 +17,10 @@ package android.ext.services.notification;
import static com.google.common.truth.Truth.assertThat;
-import android.support.test.runner.AndroidJUnit4;
import android.view.textclassifier.TextClassifier;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
index 05af6e7a7b71..ea77d31f6969 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
@@ -32,10 +32,11 @@ import android.app.Notification;
import android.app.NotificationChannel;
import android.os.Process;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.testing.TestableContext;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java
index 2d44e79d0f82..f51e911cbe97 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java
@@ -39,10 +39,11 @@ import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.testing.TestableContext;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionsHelperTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionsHelperTest.java
index d0b6d0061166..a1fbc7bef134 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionsHelperTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/SmartActionsHelperTest.java
@@ -39,14 +39,15 @@ import android.graphics.drawable.Icon;
import android.os.Process;
import android.service.notification.NotificationAssistantService;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.view.textclassifier.ConversationAction;
import android.view.textclassifier.ConversationActions;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextClassifierEvent;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.common.truth.FailureStrategy;
import com.google.common.truth.Subject;
import com.google.common.truth.SubjectFactory;
diff --git a/packages/NetworkStack/tests/Android.bp b/packages/NetworkStack/tests/Android.bp
index 5c7b514834cb..f22b6472847c 100644
--- a/packages/NetworkStack/tests/Android.bp
+++ b/packages/NetworkStack/tests/Android.bp
@@ -21,7 +21,7 @@ android_test {
test_suites: ["device-tests"],
resource_dirs: ["res"],
static_libs: [
- "android-support-test",
+ "androidx.test.rules",
"frameworks-base-testutils",
"mockito-target-extended-minus-junit4",
"NetworkStackLib",
diff --git a/packages/NetworkStack/tests/AndroidManifest.xml b/packages/NetworkStack/tests/AndroidManifest.xml
index 9cb2c21cc399..5dcf6ff1b514 100644
--- a/packages/NetworkStack/tests/AndroidManifest.xml
+++ b/packages/NetworkStack/tests/AndroidManifest.xml
@@ -47,7 +47,7 @@
<application android:debuggable="true">
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.server.networkstack.tests"
android:label="Networking service tests">
</instrumentation>
diff --git a/packages/NetworkStack/tests/AndroidTest.xml b/packages/NetworkStack/tests/AndroidTest.xml
index 6b08b57731b7..047bc2e67808 100644
--- a/packages/NetworkStack/tests/AndroidTest.xml
+++ b/packages/NetworkStack/tests/AndroidTest.xml
@@ -23,7 +23,7 @@
<option name="test-tag" value="NetworkStackTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.server.networkstack.tests" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration> \ No newline at end of file
diff --git a/packages/NetworkStack/tests/src/android/net/apf/ApfTest.java b/packages/NetworkStack/tests/src/android/net/apf/ApfTest.java
index 3414397d73c3..88a05d506aa4 100644
--- a/packages/NetworkStack/tests/src/android/net/apf/ApfTest.java
+++ b/packages/NetworkStack/tests/src/android/net/apf/ApfTest.java
@@ -53,14 +53,15 @@ import android.net.util.SharedLog;
import android.os.ConditionVariable;
import android.os.Parcelable;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.system.ErrnoException;
import android.system.Os;
import android.text.format.DateUtils;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.HexDump;
import com.android.server.networkstack.tests.R;
import com.android.server.util.NetworkStackConstants;
diff --git a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java
index 4abd77e9cfde..27d725540d34 100644
--- a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpLeaseRepositoryTest.java
@@ -31,16 +31,15 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
-import static java.lang.String.format;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.IpPrefix;
import android.net.MacAddress;
import android.net.dhcp.DhcpServer.Clock;
import android.net.util.SharedLog;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -48,6 +47,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import static java.lang.String.format;
+
import java.net.Inet4Address;
import java.util.Arrays;
import java.util.Collections;
diff --git a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
index 7544e72da02e..4d98403bfd4e 100644
--- a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpPacketTest.java
@@ -48,8 +48,9 @@ import android.net.DhcpResults;
import android.net.LinkAddress;
import android.net.NetworkUtils;
import android.net.metrics.DhcpErrorEvent;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.HexDump;
@@ -324,7 +325,7 @@ public class DhcpPacketTest {
@Test
public void testOffer1() throws Exception {
// TODO: Turn all of these into golden files. This will probably require using
- // android.support.test.InstrumentationRegistry for obtaining a Context object
+ // androidx.test.InstrumentationRegistry for obtaining a Context object
// to read such golden files, along with an appropriate Android.mk.
final ByteBuffer packet = ByteBuffer.wrap(HexDump.hexStringToByteArray(
// IP header.
diff --git a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java
index d4c1e2e16731..7d5e9e3ba174 100644
--- a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServerTest.java
@@ -51,11 +51,12 @@ import android.net.dhcp.DhcpServer.Clock;
import android.net.dhcp.DhcpServer.Dependencies;
import android.net.util.SharedLog;
import android.os.HandlerThread;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java
index 1004382b3adf..57a87a4d3fb1 100644
--- a/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java
+++ b/packages/NetworkStack/tests/src/android/net/dhcp/DhcpServingParamsTest.java
@@ -29,8 +29,9 @@ import android.annotation.Nullable;
import android.net.LinkAddress;
import android.net.dhcp.DhcpServingParams.InvalidParameterException;
import android.net.shared.Inet4AddressUtils;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
index aaaff0279fed..19902293b61a 100644
--- a/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
+++ b/packages/NetworkStack/tests/src/android/net/ip/IpClientTest.java
@@ -47,10 +47,11 @@ import android.net.shared.InitialConfiguration;
import android.net.shared.ProvisioningConfiguration;
import android.net.util.InterfaceParams;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.R;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.NetworkObserver;
diff --git a/packages/NetworkStack/tests/src/android/net/ip/IpReachabilityMonitorTest.java b/packages/NetworkStack/tests/src/android/net/ip/IpReachabilityMonitorTest.java
index e3b5ddf6f4cf..64b168ae2b5a 100644
--- a/packages/NetworkStack/tests/src/android/net/ip/IpReachabilityMonitorTest.java
+++ b/packages/NetworkStack/tests/src/android/net/ip/IpReachabilityMonitorTest.java
@@ -24,8 +24,9 @@ import android.net.util.InterfaceParams;
import android.net.util.SharedLog;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -33,7 +34,6 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-
/**
* Tests for IpReachabilityMonitor.
*/
diff --git a/packages/NetworkStack/tests/src/android/net/util/ConnectivityPacketSummaryTest.java b/packages/NetworkStack/tests/src/android/net/util/ConnectivityPacketSummaryTest.java
index dfaf52a953c7..71be8b38d3fe 100644
--- a/packages/NetworkStack/tests/src/android/net/util/ConnectivityPacketSummaryTest.java
+++ b/packages/NetworkStack/tests/src/android/net/util/ConnectivityPacketSummaryTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.net.MacAddress;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import libcore.util.HexEncoding;
diff --git a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
index 6e11c409e104..289dcade99a6 100644
--- a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
+++ b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java
@@ -31,12 +31,13 @@ import static org.junit.Assert.fail;
import android.os.Handler;
import android.os.HandlerThread;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.system.ErrnoException;
import android.system.Os;
import android.system.StructTimeval;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
index ddb7030d314a..04b906b4b9b1 100644
--- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -60,12 +60,13 @@ import android.os.ConditionVariable;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.CellSignalStrength;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -82,7 +83,6 @@ import java.util.Random;
import javax.net.ssl.SSLHandshakeException;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class NetworkMonitorTest {
diff --git a/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java b/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java
index 07ad3123bc53..b1db051d2bd8 100644
--- a/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java
+++ b/packages/NetworkStack/tests/src/com/android/server/util/SharedLogTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.net.util.SharedLog;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/res/drawable/ic_volume_remote.xml b/packages/SettingsLib/res/drawable/ic_volume_remote.xml
index fe396d9cc496..fe396d9cc496 100644
--- a/packages/SystemUI/res/drawable/ic_volume_remote.xml
+++ b/packages/SettingsLib/res/drawable/ic_volume_remote.xml
diff --git a/packages/SystemUI/res/drawable/ic_volume_remote_mute.xml b/packages/SettingsLib/res/drawable/ic_volume_remote_mute.xml
index 2e0512244ddf..2e0512244ddf 100644
--- a/packages/SystemUI/res/drawable/ic_volume_remote_mute.xml
+++ b/packages/SettingsLib/res/drawable/ic_volume_remote_mute.xml
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index c1d502e30717..bb420a6c4d12 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -209,7 +209,7 @@
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-Entsperrung"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-Entsperrung zulassen"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-Entsperrung zulassen?"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"Achtung: Die Geräteschutzfunktionen funktionieren auf diesem Gerät nicht, solange diese Einstellung aktiviert ist."</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"Achtung: Der Geräteschutz funktioniert auf diesem Gerät nicht, solange diese Einstellung aktiviert ist."</string>
<string name="mock_location_app" msgid="7966220972812881854">"App für simulierte Standorte auswählen"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"Keine App für simulierte Standorte eingerichtet"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"App für simulierte Standorte: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 293eff121b2a..f336f1b465cd 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -379,9 +379,9 @@
<string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_short" msgid="3463575350656389957">"Tiempo restante: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> según el uso"</string>
+ <string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g> (según el uso)"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
- <string name="power_discharge_by_only" msgid="107616694963545745">"Debería durar aproximadamente hasta <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_discharge_by_only" msgid="107616694963545745">"Duración aproximada hasta: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_discharge_by_only_short" msgid="1372817269546888804">"Hasta: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
<string name="power_remaining_less_than_duration" msgid="5751885147712659423">"Queda menos del <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 736b4c3d88c9..ba62c84407a9 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -234,7 +234,7 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="6893955536658137179">"Գործարկել Bluetooth աուդիո LDAC կոդեկը\nԸնտրություն՝ նվագարկման որակ"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Հեռարձակում՝ <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Մասնավոր DNS սերվեր"</string>
- <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Ընտրեք անհատական DNS սերվերի ռեժիմը"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Ընտրեք մասնավոր DNS-ի ռեժիմը"</string>
<string name="private_dns_mode_off" msgid="8236575187318721684">"Անջատված է"</string>
<string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Ավտոմատ"</string>
<string name="private_dns_mode_provider" msgid="8354935160639360804">"Մասնավոր DNS ծառայության մատակարարի խնամորդի անունը"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationAccesses.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationAccesses.java
index 4ac3ce436f82..09107ce6b77b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationAccesses.java
+++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationAccesses.java
@@ -48,6 +48,11 @@ public class RecentLocationAccesses {
// Keep last 24 hours of location app information.
private static final long RECENT_TIME_INTERVAL_MILLIS = DateUtils.DAY_IN_MILLIS;
+ /** The flags for querying ops that are trusted for showing in the UI. */
+ public static final int TRUSTED_STATE_FLAGS = AppOpsManager.OP_FLAG_SELF
+ | AppOpsManager.OP_FLAG_UNTRUSTED_PROXY
+ | AppOpsManager.OP_FLAG_TRUSTED_PROXIED;
+
@VisibleForTesting
static final int[] LOCATION_OPS = new int[]{
AppOpsManager.OP_FINE_LOCATION,
@@ -136,8 +141,7 @@ public class RecentLocationAccesses {
// Earliest time for a location access to end and still be shown in list.
long recentLocationCutoffTime = now - RECENT_TIME_INTERVAL_MILLIS;
for (AppOpsManager.OpEntry entry : entries) {
- locationAccessFinishTime = Math.max(entry.getLastAccessBackgroundTime(),
- entry.getLastAccessForegroundTime());
+ locationAccessFinishTime = entry.getLastAccessTime(TRUSTED_STATE_FLAGS);
}
// Bail out if the entry is out of date.
if (locationAccessFinishTime < recentLocationCutoffTime) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/D.java b/packages/SettingsLib/src/com/android/settingslib/volume/D.java
new file mode 100644
index 000000000000..7e0654d72b47
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/volume/D.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.volume;
+
+import android.util.Log;
+
+class D {
+ public static boolean BUG = Log.isLoggable("volume", Log.DEBUG);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java b/packages/SettingsLib/src/com/android/settingslib/volume/MediaSessions.java
index 8b00eee29c6e..4ed115405f57 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java
+++ b/packages/SettingsLib/src/com/android/settingslib/volume/MediaSessions.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.systemui.volume;
+package com.android.settingslib.volume;
import android.app.PendingIntent;
import android.content.Context;
@@ -27,7 +27,6 @@ import android.media.IRemoteVolumeController;
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaController.PlaybackInfo;
-import android.media.session.MediaSession;
import android.media.session.MediaSession.QueueItem;
import android.media.session.MediaSession.Token;
import android.media.session.MediaSessionManager;
@@ -41,7 +40,6 @@ import android.os.RemoteException;
import android.util.Log;
import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -73,16 +71,24 @@ public class MediaSessions {
mCallbacks = callbacks;
}
+ /**
+ * Dump to {@code writer}
+ */
public void dump(PrintWriter writer) {
writer.println(getClass().getSimpleName() + " state:");
- writer.print(" mInit: "); writer.println(mInit);
- writer.print(" mRecords.size: "); writer.println(mRecords.size());
+ writer.print(" mInit: ");
+ writer.println(mInit);
+ writer.print(" mRecords.size: ");
+ writer.println(mRecords.size());
int i = 0;
for (MediaControllerRecord r : mRecords.values()) {
dump(++i, writer, r.controller);
}
}
+ /**
+ * init MediaSessions
+ */
public void init() {
if (D.BUG) Log.d(TAG, "init");
// will throw if no permission
@@ -97,12 +103,18 @@ public class MediaSessions {
mHandler.sendEmptyMessage(H.UPDATE_SESSIONS);
}
+ /**
+ * Destroy MediaSessions
+ */
public void destroy() {
if (D.BUG) Log.d(TAG, "destroy");
mInit = false;
mMgr.removeOnActiveSessionsChangedListener(mSessionsListener);
}
+ /**
+ * Set volume {@code level} to remote media {@code token}
+ */
public void setVolume(Token token, int level) {
final MediaControllerRecord r = mRecords.get(token);
if (r == null) {
@@ -113,15 +125,17 @@ public class MediaSessions {
r.controller.setVolumeTo(level, 0);
}
- private void onRemoteVolumeChangedH(MediaSession.Token sessionToken, int flags) {
+ private void onRemoteVolumeChangedH(Token sessionToken, int flags) {
final MediaController controller = new MediaController(mContext, sessionToken);
- if (D.BUG) Log.d(TAG, "remoteVolumeChangedH " + controller.getPackageName() + " "
- + Util.audioManagerFlagsToString(flags));
+ if (D.BUG) {
+ Log.d(TAG, "remoteVolumeChangedH " + controller.getPackageName() + " "
+ + Util.audioManagerFlagsToString(flags));
+ }
final Token token = controller.getSessionToken();
mCallbacks.onRemoteVolumeChanged(token, flags);
}
- private void onUpdateRemoteControllerH(MediaSession.Token sessionToken) {
+ private void onUpdateRemoteControllerH(Token sessionToken) {
final MediaController controller =
sessionToken != null ? new MediaController(mContext, sessionToken) : null;
final String pkg = controller != null ? controller.getPackageName() : null;
@@ -191,7 +205,8 @@ public class MediaSessions {
if (appLabel.length() > 0) {
return appLabel;
}
- } catch (NameNotFoundException e) { }
+ } catch (NameNotFoundException e) {
+ }
return pkg;
}
@@ -240,29 +255,11 @@ public class MediaSessions {
}
}
- public static void dumpMediaSessions(Context context) {
- final MediaSessionManager mgr = (MediaSessionManager) context
- .getSystemService(Context.MEDIA_SESSION_SERVICE);
- try {
- final List<MediaController> controllers = mgr.getActiveSessions(null);
- final int N = controllers.size();
- if (D.BUG) Log.d(TAG, N + " controllers");
- for (int i = 0; i < N; i++) {
- final StringWriter sw = new StringWriter();
- final PrintWriter pw = new PrintWriter(sw, true);
- dump(i + 1, pw, controllers.get(i));
- if (D.BUG) Log.d(TAG, sw.toString());
- }
- } catch (SecurityException e) {
- Log.w(TAG, "Not allowed to get sessions", e);
- }
- }
-
private final class MediaControllerRecord extends MediaController.Callback {
- private final MediaController controller;
+ public final MediaController controller;
- private boolean sentRemote;
- private String name;
+ public boolean sentRemote;
+ public String name;
private MediaControllerRecord(MediaController controller) {
this.controller = controller;
@@ -274,8 +271,10 @@ public class MediaSessions {
@Override
public void onAudioInfoChanged(PlaybackInfo info) {
- if (D.BUG) Log.d(TAG, cb("onAudioInfoChanged") + Util.playbackInfoToString(info)
- + " sentRemote=" + sentRemote);
+ if (D.BUG) {
+ Log.d(TAG, cb("onAudioInfoChanged") + Util.playbackInfoToString(info)
+ + " sentRemote=" + sentRemote);
+ }
final boolean remote = isRemote(info);
if (!remote && sentRemote) {
mCallbacks.onRemoteRemoved(controller.getSessionToken());
@@ -324,22 +323,22 @@ public class MediaSessions {
private final OnActiveSessionsChangedListener mSessionsListener =
new OnActiveSessionsChangedListener() {
- @Override
- public void onActiveSessionsChanged(List<MediaController> controllers) {
- onActiveSessionsUpdatedH(controllers);
- }
- };
+ @Override
+ public void onActiveSessionsChanged(List<MediaController> controllers) {
+ onActiveSessionsUpdatedH(controllers);
+ }
+ };
private final IRemoteVolumeController mRvc = new IRemoteVolumeController.Stub() {
@Override
- public void remoteVolumeChanged(MediaSession.Token sessionToken, int flags)
+ public void remoteVolumeChanged(Token sessionToken, int flags)
throws RemoteException {
mHandler.obtainMessage(H.REMOTE_VOLUME_CHANGED, flags, 0,
sessionToken).sendToTarget();
}
@Override
- public void updateRemoteController(final MediaSession.Token sessionToken)
+ public void updateRemoteController(final Token sessionToken)
throws RemoteException {
mHandler.obtainMessage(H.UPDATE_REMOTE_CONTROLLER, sessionToken).sendToTarget();
}
@@ -361,18 +360,32 @@ public class MediaSessions {
onActiveSessionsUpdatedH(mMgr.getActiveSessions(null));
break;
case REMOTE_VOLUME_CHANGED:
- onRemoteVolumeChangedH((MediaSession.Token) msg.obj, msg.arg1);
+ onRemoteVolumeChangedH((Token) msg.obj, msg.arg1);
break;
case UPDATE_REMOTE_CONTROLLER:
- onUpdateRemoteControllerH((MediaSession.Token) msg.obj);
+ onUpdateRemoteControllerH((Token) msg.obj);
break;
}
}
}
+ /**
+ * Callback for remote media sessions
+ */
public interface Callbacks {
+ /**
+ * Invoked when remote media session is updated
+ */
void onRemoteUpdate(Token token, String name, PlaybackInfo pi);
+
+ /**
+ * Invoked when remote media session is removed
+ */
void onRemoteRemoved(Token t);
+
+ /**
+ * Invoked when remote volume is changed
+ */
void onRemoteVolumeChanged(Token token, int flags);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/Util.java b/packages/SettingsLib/src/com/android/settingslib/volume/Util.java
new file mode 100644
index 000000000000..4e770aeb861e
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/volume/Util.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.volume;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.MediaMetadata;
+import android.media.VolumeProvider;
+import android.media.session.MediaController.PlaybackInfo;
+import android.media.session.PlaybackState;
+import android.telephony.TelephonyManager;
+import android.widget.TextView;
+
+import java.util.Objects;
+
+/**
+ * Static helpers for the volume dialog.
+ */
+public class Util {
+
+ private static final int[] AUDIO_MANAGER_FLAGS = new int[]{
+ AudioManager.FLAG_SHOW_UI,
+ AudioManager.FLAG_VIBRATE,
+ AudioManager.FLAG_PLAY_SOUND,
+ AudioManager.FLAG_ALLOW_RINGER_MODES,
+ AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE,
+ AudioManager.FLAG_SHOW_VIBRATE_HINT,
+ AudioManager.FLAG_SHOW_SILENT_HINT,
+ AudioManager.FLAG_FROM_KEY,
+ AudioManager.FLAG_SHOW_UI_WARNINGS,
+ };
+
+ private static final String[] AUDIO_MANAGER_FLAG_NAMES = new String[]{
+ "SHOW_UI",
+ "VIBRATE",
+ "PLAY_SOUND",
+ "ALLOW_RINGER_MODES",
+ "REMOVE_SOUND_AND_VIBRATE",
+ "SHOW_VIBRATE_HINT",
+ "SHOW_SILENT_HINT",
+ "FROM_KEY",
+ "SHOW_UI_WARNINGS",
+ };
+
+ /**
+ * Extract log tag from {@code c}
+ */
+ public static String logTag(Class<?> c) {
+ final String tag = "vol." + c.getSimpleName();
+ return tag.length() < 23 ? tag : tag.substring(0, 23);
+ }
+
+ /**
+ * Convert media metadata to string
+ */
+ public static String mediaMetadataToString(MediaMetadata metadata) {
+ if (metadata == null) return null;
+ return metadata.getDescription().toString();
+ }
+
+ /**
+ * Convert playback info to string
+ */
+ public static String playbackInfoToString(PlaybackInfo info) {
+ if (info == null) return null;
+ final String type = playbackInfoTypeToString(info.getPlaybackType());
+ final String vc = volumeProviderControlToString(info.getVolumeControl());
+ return String.format("PlaybackInfo[vol=%s,max=%s,type=%s,vc=%s],atts=%s",
+ info.getCurrentVolume(), info.getMaxVolume(), type, vc, info.getAudioAttributes());
+ }
+
+ /**
+ * Convert type of playback info to string
+ */
+ public static String playbackInfoTypeToString(int type) {
+ switch (type) {
+ case PlaybackInfo.PLAYBACK_TYPE_LOCAL:
+ return "LOCAL";
+ case PlaybackInfo.PLAYBACK_TYPE_REMOTE:
+ return "REMOTE";
+ default:
+ return "UNKNOWN_" + type;
+ }
+ }
+
+ /**
+ * Convert state of playback info to string
+ */
+ public static String playbackStateStateToString(int state) {
+ switch (state) {
+ case PlaybackState.STATE_NONE:
+ return "STATE_NONE";
+ case PlaybackState.STATE_STOPPED:
+ return "STATE_STOPPED";
+ case PlaybackState.STATE_PAUSED:
+ return "STATE_PAUSED";
+ case PlaybackState.STATE_PLAYING:
+ return "STATE_PLAYING";
+ default:
+ return "UNKNOWN_" + state;
+ }
+ }
+
+ /**
+ * Convert volume provider control to string
+ */
+ public static String volumeProviderControlToString(int control) {
+ switch (control) {
+ case VolumeProvider.VOLUME_CONTROL_ABSOLUTE:
+ return "VOLUME_CONTROL_ABSOLUTE";
+ case VolumeProvider.VOLUME_CONTROL_FIXED:
+ return "VOLUME_CONTROL_FIXED";
+ case VolumeProvider.VOLUME_CONTROL_RELATIVE:
+ return "VOLUME_CONTROL_RELATIVE";
+ default:
+ return "VOLUME_CONTROL_UNKNOWN_" + control;
+ }
+ }
+
+ /**
+ * Convert {@link PlaybackState} to string
+ */
+ public static String playbackStateToString(PlaybackState playbackState) {
+ if (playbackState == null) return null;
+ return playbackStateStateToString(playbackState.getState()) + " " + playbackState;
+ }
+
+ /**
+ * Convert audio manager flags to string
+ */
+ public static String audioManagerFlagsToString(int value) {
+ return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES);
+ }
+
+ protected static String bitFieldToString(int value, int[] values, String[] names) {
+ if (value == 0) return "";
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < values.length; i++) {
+ if ((value & values[i]) != 0) {
+ if (sb.length() > 0) sb.append(',');
+ sb.append(names[i]);
+ }
+ value &= ~values[i];
+ }
+ if (value != 0) {
+ if (sb.length() > 0) sb.append(',');
+ sb.append("UNKNOWN_").append(value);
+ }
+ return sb.toString();
+ }
+
+ private static CharSequence emptyToNull(CharSequence str) {
+ return str == null || str.length() == 0 ? null : str;
+ }
+
+ /**
+ * Set text for specific {@link TextView}
+ */
+ public static boolean setText(TextView tv, CharSequence text) {
+ if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false;
+ tv.setText(text);
+ return true;
+ }
+
+ /**
+ * Return {@code true} if it is voice capable
+ */
+ public static boolean isVoiceCapable(Context context) {
+ final TelephonyManager telephony =
+ (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ return telephony != null && telephony.isVoiceCapable();
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 43affcdfefe9..3dd3fb6643a9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -1047,20 +1047,22 @@ public class AccessPoint implements Comparable<AccessPoint> {
* match based on SSID and security.
*/
private boolean isInfoForThisAccessPoint(WifiConfiguration config, WifiInfo info) {
- if (info.isOsuAp()) {
- return (mOsuStatus != null);
+ if (info.isOsuAp() || mOsuStatus != null) {
+ return (info.isOsuAp() && mOsuStatus != null);
+ } else if (info.isPasspointAp() || isPasspoint()) {
+ return (info.isPasspointAp() && isPasspoint()
+ && TextUtils.equals(info.getFqdn(), mConfig.FQDN));
}
- if (isPasspoint() == false && networkId != WifiConfiguration.INVALID_NETWORK_ID) {
+ if (networkId != WifiConfiguration.INVALID_NETWORK_ID) {
return networkId == info.getNetworkId();
} else if (config != null) {
- return matches(config);
- }
- else {
+ return TextUtils.equals(getKey(config), getKey());
+ } else {
// Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID.
// (Note that we only do this if the WifiConfiguration explicitly equals INVALID).
// TODO: Handle hex string SSIDs.
- return ssid.equals(removeDoubleQuotes(info.getSSID()));
+ return TextUtils.equals(removeDoubleQuotes(info.getSSID()), ssid);
}
}
@@ -1207,7 +1209,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
final int oldLevel = getLevel();
if (info != null && isInfoForThisAccessPoint(config, info)) {
updated = (mInfo == null);
- if (mConfig != config) {
+ if (!isPasspoint() && mConfig != config) {
// We do not set updated = true as we do not want to increase the amount of sorting
// and copying performed in WifiTracker at this time. If issues involving refresh
// are still seen, we will investigate further.
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 8ea0f4b6ba61..9ce6b34ecd46 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -1068,7 +1068,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
}
// Get and cache advanced capabilities
- final boolean isOweSupported = mWifiManager.isOweSupported();
+ final boolean isOweSupported = mWifiManager.isEnhancedOpenSupported();
final boolean isSaeSupported = mWifiManager.isWpa3SaeSupported();
final boolean isSuiteBSupported = mWifiManager.isWpa3SuiteBSupported();
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 5e3472b830a0..f5ead0c1c55b 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -84,6 +85,7 @@ public class AccessPointTest {
20 * DateUtils.MINUTE_IN_MILLIS;;
private Context mContext;
+ private WifiInfo mWifiInfo;
@Mock private RssiCurve mockBadgeCurve;
@Mock private WifiNetworkScoreCache mockWifiNetworkScoreCache;
public static final int NETWORK_ID = 123;
@@ -103,6 +105,9 @@ public class AccessPointTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = InstrumentationRegistry.getTargetContext();
+ mWifiInfo = new WifiInfo();
+ mWifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
+ mWifiInfo.setBSSID(TEST_BSSID);
WifiTracker.sVerboseLogging = false;
}
@@ -1160,4 +1165,56 @@ public class AccessPointTest {
// Fast should still be returned since cache was updated with recent time
assertThat(ap.getSpeed()).isEqualTo(newSpeed);
}
+
+ /**
+ * Verifies that a Passpoint WifiInfo updates the matching Passpoint AP
+ */
+ @Test
+ public void testUpdate_passpointWifiInfo_updatesPasspointAccessPoint() {
+ mWifiInfo.setFQDN("fqdn");
+ mWifiInfo.setProviderFriendlyName("providerFriendlyName");
+
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ spyConfig.SSID = TEST_SSID;
+ spyConfig.BSSID = TEST_BSSID;
+ spyConfig.FQDN = "fqdn";
+ spyConfig.providerFriendlyName = "providerFriendlyName";
+ AccessPoint passpointAp = new AccessPoint(mContext, spyConfig);
+
+ assertThat(passpointAp.update(null, mWifiInfo, null)).isTrue();
+ }
+
+ /**
+ * Verifies that a Passpoint WifiInfo does not update a non-Passpoint AP with the same SSID.
+ */
+ @Test
+ public void testUpdate_passpointWifiInfo_doesNotUpdateNonPasspointAccessPoint() {
+ mWifiInfo.setFQDN("fqdn");
+ mWifiInfo.setProviderFriendlyName("providerFriendlyName");
+
+ AccessPoint ap = new TestAccessPointBuilder(mContext)
+ .setSsid(TEST_SSID)
+ .setBssid(TEST_BSSID)
+ .setScanResults(SCAN_RESULTS)
+ .build();
+
+ assertThat(ap.update(null, mWifiInfo, null)).isFalse();
+ }
+
+ /**
+ * Verifies that a non-Passpoint WifiInfo does not update a Passpoint AP with the same SSID.
+ */
+ @Test
+ public void testUpdate_nonPasspointWifiInfo_doesNotUpdatePasspointAccessPoint() {
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ spyConfig.SSID = TEST_SSID;
+ spyConfig.BSSID = TEST_BSSID;
+ spyConfig.FQDN = "fqdn";
+ spyConfig.providerFriendlyName = "providerFriendlyName";
+ AccessPoint passpointAp = new AccessPoint(mContext, spyConfig);
+
+ assertThat(passpointAp.update(null, mWifiInfo, null)).isFalse();
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
index d5b89ca719ad..c1c5fa932b0c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAccessesTest.java
@@ -17,6 +17,7 @@ import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.LongSparseLongArray;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -152,11 +153,12 @@ public class RecentLocationAccessesTest {
}
private OpEntry createOpEntryWithTime(int op, long time) {
- final long[] times = new long[AppOpsManager._NUM_UID_STATE];
// Slot for background access timestamp.
- times[AppOpsManager.UID_STATE_LAST_NON_RESTRICTED + 1] = time;
- final long[] rejectTimes = new long[AppOpsManager._NUM_UID_STATE];
- return new OpEntry(op, AppOpsManager.MODE_ALLOWED, times, rejectTimes, 0 /* duration */,
- 0 /* proxyUid */, "" /* proxyPackage */);
+ final LongSparseLongArray accessTimes = new LongSparseLongArray();
+ accessTimes.put(AppOpsManager.makeKey(AppOpsManager.UID_STATE_BACKGROUND,
+ AppOpsManager.OP_FLAG_SELF), time);
+
+ return new OpEntry(op, false, AppOpsManager.MODE_ALLOWED, accessTimes, null /*durations*/,
+ null /*rejectTimes*/, null /* proxyUids */, null /* proxyPackages */);
}
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java
index 08d536720029..8bd5fd2163ae 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java
@@ -17,6 +17,7 @@ import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.LongSparseLongArray;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -153,6 +154,13 @@ public class RecentLocationAppsTest {
}
private OpEntry createOpEntryWithTime(int op, long time, int duration) {
- return new OpEntry(op, AppOpsManager.MODE_ALLOWED, time, 0L, duration, 0, "");
+ final LongSparseLongArray accessTimes = new LongSparseLongArray();
+ accessTimes.put(AppOpsManager.makeKey(AppOpsManager.UID_STATE_TOP,
+ AppOpsManager.OP_FLAG_SELF), time);
+ final LongSparseLongArray durations = new LongSparseLongArray();
+ durations.put(AppOpsManager.makeKey(AppOpsManager.UID_STATE_TOP,
+ AppOpsManager.OP_FLAG_SELF), duration);
+ return new OpEntry(op, false, AppOpsManager.MODE_ALLOWED, accessTimes,
+ null /*rejectTimes*/, durations, null /* proxyUids */, null /* proxyPackages */);
}
}
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 29ae1b29792b..94259416d274 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -58,6 +58,7 @@ android_library {
"androidx.arch.core_core-runtime",
"androidx.lifecycle_lifecycle-extensions",
"androidx.dynamicanimation_dynamicanimation",
+ "iconloader_base",
"SystemUI-tags",
"SystemUI-proto",
"dagger2-2.19",
@@ -113,7 +114,7 @@ android_library {
"SystemUI-tags",
"SystemUI-proto",
"metrics-helper-lib",
- "android-support-test",
+ "androidx.test.rules", "hamcrest-library",
"mockito-target-inline-minus-junit4",
"testables",
"truth-prebuilt",
diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png
deleted file mode 100644
index 035a4dffb026..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/default_preview.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
index 0bc13199d71e..f945b1014610 100644
--- a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
+++ b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml
@@ -21,9 +21,9 @@
>
<TextClock
android:id="@+id/digital_clock"
- android:layout_marginLeft="20dp"
+ android:paddingStart="20dp"
android:layout_marginTop="72dp"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:textSize="44dp"
diff --git a/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml
index 116a044a7075..dd25df864733 100644
--- a/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml
+++ b/packages/SystemUI/res-keyguard/layout/stretchanalog_clock.xml
@@ -21,9 +21,9 @@
>
<TextClock
android:id="@+id/digital_clock"
- android:layout_marginLeft="20dp"
+ android:paddingStart="20dp"
android:layout_marginTop="72dp"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:textSize="44dp"
diff --git a/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
index 5bcc1b3b49bf..b969a1527c09 100644
--- a/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml
@@ -39,17 +39,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_title_device_owned"
- style="@style/TextAppearance.DeviceManagementDialog.Title"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/DeviceManagementDialogTitle"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/device_management_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@null"
- style="@android:style/TextAppearance.Material.Subhead"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.DeviceManagementDialog.Content"
/>
</LinearLayout>
@@ -64,17 +61,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_ca_certificate"
- style="@style/TextAppearance.DeviceManagementDialog.Title"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/DeviceManagementDialogTitle"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/ca_certs_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@null"
- style="@android:style/TextAppearance.Material.Subhead"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.DeviceManagementDialog.Content"
/>
</LinearLayout>
@@ -89,17 +83,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_network_logging"
- style="@style/TextAppearance.DeviceManagementDialog.Title"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/DeviceManagementDialogTitle"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/network_logging_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@null"
- style="@android:style/TextAppearance.Material.Subhead"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.DeviceManagementDialog.Content"
/>
</LinearLayout>
@@ -114,17 +105,14 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/monitoring_subtitle_vpn"
- style="@style/TextAppearance.DeviceManagementDialog.Title"
- android:textColor="?android:attr/textColorPrimary"
+ style="@style/DeviceManagementDialogTitle"
android:paddingBottom="@dimen/qs_footer_dialog_subtitle_padding"
/>
<TextView
android:id="@+id/vpn_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@null"
- style="@android:style/TextAppearance.Material.Subhead"
- android:textColor="?android:attr/textColorPrimary"
+ android:textAppearance="@style/TextAppearance.DeviceManagementDialog.Content"
/>
</LinearLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
index cdad94bd1b22..8dcddc28c3b7 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
@@ -31,7 +31,7 @@
android:paddingStart="48dp"
android:paddingTop="43dp"
android:text="@string/screen_pinning_title"
- android:textColor="@color/screen_pinning_primary_text"
+ android:textColor="@android:color/white"
android:textSize="24sp" />
<TextView
@@ -43,7 +43,7 @@
android:paddingStart="48dp"
android:paddingTop="12.6dp"
android:text="@string/screen_pinning_description"
- android:textColor="@color/screen_pinning_primary_text"
+ android:textColor="@android:color/white"
android:textSize="16sp" />
<Button
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 2f316cfea2c9..9ff72e87f33e 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi is aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen Wi-Fi-netwerke beskikbaar nie"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Skakel tans aan …"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Saai uit"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Saai tans uit"</string>
<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>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batterybespaarder is aan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Verminder werkverrigting en agtergronddata"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Skakel Batterybespaarder af"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sal alles begin vasvang wat op jou skerm gewys word."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sal begin om alles op jou skerm vas te vang, insluitend kennisgewings, wagwoorde, foto\'s, boodskappe en betaalinligting."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Laat <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> toe om jou skerm op te neem of uit te saai?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Moenie weer wys nie"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Vee alles uit"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Bestuur"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Foon raak warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sommige kenmerke is beperk terwyl foon afkoel"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Jou foon sal outomaties probeer om af te koel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger wees.\n\nJou foon sal normaalweg werk nadat dit afgekoel het."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Trek laaier uit"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Kan nie hierdie toestel laai nie. Trek die kragprop uit, en wees versigtig, want die kabel kan warm wees."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Sien versorgingstappe"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Links-kortpad"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Regs-kortpad"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Links-kortpad ontsluit ook"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 00ac9ab8dfe1..9a3aa2b0d0e8 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"በማብራት ላይ..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ለመውሰድ ዝግጁ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ባትሪ ቆጣቢ በርቷል"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"አፈጻጸምን እና የጀርባ ውሂብ ይቀንሳል"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ባትሪ ቆጣቢን አጥፋ"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በማያ ገጽዎ ላይ የታየውን ነገር በሙሉ ማንሳት ይጀምራል።"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ማሳወቂያዎችን፣ የይለፍ ቅቃላትን፣ ፎቶዎችን፣ መልዕክቶችን እና የክፍያ መረጃን ጨምሮ በማያ ገጽዎ ያለ ነገር ሁሉ መቅረጽ ይጀምራል።"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ማያ ገጽዎን እንዲቀርጽ ወይም cast እንዲያደርግ ይፈቀድለት?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ዳግመኛ አታሳይ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ሁሉንም አጽዳ"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ያቀናብሩ"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ስልኩ እየሞቀ ነው"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ስልኩ እየቀዘቀዘ ሳለ አንዳንድ ባህሪዎች ይገደባሉ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"የእርስዎ ስልክ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ስልክዎን መጠቀም ይችላሉ፣ ነገር ግን ሊንቀራፈፍ ይችላል።\n\nአንዴ ስልክዎ ከቀዘቀዘ በኋላ በመደበኝነት ያሄዳል።"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ኃይል መሙያን ይንቀሉ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"የዚህን መሣሪያ ባትሪ መሙላት ላይ ችግር አለ። የኃይል አስማሚውን ይንቀሉትና ሊግል ስለሚችል ገመዱን ይጠብቁት።"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"የእንክብካቤ ደረጃዎችን ይመልከቱ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"የግራ አቋራጭ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"የቀኝ አቋራጭ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"የግራ አቋራጭ እንዲሁም ይከፍታል"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index eceb54fd8970..0398dcca7c07 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -329,7 +329,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"‏تم تشغيل Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"‏لا تتوفر أي شبكة Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"جارٍ التفعيل…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"الإرسال"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"جارٍ الإرسال"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"جهاز لا يحمل اسمًا"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"جاهز للإرسال"</string>
@@ -449,7 +450,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"تم تفعيل ميزة توفير شحن البطارية"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"لخفض مستوى الأداء وبيانات الخلفية"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"إيقاف ميزة توفير شحن البطارية"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> سيبدأ التقاط كل شيء يتم عرضه على الشاشة."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"سيبدأ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> في التقاط كل ما يظهر على شاشتك بما في ذلك الإشعارات وكلمات المرور والصور والرسائل ومعلومات الدفع."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"هل تريد السماح لـ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> بتسجيل شاشتك أو إرسال محتواها؟"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"عدم الإظهار مرة أخرى"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"محو الكل"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"إدارة"</string>
@@ -834,6 +836,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"تزداد درجة حرارة الهاتف"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"يتم تقييد عمل بعض الميزات إلى أن تنخفض درجة حرارة الهاتف"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"سيحاول الهاتف تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام هاتفك، ولكن قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الهاتف، سيستعيد سرعته المعتادة."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"فصل الشاحن"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"هناك مشكلة في شحن هذا الجهاز. يُرجى فصل محوِّل الطاقة بحرص لأن الكابل قد يكون ساخنًا."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"الاطّلاع على خطوات العناية"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"اختصار اليسار"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"اختصار اليمين"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"اختصار اليسار يلغي أيضًا تأمين"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 53eb4cd343f5..ef969abe2376 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ৱাই-ফাই অন হৈ আছে"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ৱাই-ফাই নেটৱৰ্ক নাই"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"অন কৰি থকা হৈছে…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাষ্ট"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"কাষ্টিং"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নাম নথকা ডিভাইচ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাষ্টৰ বাবে সাজু"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"বেটাৰি সঞ্চয়কাৰী অন হৈ আছে"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"বেটাৰি সঞ্চয়কাৰী অফ কৰক"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা সকলো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> কেপশ্বাৰ কৰা আৰম্ভ কৰিব।"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>এ আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা জাননী, পাছৱৰ্ড, ফট’, বাৰ্তা আৰু পৰিশোধ সম্পৰ্কীয় তথ্য আদিকে ধৰি সকলো কেপশ্বাৰ কৰিবলৈ আৰম্ভ কৰিব।"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ক আপোনাৰ স্ক্ৰীণ ৰেকৰ্ড বা কাষ্ট কৰিবলৈ অনুমতি দিবনে?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"পুনৰাই নেদেখুৱাব"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"সকলো মচক"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"পৰিচালনা"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ফ\'নটো গৰম হ\'বলৈ ধৰিছে"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ফ\'নটো ঠাণ্ডা হৈ থকা সময়ত কিছুমান সুবিধা উপলব্ধ নহ’ব"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"চ্চার্জাৰ আনপ্লাগ কৰক"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"এই ডিভাইচটো চ্চার্জ কৰোঁতে কিবা সমস্যা হৈছে। পাৱাৰ এডাপ্টাৰটো আনপ্লাগ কৰক, কেব’লডাল গৰম হ’ব পাৰে গতিকে সাবধান হ’ব।"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"বাওঁ শ্বৰ্টকাট"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"সোঁ শ্বৰ্টকাট"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"বাওঁ শ্বৰ্টকাটটোৱেও আনলক কৰিব"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 3b18e341ccd2..ab5c1f55d149 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiv edilir..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayım"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Yayıma hazırdır"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batareya Qənaəti aktivdir"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Performansı azaldır və arxa fon datasını məhdudlaşdırır"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Batareya Qənaətini deaktiv edin"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranınızda olan hər şeyin şəklini çəkəcək."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bildiriş, parol, foto, mesaj və ödəniş məlumatı daxil olmaqla ekranda görünən hər şeyi çəkməyə başlayacaq."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranı qeydə alsın və ya yayımlasın?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Daha göstərmə"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hamısını silin"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"İdarə edin"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon qızmağa başlayır"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon soyuyana kimi bəzi funksiyalar məhdudlaşdırılır"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonunuz avtomatik olaraq soyumağa başlayacaq. Telefon istifadəsinə davam edə bilərsiniz, lakin sürəti yavaşlaya bilər.\n\nTelefonunuz soyuduqdan sonra normal işləyəcək."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Adapteri cərəyandan ayırın"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Bu cihazın batareya yığmasında problem var. Adapteri cərəyandan ayırın. Ehtiyatlı olun, kabel isti ola bilər."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ehtiyat tədbiri mərhələlərinə baxın"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Sol qısayol"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Sağ qısayol"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Sol qısayol kiliddən çıxır"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 524de49eb9cc..05eea12533dd 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključuje se..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Prebacivanje"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spremno za prebacivanje"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Ušteda baterije je uključena"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Smanjuje performanse i pozadinske podatke"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Isključi Uštedu baterije"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi da snima sve što se prikazuje na ekranu."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi da snima sve na ekranu, uključujući obaveštenja, lozinke, slike, poruke i informacije o plaćanju."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Želite li da dozvolite da <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> snima ili prebacuje sadržaj ekrana?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Obriši sve"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Upravljajte"</string>
@@ -819,6 +821,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zagrejao"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke funkcije su ograničene dok se telefon ne ohladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon će automatski pokušati da se ohladi. I dalje ćete moći da koristite telefon, ali će sporije reagovati.\n\nKada se telefon ohladi, normalno će raditi."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Isključite punjač iz napajanja"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Došlo je do problema sa punjenjem ovog uređaja. Isključite adapter iz napajanja i budite pažljivi jer kabl može da bude topao."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Pogledajte upozorenja"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Leva prečica"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desna prečica"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"I leva prečica otključava"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 94aba0b9760c..e2f8afdd371b 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -329,7 +329,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi уключаны"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма даступнай сеткі Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Уключэнне…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляцыя"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Ідзе перадача"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Прылада без назвы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Гатова для трансляцыі"</string>
@@ -445,7 +446,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Рэжым эканоміі зараду ўключаны"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Памяншае прадукцыйнасць і фонавую перадачу даных"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Адключыць рэжым эканоміі зараду"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> атрымае доступ да ўсяго, што адлюстроўваецца на вашым экране."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> пачне адсочваць усё, што паказваецца на вашым экране: апавяшчэнні, паролі, фатаграфіі, паведамленні, плацежную інфармацыю і іншае."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Дазволіць праграме \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" запісваць ці трансліраваць ваш экран?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не паказваць зноў"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ачысціць усё"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Кіраваць"</string>
@@ -826,6 +828,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Тэлефон награваецца"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Некаторыя функцыі абмежаваны, пакуль тэлефон астывае"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ваш тэлефон аўтаматычна паспрабуе астыць. Вы можаце па-ранейшаму карыстацца сваім тэлефонам, але ён можа працаваць больш павольна.\n\nПасля таго як ваш тэлефон астыне, ён будзе працаваць у звычайным рэжыме."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Адключыце зарадную прыладу"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Узнікла праблема з зарадкай гэтай прылады. Адключыце адаптар сілкавання і праверце, ці не нагрэўся кабель."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Глядзець паэтапную дапамогу"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ярлык \"улева\""</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Ярлык \"управа\""</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Разблакіроўка таксама ярлыком \"улева\""</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index cfc9fe1bfcef..10a5ecb740b9 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Функцията за Wi-Fi е включена"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма налични Wi-Fi мрежи"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Включва се..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Предаване"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Предава се"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Устройство без име"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово за предаване"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Режимът за запазване на батерията е включен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Намалява ефективността и данните на заден план"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Изключване на режима за запазване на батерията"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ще започне да заснема всичко, което се показва на екрана ви."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ще започне да записва всичко на екрана ви, включително известията, паролите, снимките, съобщенията и данните за плащане."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Да се разреши ли на <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> да записва или предава екрана ви?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Да не се показва отново"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Изчистване на всички"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Управление"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефонът загрява"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Някои функции са ограничени, докато телефонът се охлажда"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Телефонът ви автоматично ще направи опит за охлаждане. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Изключете зарядното устройство"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"При зареждането на това устройство възникна проблем. Изключете захранващия адаптер и внимавайте, тъй като кабелът може да е топъл."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Вижте стъпките, които да предприемете"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ляв пряк път"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Десен пряк път"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Левият пряк път също служи за отключване"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index a2e57d05aaa0..bff2ade21a07 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"চালু করা হচ্ছে…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাস্ট করুন"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাস্ট করার জন্য প্রস্তুত"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ব্যাটারি সেভার চালু আছে"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"কার্য-সম্পাদনা ও পশ্চাদপট ডেটাকে কমিয়ে দেয়"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ব্যাটারি সেভার বন্ধ করুন"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> আপনার স্ক্রীনে দেখানো সব কিছু ক্যাপচার করা শুরু করবে।"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"বিজ্ঞপ্তি, পাসওয়ার্ড, ফটো, মেসেজ এবং পেমেন্টের তথ্য সহ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> আপনার স্ক্রিনে সবকিছু ক্যাপচার করা শুরু করবে।"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-কে আপনার স্ক্রিন রেকর্ড বা কাস্ট করতে দিতে চান?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"আর দেখাবেন না"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"সবকিছু সাফ করুন"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"পরিচালনা করুন"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ফোনটি গরম হচ্ছে"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ফোনটি ঠাণ্ডা হওয়ার সময় কিছু বৈশিষ্ট্য সীমিত হতে পারে"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"আপনার ফোনটি নিজে থেকেই ঠাণ্ডা হওয়ার চেষ্টা করবে৷ আপনি তবুও আপনার ফোন ব্যবহার করতে পারেন, কিন্তু এটি একটু ধীরে চলতে পারে৷\n\nআপনার ফোনটি পুরোপুরি ঠাণ্ডা হয়ে গেলে এটি স্বাভাবিকভাবে চলবে৷"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"চার্জার আনপ্লাগ করুন"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"এই ডিভাইস চার্জ করার সময় সমস্যা হয়েছে। চার্জিং কেবলটি হয়ত গরম হয়ে গেছে, পাওয়ার অ্যাডাপ্টারটি আনপ্লাগ করুন।"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"কী করতে হবে ধাপে ধাপে দেখুন"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"বাঁদিকের শর্টকাট"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ডানদিকের শর্টকাট"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"বাঁদিকের শর্টকাট দিয়েও আনলক করা যায়"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 5822d75ab6af..be07da371754 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nema dostupnih WiFi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključivanje…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<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>
@@ -400,10 +401,10 @@
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"Potpuna\ntišina"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Samo\nprioritetni prekidi"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Samo\nalarmi"</string>
- <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bežično punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja)"</string>
- <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja)"</string>
- <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja)"</string>
- <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do kraja)"</string>
+ <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Bežično punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
+ <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
+ <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
+ <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Brzo punjenje (još <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> do napunjenosti"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Zamijeni korisnika"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Zamijeni korisnika. Trenutni korisnik je <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Trenutni korisnik <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Uključena je Ušteda baterije"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Minimizira rad i prijenos podataka u pozadini"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Isključi Uštedu baterije"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi snimati sve što se prikaže na ekranu."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi snimati sve na vašem ekranu uključujući obavještenja, lozinke, fotografije, poruke i informacije o plaćanju."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Dozvoliti aplikaciji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> da snima ili emitira vaš ekran?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj opet"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Očisti sve"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Upravljaj"</string>
@@ -821,6 +823,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se pregrijava"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke funkcije su ograničene dok se telefon hladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristi telefon, ali će možda raditi sporije.\n\nNakon što se ohladi, telefon će normalno raditi."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Isključite punjač"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Došlo je do problema prilikom punjenja ovog uređaja. Pažljivo isključite adapter za napajanje jer je moguće da je kabl vruć."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Prikaz koraka za zaštitu"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Prečica lijevo"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Prečica desno"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Prečica lijevo također otključava"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 03a6d8b260bb..faf2833ff626 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"La Wi-Fi està activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hi ha cap xarxa Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"S\'està activant…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emet"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"A punt per emetre"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"S\'ha activat l\'estalvi de bateria"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Redueix el rendiment i l\'ús de les dades en segon pla."</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desactiva l\'estalvi de bateria"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> començarà a gravar tot el que es mostri a la pantalla."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> començarà a capturar tot el que es mostri a la pantalla, com ara els missatges, les notificacions, les contrasenyes, les fotos i la informació de pagament."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vols permetre que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> gravi o emeti la pantalla?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No ho tornis a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Esborra-ho tot"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gestió"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"El telèfon s\'està escalfant"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Algunes funcions estaran limitades mentre el telèfon es refreda"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconnecta el carregador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"No es pot carregar el dispositiu. Desconnecta l\'adaptador de corrent amb compte, ja que el cable podria estar calent."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Mostra els pasos de manteniment"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Drecera de l\'esquerra"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Drecera de la dreta"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"La drecera de l\'esquerra també desbloqueja el dispositiu"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 98f332a5fb42..a0481a2fd10f 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Zapínání…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Odesílání"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Připraveno k vysílání"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Spořič baterie je zapnutý"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Omezuje výkon a data na pozadí"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Vypnout spořič baterie"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávat vše, co je zobrazeno na obrazovce."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávat vše na obrazovce, včetně oznámení, hesel, fotek, zpráv a platebních údajů."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Povolit aplikaci <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nahrávat nebo odesílat obrazovku?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Tuto zprávu příště nezobrazovat"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Smazat vše"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Spravovat"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zahřívá"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Některé funkce jsou při chladnutí omezeny"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Odpojte nabíječku"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Při nabíjení zařízení došlo k problému. Odpojte napájecí adaptér (dávejte pozor, kabel může být horký)."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Zobrazit pokyny, co dělat"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Zkratka vlevo"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Zkratka vpravo"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Zkratka vlevo také odemyká"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 355507b1dbae..9ab535080aeb 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er slået til"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Der er ingen tilgængelige Wi-Fi-netværk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiverer…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Caster"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhed uden navn"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klar til at caste"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batterisparefunktion er aktiveret"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reducerer ydeevne og baggrundsdata"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Deaktiver batterisparefunktion"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vil begynde at optage alt, hvad der vises på din skærm."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> går i gang med at optage alt på din skærm, bl.a. notifikationer, adgangskoder, billeder, beskeder og betalingsoplysninger."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vil du tillade, at <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> optager eller caster din skærm?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Vis ikke igen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ryd alt"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Administrer"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefonen er ved at blive varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Nogle funktioner er begrænsede, mens telefonen køler ned"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Din telefon forsøger automatisk at køle ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere.\n\nNår din telefon er kølet ned, fungerer den normalt igen."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Frakobl opladeren"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Der er et problem med opladning af denne enhed. Frakobl strømadapteren, og vær forsigtig, da kablet kan være varmt."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Se vejledningen i pleje"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Venstre genvej"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Højre genvej"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Venstre genvej låser også op"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index c323fe6be85a..e22c641c0cce 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -329,7 +329,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN an"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Keine WLANs verfügbar"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Wird aktiviert…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Streamen"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Wird übertragen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unbenanntes Gerät"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Startklar"</string>
@@ -441,7 +442,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Energiesparmodus ist aktiviert"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduzierung der Leistung und Hintergrunddaten"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Energiesparmodus deaktivieren"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nimmt alle auf deinem Bildschirm angezeigten Aktivitäten auf."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> beginnt damit, alles auf deinem Bildschirm zu erfassen, z. B. Benachrichtigungen, Passwörter, Fotos, Nachrichten und Zahlungsinformationen."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Darf <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> deinen Bildschirm aufzeichnen oder streamen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nicht mehr anzeigen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Alle löschen"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Verwalten"</string>
@@ -818,6 +820,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Smartphone wird warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Dein Smartphone kühlt sich automatisch ab. Du kannst dein Smartphone weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Ladegerät vom Stromnetz trennen"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Beim Laden dieses Geräts ist ein Problem aufgetreten. Trenne das Netzteil vom Stromnetz. Sei dabei vorsichtig, denn das Netzteil oder das Kabel könnte heiß sein."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Schritte zur Fehlerbehebung ansehen"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Linke Verknüpfung"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Rechte Verknüpfung"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Linke Verknüpfung entsperrt außerdem"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index c9bd65c7d239..28239ae64dca 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Ενεργό Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Δεν υπάρχουν διαθέσιμα δίκτυα Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ενεργοποίηση…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Μετάδοση"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Μετάδοση"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ανώνυμη συσκευή"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Έτοιμο για μετάδοση"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Μειώνει την απόδοση και τα δεδομένα παρασκηνίου"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Απενεργοποίηση Εξοικονόμησης μπαταρίας"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Θα ξεκινήσει η καταγραφή του περιεχομένου που εμφανίζεται στην οθόνη σας από την εφαρμογή <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Το <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> θα ξεκινήσει τη λήψη όλου του περιεχομένου της οθόνης σας, συμπεριλαμβανομένων ειδοποιήσεων, κωδικών πρόσβασης, φωτογραφιών, μηνυμάτων και στοιχείων πληρωμής."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Να επιτρέπεται στο <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> η εγγραφή ή μετάδοση της οθόνης σας;"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Να μην εμφανιστεί ξανά"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Διαγραφή όλων"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Διαχείριση"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Αύξηση θερμοκρασίας τηλεφώνου"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Το τηλέφωνό σας θα προσπαθήσει να μειώσει αυτόματα τη θερμοκρασία. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του τηλεφώνου σας, θα λειτουργεί ξανά κανονικά."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Αποσυνδέστε τον φορτιστή"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Υπάρχει κάποιο πρόβλημα με τη φόρτιση αυτής της συσκευής. Αποσυνδέστε τον μετασχηματιστή με προσοχή, λαμβάνοντας υπόψη ότι το καλώδιο μπορεί να είναι ζεστό."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Δείτε βήματα αντιμετώπισης"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Αριστερή συντόμευση"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Δεξιά συντόμευση"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Επίσης, η αριστερή συντόμευση ξεκλειδώνει"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index e82429b789a3..d63a8fd4f969 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Battery Saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Turn off Battery Saver"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything on your screen including notifications, passwords, photos, messages and payment information."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Allow <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> to record or cast your screen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Unplug charger"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"See care steps"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index ffcd86d47b94..6f510b635f0f 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Battery Saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Turn off Battery Saver"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything on your screen including notifications, passwords, photos, messages and payment information."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Allow <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> to record or cast your screen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Unplug charger"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"See care steps"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index e82429b789a3..d63a8fd4f969 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Battery Saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Turn off Battery Saver"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything on your screen including notifications, passwords, photos, messages and payment information."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Allow <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> to record or cast your screen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Unplug charger"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"See care steps"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index e82429b789a3..d63a8fd4f969 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Turning on…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ready to cast"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Battery Saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Turn off Battery Saver"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything on your screen including notifications, passwords, photos, messages and payment information."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Allow <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> to record or cast your screen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Phone is getting warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Some features limited while phone cools down"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Unplug charger"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"There’s an issue charging this device. Unplug the power adaptor, and take care as the cable may be warm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"See care steps"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Left shortcut"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Right shortcut"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Left shortcut also unlocks"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index a9821bdd0d43..c8887de98b71 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎Wi-Fi On‎‏‎‎‏‎"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎No Wi-Fi networks available‎‏‎‎‏‎"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎Turning on…‎‏‎‎‏‎"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎Cast‎‏‎‎‏‎"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‎Casting‎‏‎‎‏‎"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‎Unnamed device‎‏‎‎‏‎"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎Ready to cast‎‏‎‎‏‎"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Battery Saver is on‎‏‎‎‏‎"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎Reduces performance and background data‎‏‎‎‏‎"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‎Turn off Battery Saver‎‏‎‎‏‎"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‎‏‎‎‏‏‏‎ will start capturing everything that\'s displayed on your screen.‎‏‎‎‏‎"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‎‏‎‎‏‏‏‎ will start capturing everything on your screen including notifications, passwords, photos, messages and payment information.‎‏‎‎‏‎"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‏‎Allow ‎‏‎‎‏‏‎<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>‎‏‎‎‏‏‏‎ to record or cast your screen?‎‏‎‎‏‎"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎Don\'t show again‎‏‎‎‏‎"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎Clear all‎‏‎‎‏‎"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎Manage‎‏‎‎‏‎"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‎‎Phone is getting warm‎‏‎‎‏‎"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎Some features limited while phone cools down‎‏‎‎‏‎"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎Your phone will automatically try to cool down. You can still use your phone, but it may run slower.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Once your phone has cooled down, it will run normally.‎‏‎‎‏‎"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎Unplug charger‎‏‎‎‏‎"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎There’s an issue charging this device. Unplug the power adapter, and take care as the cable may be warm.‎‏‎‎‏‎"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎See care steps‎‏‎‎‏‎"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎Left shortcut‎‏‎‎‏‎"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎Right shortcut‎‏‎‎‏‎"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎Left shortcut also unlocks‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index a2eb86fa426b..647346c161c5 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay redes Wi-Fi disponibles"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitiendo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para transmitir"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"El Ahorro de batería está activado"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el uso de datos en segundo plano."</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desactivar el Ahorro de batería"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comenzará la captura de todo lo que se muestre en la pantalla."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comenzará a capturar todo lo que aparezca en la pantalla como notificaciones, contraseñas, fotos, información de pago y mensajes."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"¿Quieres permitir que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grabe o transmita la pantalla?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Administrar"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"El teléfono se está calentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Se limitarán algunas funciones mientras se enfría el teléfono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar correctamente."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconectar cargador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"No se puede cargar el dispositivo. Desconecta el adaptador de la corriente con cuidado, ya que el cable podría estar caliente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver pasos de mantenimiento"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Acceso directo izquierdo"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Acceso directo derecho"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"El acceso directo izquierdo también lo desbloquea"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index e1418d2702fe..27784abfe678 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay ninguna red Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Enviar"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Enviando"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para enviar"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Ahorro de batería activado"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y los datos en segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desactivar Ahorro de batería"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla, como notificaciones, contraseñas, fotos, mensajes y datos de pago."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"¿Quieres permitir que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grabe o envíe el contenido de tu pantalla?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gestionar"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"El teléfono se está calentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Se limitan algunas funciones mientras el teléfono se enfría"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconecta el cargador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"No se puede cargar el dispositivo. Desconecta el adaptador de corriente con cuidado, ya que el cable puede estar caliente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver pasos de mantenimiento"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Acceso directo a la izquierda"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Acceso directo a la derecha"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Desbloquear también con el acceso directo a la izquierda"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index dae607b86c52..633c16413280 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi on sees"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"WiFi-võrke pole saadaval"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Sisselülitamine …"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Ülekandmine"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Osatäitjad"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimeta seade"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Valmis ülekandmiseks"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Akusäästja on sisse lülitatud"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Vähendab jõudlust ja taustaandmeid"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Akusäästja väljalülitamine"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> hakkab jäädvustama kõike, mida ekraanil kuvatakse."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> jäädvustab kõik ekraanil kuvatu, sh märguanded, paroolid, fotod, sõnumid ja makseteabe."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Kas lubada rakendusel <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> teie ekraanikuva salvestada või üle kanda?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ära kuva uuesti"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tühjenda kõik"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Haldamine"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon soojeneb"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Mõned funktsioonid on piiratud, kuni telefon jahtub"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Eemaldage laadija vooluvõrgust"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Selle seadme laadimisega on probleem. Eemaldage toiteadapter ja olge ettevaatlik, sest kaabel võib olla soe."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Vaadake hooldusjuhiseid"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vasak otsetee"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Parem otsetee"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Vasak otsetee avab ka"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 82792b27f9d2..937a6ffc5a4b 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Aktibatuta dago Wi-Fi konexioa"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ez dago Wi-Fi sarerik erabilgarri"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktibatzen…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Igorri"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Igortzen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Izenik gabeko gailua"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Igortzeko prest"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Aktibatuta dago bateria-aurrezlea"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Errendimendua eta atzeko planoko datuak murrizten ditu"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desaktibatu bateria-aurrezlea"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak pantailan bistaratzen den guztia grabatuko du."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Pantailan duzun guztia erregistratzen hasiko da <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, jakinarazpenak, pasahitzak, argazkiak, mezuak eta ordainketa-informazioa barne."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Pantaila grabatu edo igortzeko baimena eman nahi diozu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioari?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ez erakutsi berriro"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztiak"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Kudeatu"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Berotzen ari da telefonoa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Eginbide batzuk ezingo dira erabili telefonoa hoztu arte"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, telefonoa erabiltzen jarrai dezakezu, baina mantsoago funtziona lezake.\n\nTelefonoaren tenperatura jaitsi bezain laster, ohi bezala funtzionatzen jarraituko du."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Deskonektatu kargagailua"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Arazo bat izan da gailua kargatzean. Deskonektatu egokigailua eta kontuz ibili, kablea bero egon baitaiteke."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ikusi zaintzeko urratsak"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ezkerreko lasterbidea"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Eskuineko lasterbidea"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ezkerreko lasterbideak desblokeatzeko ere balio du"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 2c7194e7bbbe..13f97723632b 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"‏Wi-Fi روشن"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"‏هیچ شبکه Wi-Fi موجود نیست"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"روشن کردن…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ارسال محتوا"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"در حال فرستادن"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"دستگاه بدون نام"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"آماده برای فرستادن"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"بهینه‌سازی باتری روشن است"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"عملکرد و اطلاعات پس‌زمینه را کاهش می‌دهد"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"بهینه‌سازی باتری را خاموش کنید"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> شروع به ضبط هر چیزی می‌کند که در صفحه‌نمایش شما نمایش داده می‌شود."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> هرچیزی که در صفحه‌نمایش شماست، ازجمله اعلان‌ها، گذرواژه‌ها، عکس‌ها، پیام‌ها و اطلاعات پرداخت، ضبط می‌کند."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"به <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> اجازه می‌دهید صفحه‌نمایشتان را ضبط کند یا به آن ارسال محتوا کند؟"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"دوباره نشان داده نشود"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"پاک کردن همه موارد"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"مدیریت"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"تلفن درحال گرم شدن است"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"وقتی تلفن درحال خنک شدن است، بعضی از قابلیت‌ها محدود می‌شوند"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"تلفنتان به‌طور خودکار سعی می‌کند خنک شود. همچنان می‌توانید از تلفنتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی تلفن خنک شد، عملکرد عادی‌اش از سرگرفته می‌شود."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"جدا کردن شارژر از برق"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"مشکلی در شارژ کردن این دستگاه وجود دارد. آداپتور برق را از برق جدا کنید و مراقب باشید زیرا ممکن است کابل گرم باشد."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"مشاهده مراحل احتیاط"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"میان‌بر چپ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"میان‌بر راست"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"قفل میان‌بر چپ هم باز می‌شود"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 4986ab088bde..727549719a6a 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi on käytössä"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ei Wi-Fi-verkkoja käytettävissä"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Otetaan käyttöön…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Suoratoisto"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Lähetetään"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimetön laite"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Valmis lähetystä varten"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Virransäästö on käytössä"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Rajoittaa suorituskykyä ja taustatiedonsiirtoa"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Poista virransäästö käytöstä"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkaa tallentaa kaiken näytölläsi näkyvän."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkaa tallentaa kaiken näytölläsi näkyvän, kuten ilmoitukset, salasanat, kuvat, viestit ja maksutiedot."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Saako <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nauhoittaa tai striimata näyttöäsi?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Älä näytä uudelleen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Poista kaikki"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Muuta asetuksia"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Puhelin lämpenee"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Irrota laturi"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Laitetta ladattaessa tapahtui virhe. Irrota virtalähde varovasti – johto voi olla lämmin."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Katso huoltovaiheet"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vasen pikakuvake"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Oikea pikakuvake"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Myös vasen pikakuvake avaa lukituksen"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8ccedced0be0..397b88d82fd1 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi à proximité"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activation en cours…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Diffuser"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Prêt à diffuser"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"La fonction Économie d\'énergie est activée"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Réduire les performances et de fond"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Désactiver la fonction Économie d\'énergie"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> commencer à enregistrer tout ce qui s\'affiche sur votre écran."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> commencera à capturer tout ce qui se trouve votre écran, y compris les notifications, les mots de passe, les photos, les messages et les données relatives aux paiements."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Autoriser <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> à enregistrer ou à diffuser votre écran?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gérer"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Le téléphone commence à chauffer"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Les fonctionnalités sont limitées pendant que le téléphone refroidit"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Débranchez le chargeur"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Il y a un problème avec la recharge de cet appareil. Débranchez l\'adaptateur d\'alimentation, et faites attention, car le câble pourrait être chaud."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Afficher les étapes d\'entretien"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Raccourci gauche"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Raccourci droit"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Le raccourci gauche déverrouille aussi :"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 7a87cf6d0d1a..22f68e18e181 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi disponible"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activation…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Caster"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Prêt à caster"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Économiseur de batterie activé"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Limite les performances et les données en arrière-plan."</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Désactiver l\'économiseur de batterie"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va commencer à capturer tous les contenus affichés à l\'écran."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va commencer à enregistrer tous les contenus affichés à l\'écran, y compris les notifications, les mots de passe, les photos, les messages et les informations de paiement."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Autoriser <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> à enregistrer ou à caster votre écran ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gérer"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Le téléphone chauffe"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Fonctionnalités limitées pendant le refroidissement du téléphone"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Débrancher le chargeur"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Un problème est survenu lors de la recharge de cet appareil. Débranchez l\'adaptateur secteur en faisant attention, car le câble risque d\'être chaud."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Afficher les étapes d\'entretien"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Raccourci gauche"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Raccourci droit"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Le raccourci gauche déverrouille également"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 31a18f910e5d..bd4b83582903 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Non hai redes wifi dispoñibles"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Activando…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emisión"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sen nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para emitir"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"A función Aforro de batería está activada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce o rendemento e os datos en segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desactivar a función Aforro de batería"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comezará a capturar todo o que apareza na túa pantalla."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo o que aparece na túa pantalla, incluídas as notificacións, os contrasinais, as fotos, as mensaxes e a información de pago."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Queres permitir que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grave ou emita a túa pantalla?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrar outra vez"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Eliminar todas"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Xestionar"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"O teléfono está quentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"O uso dalgunhas funcións é limitado mentres o teléfono arrefría"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"O teléfono tentará arrefriar automaticamente. Podes utilizalo, pero é probable que funcione máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconecta o cargador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Produciuse un problema ao cargar este dispositivo. Desconecta o adaptador de corrente e ten coidado porque o cable pode estar quente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver pasos de mantemento"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atallo á esquerda"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atallo á dereita"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atallo á esquerda tamén desbloquea o dispositivo"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 6c4f1b22a93c..87bda381f65f 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"વાઇ-ફાઇ ચાલુ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"કોઈ વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ નથી"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ચાલુ કરી રહ્યાં છીએ…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"કાસ્ટ કરો"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"કાસ્ટ કરી રહ્યાં છે"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"અનામાંકિત ઉપકરણ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"કાસ્ટ કરવા માટે તૈયાર"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"બૅટરી સેવર ચાલુ છે"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"બૅટરી સેવર બંધ કરો"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> તમારી સ્ક્રીન પર જે પ્રદર્શિત થાય છે તે દરેક વસ્તુને કેપ્ચર કરવાનું પ્રારંભ કરશે."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, નોટિફિકેશન, પાસવર્ડ, ફોટા, સંદેશા અને ચુકવણીની માહિતી સહિત તમારી સ્ક્રીન પર રહેલી દરેક વસ્તુને કૅપ્ચર કરવાનું શરૂ કરશે."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ને તમારી સ્ક્રીનને રેકોર્ડ અથવા કાસ્ટ કરવાની મંજૂરી આપીએ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ફરીથી બતાવશો નહીં"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"બધુ સાફ કરો"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"મેનેજ કરો"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ફોન ગરમ થઈ રહ્યો છે"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ફોન ઠંડો થાય ત્યાં સુધી કેટલીક સુવિધાઓ મર્યાદિત હોય છે"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"તમારો ફોન આપમેળે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ચાર્જરને અનપ્લગ કરો"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"આ ડિવાઇસને ચાર્જ કરવામાં કોઈ સમસ્યા છે. પાવર અડૅપ્ટર અનપ્લગ કરો અને કાળજી લેજો કદાચ કેબલ થોડો ગરમ થયો હોઈ શકે છે."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"સારસંભાળના પગલાં જુઓ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ડાબો શૉર્ટકટ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"જમણો શૉર્ટકટ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ડાબો શૉર્ટકટ પણ અનલૉક કરે છે"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 517fc5412011..998e0454bc1a 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाई-फ़ाई चालू है"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"कोई भी वाई-फ़ाई नेटवर्क उपलब्‍ध नहीं है"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"वाई-फ़ाई चालू हो रहा है…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करें"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्टिंग"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"अनाम डिवाइस"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"कास्ट करने के लिए तैयार"</string>
@@ -437,7 +438,10 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"बैटरी सेवर चालू है"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"निष्‍पादन और पृष्ठभूमि डेटा को कम करता है"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"बैटरी सेवर बंद करें"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपके स्क्रीन पर दिखाई देने वाली हर सामग्री को कैप्चर करना शुरू कर देगी."</string>
+ <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
+ <skip />
+ <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
+ <skip />
<string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सभी को हटाएं"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"प्रबंधित करें"</string>
@@ -814,6 +818,10 @@
<string name="high_temp_title" msgid="4589508026407318374">"फ़ोन गर्म हो रहा है"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"फ़ोन के ठंडा होने के दौरान कुछ सुविधाएं सीमित होती हैं"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अभी भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"चार्जर निकालें"</string>
+ <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
+ <skip />
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"प्रबंधन से जुड़े चरण देखें"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"बायां शॉर्टकट"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"दायां शॉर्टकट"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"बाएं शॉर्टकट से भी अनलॉक होता है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index e4ff7203b27e..cb34573673f8 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Uključivanje…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitiranje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Uređaj bez naziva"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Spreman za emitiranje"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Štednja baterije je uključena"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Smanjuje količinu rada i pozadinske podatke"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Isključite Štednju baterije"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> počet će snimati sve što se prikazuje na zaslonu."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> će početi snimati sve na zaslonu, uključujući obavijesti, zaporke, fotografije, poruke i podatke o plaćanju."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Dopustiti aplikaciji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> da snima ili emitira vaš zaslon?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši sve"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Upravljajte"</string>
@@ -819,6 +821,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se zagrijava"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Neke su značajke ograničene dok se telefon hladi"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Iskopčajte punjač"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Pojavio se problem s punjenjem uređaja. Iskopčajte pretvarač napona i pazite jer se kabel može zagrijati."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Pogledajte upute za održavanje"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lijevi prečac"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desni prečac"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lijevi prečac također otključava"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 62be0ad50554..db9ce2b6572b 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi bekapcsolva"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nincs elérhető Wi-Fi-hálózat"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Bekapcsolás…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Tartalomátküldés"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Átküldés"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Név nélküli eszköz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Küldésre kész"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Akkumulátorkímélő mód bekapcsolva"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Csökkenti a teljesítményt és a háttéradatok használatát"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Akkumulátorkímélő mód kikapcsolása"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkalmazás rögzíteni fog mindent, ami megjelenik a képernyőn."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mindent rögzíteni kezd, ami a képernyőn látható (beleértve az értesítéseket, a jelszavakat, a fotókat, az üzeneteket és a fizetési információkat is)."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Engedélyezi a(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> számára, hogy rögzíthesse, illetve átküldhesse a képernyő tartalmát?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ne jelenjen meg többé"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Az összes törlése"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Kezelés"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"A telefon melegszik"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Bizonyos funkciók korlátozottan működnek a telefon hűlése közben"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Húzza ki a töltőt"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Probléma adódott az eszköz töltése során. Húzza ki a hálózati adaptert. Vigyázzon, a kábel forró lehet."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Olvassa el a megfelelő használat lépéseit"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Bal oldali parancsikon"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Jobb oldali parancsikon"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"A bal oldali parancsikon szintén feloldja a zárolást"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 0d8c036b8373..31f52cdb2ef0 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi-ը միացված է"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Հասանելի Wi-Fi ցանցեր չկան"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Միացում…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Հեռարձակում"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Հեռարձակում"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Անանուն սարք"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Պատրաստ է հեռարձակման"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Մարտկոցի տնտեսումը միացված է"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Անջատել մարտկոցի տնտեսումը"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ծրագիրը կսկսի հավաքել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ը կլուսանկարի ամենը, ինչ հայտնվի սարքի էկրանին, այդ թվում՝ ծանուցումներ, գաղտնաբառեր, լուսանկարներ, հաղորդագրություններ և վճարային տվյալներ։"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Թույլատրե՞լ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ին տեսագրել կամ հեռարձակել ձեր էկրանը"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Այլևս ցույց չտալ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Մաքրել բոլորը"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Կառավարել"</string>
@@ -606,7 +608,7 @@
<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="notification_header_default_channel" msgid="7506845022070889909">"Ծանուցումներ"</string>
- <string name="notification_channel_disabled" msgid="344536703863700565">"Դուք այլևս չեք ստանա այս ծանուցումները"</string>
+ <string name="notification_channel_disabled" msgid="344536703863700565">"Այլևս չեք ստանա նման ծանուցումներ"</string>
<string name="notification_channel_minimized" msgid="1664411570378910931">"Այս ծանուցումները կծալվեն:"</string>
<string name="notification_channel_silenced" msgid="2877199534497961942">"Այս ծանուցումները կցուցադրվեն առանց ձայնի"</string>
<string name="notification_channel_unsilenced" msgid="4790904571552394137">"Այս ծանուցումները կցուցադրվեն զգուշացումով"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Հեռախոսը տաքանում է"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Հովանալու ընթացքում հեռախոսի որոշ գործառույթներ սահմանափակ են"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ: Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով:"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Անջատեք լիցքավորիչը հոսանքից"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Չհաջողվեց լիցքավորել սարքը: Անջատեք հոսանքի ադապտերը և ուշադիր եղեք՝ մալուխը կարող է տաքացած լինել:"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Քայլեր գերտաքացման ահազանգի դեպքում"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ձախ դյուրանցում"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Աջ դյուրանցում"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ձախ դյուրանցումը նաև ապակողպում է"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index fdf902ecbacd..9f88ef1c996b 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktif"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tidak ada jaringan Wi-Fi yang tersedia"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Mengaktifkan…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Melakukan transmisi"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Perangkat tanpa nama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Siap melakukan transmisi"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Penghemat Baterai aktif"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Mengurangi kinerja dan data latar belakang"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Nonaktifkan Penghemat Baterai"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mulai menangkap apa saja yang ditampilkan pada layar Anda."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mulai mengambil foto semua item di layar, termasuk notifikasi, sandi, foto, pesan, dan informasi pembayaran."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Izinkan <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> merekam atau mentransmisikan layar?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tampilkan lagi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hapus semua"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Kelola"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Ponsel menjadi hangat"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Beberapa fitur dibatasi saat ponsel mendingin"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Cabut pengisi daya"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Ada masalah saat mengisi daya perangkat ini. Cabut adaptor daya dan berhati-hatilah karena kabelnya mungkin panas."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Lihat langkah-langkah perawatan"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Pintasan kiri"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pintasan kanan"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Pintasan kiri juga membuka kunci"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 0a5271ae3169..012fa31de891 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kveikt á Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Engin Wi-Fi net í boði"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Kveikir…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Útsending"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Sendir út"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ónefnt tæki"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tilbúið í útsendingu"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Kveikt er á rafhlöðusparnaði"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Dregur úr afköstum og bakgrunnsgögnum"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Slökkva á rafhlöðusparnaði"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun fanga allt sem birtist á skjánum."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun fanga allt sem birtist á skjánum, þar á meðal tilkynningar, aðgangsorð, myndir, skilaboð og greiðsluupplýsingar."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Viltu leyfa <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> að taka upp skjáinn eða senda hann út?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ekki sýna þetta aftur"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hreinsa allt"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Stjórna"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Síminn er að hitna"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sumir eiginleikar eru takmarkaðir þegar síminn kælir sig"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Síminn reynir sjálfkrafa að kæla sig. Þú getur enn notað símann en hann gæti verið hægvirkari.\n\nEftir að síminn hefur kælt sig niður virkar hann eðlilega."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Taktu hleðslutækið úr sambandi"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Upp kom vandamál varðandi hleðslu tækisins. Taktu straumbreytinn úr sambandi og farðu varlega því snúran gæti verið heit."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Sjá varúðarskref"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Flýtilykill til vinstri"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Flýtilykill til hægri"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Flýtilykill til vinstri opnar einnig"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 58fc17b186d5..de7a69b5bfd2 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi attivo"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nessuna rete Wi-Fi disponibile"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Attivazione…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Trasmetti"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"In trasmissione"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo senza nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto a trasmettere"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Risparmio energetico attivo"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Riduce le prestazioni e i dati in background"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Disattiva Risparmio energetico"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> inizierà ad acquisire tutto ciò che è visualizzato sul tuo schermo."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> inizierà ad acquisire tutti gli elementi sullo schermo, inclusi messaggi, notifiche, password, foto e dati di pagamento."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vuoi consentire a <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> di registrare o trasmettere lo schermo?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrare più"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Cancella tutto"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gestisci"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Il telefono si sta scaldando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alcune funzioni limitate durante il raffreddamento del telefono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Il telefono cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il telefono funzionerà normalmente."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Scollega il caricabatterie"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Si è verificato un problema durante la ricarica del dispositivo. Scollega l\'alimentatore e presta attenzione perché il cavo potrebbe essere caldo."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Leggi le misure da adottare"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Scorciatoia sinistra"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Scorciatoia destra"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Anche la scorciatoia sinistra consente di sbloccare"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 0700f721889a..2f71591ed0d4 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"‏Wi-Fi פועל"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"‏אין רשתות Wi-Fi זמינות"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ההפעלה מתבצעת…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"מעביר"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"מכשיר ללא שם"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"מוכן להעביר"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"תכונת החיסכון בסוללה פועלת"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"מפחית את הביצועים ונתונים ברקע"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"כיבוי תכונת החיסכון בסוללה"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> יתחיל להקליט את כל התוכן המוצג במסך שלך."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"באמצעות <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, יתחיל תיעוד של כל מה שמופיע במסך, כולל התראות, סיסמאות, תמונות, הודעות ופרטי תשלום."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"האם להתיר ל-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> לצלם את המסך או לבצע העברה שלו?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"אל תציג שוב"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"נקה הכל"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ניהול"</string>
@@ -816,14 +818,17 @@
<string name="pip_notification_message" msgid="5619512781514343311">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."</string>
<string name="pip_play" msgid="1417176722760265888">"הפעל"</string>
<string name="pip_pause" msgid="8881063404466476571">"השהה"</string>
- <string name="pip_skip_to_next" msgid="1948440006726306284">"ברצוני לדלג אל הבא"</string>
- <string name="pip_skip_to_prev" msgid="1955311326688637914">"ברצוני לדלג אל הקודם"</string>
+ <string name="pip_skip_to_next" msgid="1948440006726306284">"אפשר לדלג אל הבא"</string>
+ <string name="pip_skip_to_prev" msgid="1955311326688637914">"אפשר לדלג אל הקודם"</string>
<string name="thermal_shutdown_title" msgid="4458304833443861111">"הטלפון כבה עקב התחממות"</string>
<string name="thermal_shutdown_message" msgid="9006456746902370523">"הטלפון פועל כרגיל עכשיו"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות"</string>
<string name="high_temp_title" msgid="4589508026407318374">"הטלפון מתחמם"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"קירור הטלפון ייעשה באופן אוטומטי. תוכל עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"יש לנתק את המטען"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"יש בעיה עם טעינת מכשיר זה. יש לנתק את מתאם המתח בזהירות כיוון שייתכן שהכבל חם."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"לצפייה בשלבי הטיפול"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"קיצור דרך שמאלי"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"קיצור דרך ימני"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"קיצור דרך שמאלי גם מבטל נעילה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2e1d96db89d1..8a642a17fa0d 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi: ON"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fiネットワークを利用できません"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ON にしています…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"キャスト"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"キャストしています"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"名前のないデバイス"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"キャスト準備完了"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"バッテリー セーバー ON"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"パフォーマンスとバックグラウンドデータを制限します"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"バッテリー セーバーを OFF"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で、画面に表示されているコンテンツのキャプチャを開始します。"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で、画面上のすべての内容(通知、パスワード、写真、メッセージ、支払い情報など)の取得が開始されます。"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>に画面の記録やキャストを許可しますか?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"次回から表示しない"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"すべて消去"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"スマートフォンの温度が上昇中"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"スマートフォンのクールダウン中は一部の機能が制限されます"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"スマートフォンは自動的にクールダウンを行います。その間もスマートフォンを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"充電器を電源から外してください"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"このデバイスの充電中に問題が発生しました。電源アダプターを電源から外してください。ケーブルが熱くなっている可能性がありますのでご注意ください。"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"取り扱いに関する手順をご覧ください"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"左ショートカット"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"右ショートカット"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"左ショートカットでもロックを解除"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 85278a79ce5c..358d1487960a 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ჩართულია"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ქსელები მიუწვდომელია"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ირთვება…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ტრანსლირება"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"გადაიცემა"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"უსახელო მოწყობილობა"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"მზად არის სამაუწყებლოდ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ბატარეის დამზოგი ჩართულია"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ამცირებს წარმადობას და უკანა ფონის მონაცემებს"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ბატარეის დამზოგის გამორთვა"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> დაიწყებს იმ ყველაფრის აღბეჭდვას, რაც თქვენს ეკრანზე ჩანს."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> აღბეჭდავს ყველაფერს თქვენს ეკრანზე, მათ შორის, შეტყობინებებს, პაროლებს, ფოტოებს, SMS-ებსა და ანგარიშსწორების ინფორმაციას."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"გსურთ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ისთვის თქვენი ეკრანის ჩაწერისა და ტრანსლირების დაშვება?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"აღარ მაჩვენო"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ყველას გასუფთავება"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"მართვა"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ტელეფონი ცხელდება"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტელეფონი გაგრილდება"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"თქვენი ტელეფონი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"გამოაერთეთ დამტენი"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ამ მოწყობილობის დატენა ვერ ხერხდება პრობლემის გამო. გამოაერთეთ ელკვების ადაპტერი და გამოიჩინეთ სიფრთხილე, რადგან კაბელი შეიძლებოდა გაცხელებულიყო."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"მისაღები ზომების გაცნობა"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"მარცხენა მალსახმობი"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"მარჯვენა მალსახმობი"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"მარცხენა მალსახმობი ასევე განბლოკავს"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 2f60cf48ee2f..b029d7c3b7f2 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi қосулы"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Қолжетімді Wi-Fi желілері жоқ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Қосылуда…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляциялануда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Атаусыз құрылғы"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Трансляциялауға дайын"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Battery saver қосулы"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Өнімділікті және фондық деректерді азайтады"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Battery saver функциясын өшіру"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілгеннің барлығын түсіре бастайды."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілетін бүкіл мәліметті, соның ішінде хабарландыруларды, құпия сөздерді, фотосуреттерді, хабарларды және төлем туралы ақпаратты суретке түсіре бастайды."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> қолданбасына экранды жазуға немесе трансляциялауға рұқсат етілсін бе?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Қайта көрсетпеу"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Барлығын тазалау"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Басқару"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефон қызуда"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Телефон толық суығанға дейін, кейбір функциялардың жұмысы шектеледі"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Телефон автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nТелефон суығаннан кейін, оның жұмысы қалпына келеді."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Зарядтағышты ажыратыңыз"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Құрылғыны зарядтау кезінде ақау шықты. Қуат адаптерін ажыратыңыз. Кабель ыстық болуы мүмкін, абай болыңыз."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Пайдалану нұсқаулығын қараңыз"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Сол жақ таңбаша"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Оң жақ таңбаша"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Сол жақ таңбаша құлыпты ашады"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 5b090abc1a40..079004fbdcb5 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi បានបើក"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"គ្មានបណ្តាញ Wi-Fi ទេ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"កំពុង​បើក..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ភ្ជាប់"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"ការ​ចាត់​ថ្នាក់"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ឧបករណ៍​​ដែល​មិន​មាន​ឈ្មោះ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ត្រៀម​រួចរាល់​ដើម្បី​ចាត់​ថ្នាក់"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"កម្មវិធីសន្សំថ្មបានបើក"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ការ​បន្ថយ​ការ​ប្រតិបត្តិ និង​ទិន្នន័យ​ផ្ទៃ​ខាងក្រោយ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"បិទ​កម្មវិធី​សន្សំ​ថ្ម"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹង​ចាប់ផ្ដើម​ចាប់​យក​អ្វីៗ​គ្រប់យ៉ាង​ដែល​បង្ហាញ​លើ​អេក្រង់​របស់​អ្នក។"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹង​ចាប់ផ្ដើម​ថត​អ្វីគ្រប់យ៉ាង​នៅលើ​អេក្រង់​របស់អ្នក រួមទាំង​ការជូន​ដំណឹង ពាក្យ​សម្ងាត់ រូប​ថត សារ និង​ព័ត៌មាន​ពីការទូទាត់ផងដែរ។"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"អនុញ្ញាត​ឱ្យ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ថត ឬ​បញ្ជូន​អេក្រង់​របស់អ្នក?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"កុំ​បង្ហាញ​ម្ដងទៀត"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"សម្អាត​ទាំងអស់"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"គ្រប់គ្រង"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ទូរសព្ទ​នេះ​កំពុង​កើន​កម្តៅ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"មុខងារ​មួយ​ចំនួន​នឹង​មិន​អាច​ប្រើ​បាន​ពេញលេញ​នោះ​ទេ ខណៈពេល​ដែល​ទូរសព្ទ​កំពុង​បញ្ចុះ​កម្តៅ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ទូរសព្ទ​របស់អ្នក​នឹង​ព្យាយាម​បញ្ចុះ​កម្តៅ​ដោយ​ស្វ័យប្រវត្តិ។ អ្នក​នៅតែ​អាច​ប្រើ​ទូរសព្ទ​របស់អ្នក​បាន​ដដែល​ ប៉ុន្តែ​វា​នឹង​ដំណើរ​ការ​យឺត​ជាង​មុន។\n\nបន្ទាប់​ពី​ទូរសព្ទ​របស់អ្នក​ត្រជាក់​ជាង​មុន​ហើយ វា​នឹង​ដំណើរការ​ដូច​ធម្មតា។"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ផ្ដាច់ឆ្នាំងសាក"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"មាន​បញ្ហា​ក្នុងការសាកថ្ម​ឧបករណ៍​នេះ។ សូមផ្ដាច់​ឆ្នាំងសាក ហើយ​ប្រុងប្រយ័ត្ន ដោយសារ​ខ្សែ​អាចមាន​កម្ដៅ​ក្ដៅ។"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"មើលជំហាន​ថែទាំ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ផ្លូវកាត់​ខាង​ឆ្វេង"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ផ្លូវកាត់​ខាង​ស្តាំ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ផ្លូវកាត់​ខាង​ឆ្វេង​ក៏​ដោះសោ​ដែរ"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 1fe0673e3154..aa6055368c48 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ಯಾವುದೇ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ಬಿತ್ತರಿಸುವಿಕೆ"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ಬಿತ್ತರಿಸಲು ಸಿದ್ದವಾಗಿದೆ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಆಫ್ ಮಾಡಿ"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"ನಿಮ್ಮ ಪರದೆಯ ಮೇಲೆ ಪ್ರದರ್ಶಿಸಲಾಗುವ ಎಲ್ಲವನ್ನೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಯು ಸೆರೆಹಿಡಿಯಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ನಿಮ್ಮ ಪರದೆಯಲ್ಲಿರುವ - ಅಧಿಸೂಚನೆಗಳು, ಕರೆಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಸೇರಿದಂತೆ ಪ್ರತಿಯೊಂದನ್ನೂ ಕ್ಯಾಪ್ಚರ್ ಮಾಡುತ್ತದೆ."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"ರೆಕಾರ್ಡ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬಿತ್ತರಿಸಲು <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಅನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸು"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ನಿರ್ವಹಿಸಿ"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ಫೋನ್ ಬಿಸಿಯಾಗುತ್ತಿದೆ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ಫೋನ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸುತ್ತದೆ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ನಿಮ್ಮ ಫೋನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ, ಆದರೆ ಇದು ನಿಧಾನವಾಗಿರಬಹುದು.\n\nಒಮ್ಮೆ ನಿಮ್ಮ ಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ಚಾರ್ಜರ್ ಅನ್‌ಪ್ಲಗ್ ಮಾಡಿ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ಈ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡುತ್ತಿರುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ. ಪವರ್ ಅಡಾಪ್ಟರ್ ಅನ್ನು ಅನ್‌ಪ್ಲಗ್ ಮಾಡಿ ಮತ್ತು ಕೇಬಲ್ ಬೆಚ್ಚಗಿರಬೇಕೆಂದು ಜಾಗ್ರತೆ ವಹಿಸಿ."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ಕಾಳಜಿ ಹಂತಗಳನ್ನು ನೋಡಿ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ಎಡ ಶಾರ್ಟ್‌ಕಟ್"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ಬಲ ಶಾರ್ಟ್‌ಕಟ್"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ಎಡ ಶಾರ್ಟ್‌ಕಟ್ ಕೂಡ ಅನ್‌ಲಾಕ್ ಮಾಡುತ್ತದೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index e7b4fc75c336..73df5540f8a2 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 사용"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"사용 가능한 Wi-Fi 네트워크 없음"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"켜는 중..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"전송"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"전송 중"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"이름이 없는 기기"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"전송 준비 완료"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"절전 모드 사용 중"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"성능 및 백그라운드 데이터를 줄입니다."</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"절전 모드 사용 중지"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>에서 화면에 표시된 모든 것을 캡처하기 시작합니다."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>이(가) 알림, 비밀번호, 사진, 메시지, 결제 정보를 비롯한 화면의 모든 내용을 캡처하기 시작합니다."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>이(가) 화면을 녹화하거나 전송하도록 허용하시겠습니까?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"다시 표시 안함"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"모두 지우기"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"관리"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"휴대전화 온도가 높음"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"휴대전화 온도를 낮추는 동안 일부 기능이 제한됩니다."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"휴대전화 온도를 자동으로 낮추려고 시도합니다. 휴대전화를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n휴대전화 온도가 낮아지면 정상적으로 작동됩니다."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"충전기를 연결 해제하세요"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"기기를 충전하는 중에 문제가 발생했습니다. 케이블이 뜨거울 수 있으므로 주의하여 전원 어댑터를 분리하세요."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"취해야 할 조치 확인"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"왼쪽 바로가기"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"오른쪽 바로가기"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"왼쪽 바로가기도 잠금 해제 가능"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 596ef29a4471..331ca481746a 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi күйүк"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Бир дагы жеткиликтүү Wi-Fi тармагы жок"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Күйгүзүлүүдө…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Тышкы экранга чыгаруу"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Тышкы экранга чыгарылууда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Аты жок түзмөк"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Тышкы экранга чыгарууга даяр"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Батареяны үнөмдөгүч режими күйүк"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Иштин майнаптуулугун начарлатып, фондук дайындарды чектейт"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Батареяны үнөмдөгүч режимин өчүрүү"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранга чыккан нерсенин баарын сүрөткө тарта баштайт."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранга чыккан нерсенин баарын, анын ичинде билдирмелерди, сырсөздөрдү, сүрөттөрдү, билдирүүлөрдү жана төлөм маалыматын сүрөткө тарта баштайт."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу экраныңыздагы нерсени жаздырып же тышкы экранга чыгарсынбы?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Экинчи көрсөтүлбөсүн"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Бардыгын тазалап салуу"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Башкаруу"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефонуңуз ысып баратат"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Телефон сууганча айрым элементтердин иши чектелген"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Телефонуңуз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТелефонуңуз суугандан кийин адаттагыдай эле иштеп баштайт."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Кубаттагычты сууруңуз"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Бул түзмөктү кубаттоодо маселе келип чыкты. Кабель ысып кетиши мүмкүн, андыктан кубаттагыч адаптерин сууруп коюңуз."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Тейлөө кадамдарын көрүңүз"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Сол жактагы кыска жол"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Оң жактагы кыска жол"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Сол жактагы кыска жол дагы кулпуну ачат"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 86a35edc9aba..6d5134b946a4 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ເປີດ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ບໍ່​ມີ​ເຄືອ​ຂ່າຍ Wi-Fi ຢູ່"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ກຳລັງເປີດ..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ການສົ່ງສັນຍານ"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"​ກຳ​ລັງ​ສົ່ງ​ສັນ​ຍານ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"​ອຸ​ປະ​ກອນບໍ່​ມີ​ຊື່"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"​ພ້ອ​ມ​ສົ່ງ​ສັນ​ຍານ​ແລ້ວ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ຕົວປະຢັດແບັດເຕີຣີເປີດຢູ່"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ຫຼຸດ​ປະ​ສິ​ທິ​ພາບ​ແລະ​ການ​ນຳ​ໃຊ້​ຂໍ້​ມູນ​ພື້ນຫຼັງ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ປິດຕົວປະຢັດແບັດເຕີຣີ"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ​ຈະ​ເລີ່ມ​ບັນ​ທຶກ​ທຸກ​ຢ່າງ​ທີ່​ສະ​ແດງ​ຜົນ​ໃນ​ໜ້າ​ຈໍ​ທ່ານ."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ຈະເລີ່ມບັນທຶກທຸກຢ່າງຢູ່ໜ້າຈໍຂອງທ່ານ ຮວມທັງການແຈ້ງເຕືອນ, ລະຫັດຜ່ານ, ຮູບພາບ, ຂໍ້ຄວາມ ແລະ ຂໍ້ມູນການຈ່າຍເງິນ."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"ອະນຸຍາດໃຫ້ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ບັນທຶກ ຫຼື ສົ່ງສັນຍານໜ້າຈໍຂອງທ່ານບໍ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ບໍ່​ຕ້ອງ​ສະ​ແດງ​ອີກ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ລຶບລ້າງທັງໝົດ"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ຈັດການ"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ໂທລະສັບກຳລັງຮ້ອນຂຶ້ນ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ຄຸນສົມບັດບາງຢ່າງຖືກຈຳກັດໄວ້ເນື່ອງໃນເວລາຫຼຸດອຸນຫະພູມຂອງໂທລະສັບ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ໂທລະສັບຂອງທ່ານຈະພະຍາຍາມລົດອຸນຫະພູມລົງ. ທ່ານຍັງຄົງສາມາດໃຊ້ໂທລະສັບຂອງທ່ານໄດ້ຢູ່, ແຕ່ມັນຈະເຮັດວຽກຊ້າລົງ.\n\nເມື່ອໂທລະສັບຂອງທ່ານບໍ່ຮ້ອນຫຼາຍແລ້ວ, ມັນຈະກັບມາເຮັດວຽກຕາມປົກກະຕິ."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ຖອດສາຍສາກອອກ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ເກີດບັນຫາໃນການສາກໄຟອຸປະກອນນີ້. ກະລຸນາຖອດສາຍສາກອອກ ແລະ ລະວັງເນື່ອງຈາກສາຍອາດຈະຍັງອຸ່ນຢູ່."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ເບິ່ງຂັ້ນຕອນການເບິ່ງແຍງ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ປຸ່ມລັດຊ້າຍ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ປຸ່ມລັດຂວາ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ປຸ່ມລັດຊ້າຍປົດລັອກນຳ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index a42992b0ac99..2b4b5ff6d0d9 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"„Wi-Fi“ įjungtas"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nėra jokių pasiekiamų „Wi-Fi“ tinklų"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Įjungiama…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Perdavimas"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Perduodama"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Įrenginys be pavadinimo"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Paruošta perduoti"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Akumuliatoriaus tausojimo priemonė įjungta"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Sumažinamas našumas ir foninių duomenų naudojimas"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Išjungti Akumuliatoriaus tausojimo priemonę"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"„<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ pradės fiksuoti viską, kas rodoma jūsų ekrane."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"„<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ pradės fiksuoti visą ekrane rodomą turinį, įskaitant informacinius pranešimus, slaptažodžius, nuotraukas, pranešimus ir mokėjimo informaciją."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Leisti „<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ įrašyti arba perduoti ekrano turinį?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Daugiau neberodyti"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Viską išvalyti"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Tvarkyti"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefonas kaista"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Kai kurios funkcijos gali neveikti, kol telefonas vėsta"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Atjunkite kroviklį"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Įkraunant šį įrenginį iškilo problema. Atjunkite maitinimo adapterį. Būkite atsargūs, nes laidas gali būti įkaitęs."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Žr. priežiūros veiksmus"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Spartusis klavišas kairėje"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Spartusis klavišas dešinėje"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Spartusis klavišas kairėje taip pat atrakina"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 1267faf270d9..54d9ad218bbd 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi savienojums ieslēgts"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nav pieejams neviens Wi-Fi tīkls."</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Notiek ieslēgšana…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Apraide"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Notiek apraide…"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nenosaukta ierīce"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gatavs apraidei"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Akumulatora jaudas taupīšanas režīms ir ieslēgts"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Samazina veiktspēju un fona datus"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Izslēgt akumulatora jaudas taupīšanas režīmu"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sāks uzņemt visu, kas tiks rādīts jūsu ekrānā."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sāks uzņemt visu, kas ir redzams jūsu ekrānā, tostarp paziņojumus, paroles, fotoattēlus, ziņojumus un maksājumu informāciju."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vai atļaut <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ierakstīt vai apraidīt jūsu ekrāna saturu?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Vairs nerādīt"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Dzēst visu"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Pārvaldīt"</string>
@@ -819,6 +821,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Tālrunis kļūst silts"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Dažas funkcijas ir ierobežotas, kamēr tālrunis mēģina atdzist"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Lādētāja atvienošana"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Uzlādējot šo ierīci, radās problēma. Atvienojiet strāvas adapteri. Esiet uzmanīgs — vads var būt uzsilis."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Skatīt apkopes norādījumus"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Saīsne kreisajā pusē"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Saīsne labajā pusē"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Saīsne kreisajā pusē arī atbloķē"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 40dc261f9e3e..292c18e84b3b 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Вклучено е Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Нема достапни Wi-Fi мрежи"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Се вклучува…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Емитувај"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Емитување"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименуван уред"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Подготвено за емитување"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Штедачот на батерија е вклучен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Ја намалува изведбата и податоците во заднина"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Исклучете го штедачот на батерија"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе започне да презема сѐ што се прикажува на вашиот екран."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе започне со снимање на сѐ што се наоѓа на екранот, вклучувајќи известувања, лозинки, фотографии, пораки и информации за плаќање."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Да ѝ се дозволи на <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> да снима или емитува на вашиот екран?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не покажувај повторно"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Исчисти сè"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Управувајте"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефонот се загрева"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Некои функции се ограничени додека телефонот се лади"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Телефонот автоматски ќе се обиде да се олади. Вие сепак ќе може да го користите, но тој може да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Исклучете го полначот"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Има проблем со полнењето на уредов. Исклучете го адаптерот за напојување и внимавајте зошто кабелот може да е топол."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Прикажи ги чекорите за грижа за уредот"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Лева кратенка"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Десна кратенка"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Левата кратенка исто така отклучува"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index f5422d867457..ca979e5518a9 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറ്റ്‌വർക്കുകളൊന്നും ലഭ്യമല്ല"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ഓണാക്കുന്നു…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"കാസ്‌റ്റുചെയ്യുക"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"കാസ്റ്റുചെയ്യുന്നു"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാത്ത ഉപകരണം"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"കാസ്‌റ്റ് ചെയ്യാൻ തയ്യാറാണ്"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ബാറ്ററി ലാഭിക്കൽ ഓണാണ്"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്‌ക്കുന്നു"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ബാറ്ററി ലാഭിക്കൽ ഓഫാക്കുക"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"നിങ്ങളുടെ സ്ക്രീനിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്ന എല്ലാ കാര്യങ്ങളും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ക്യാപ്‌ചർ ചെയ്യുന്നത് ആരംഭിക്കും."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"അറിയിപ്പുകൾ, പാസ്‌വേഡുകൾ, ഫോട്ടോകൾ, സന്ദേശങ്ങൾ, പേയ്മെന്റ് വിവരങ്ങൾ എന്നിവയുൾപ്പെടെ നിങ്ങളുടെ സ്‌ക്രീനിലെ എന്തുകാര്യവും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ക്യാപ്‌ചർ ചെയ്‌ത്‌ തുടങ്ങും."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"നിങ്ങളുടെ സ്ക്രീൻ റെക്കോർഡ് ചെയ്യാനോ കാസ്റ്റ് ചെയ്യാനോ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-നെ അനുവദിക്കണോ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"വീണ്ടും കാണിക്കരുത്"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"എല്ലാം മായ്‌ക്കുക"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"മാനേജ് ചെയ്യുക"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ഫോൺ ചൂടായിക്കൊണ്ടിരിക്കുന്നു"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ഫോൺ തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തപ്പെടും"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"നിങ്ങളുടെ ഫോൺ സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഫോൺ ഉപയോഗിക്കാമെങ്കിലും പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കും.\n\nതണുത്തുകഴിഞ്ഞാൽ, ഫോൺ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കും."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ചാർജർ അൺപ്ലഗ് ചെയ്യുക"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ഈ ഉപകരണം ചാർജ് ചെയ്യുന്നതിൽ തടസ്സമുണ്ട്. പവർ അഡാപ്റ്റർ അൺപ്ലഗ് ചെയ്യുക, കേബിളിന് ചൂടുണ്ടായിരിക്കുമെന്നതിനാൽ ശ്രദ്ധിക്കണം."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"മുൻകരുതൽ നടപടികൾ കാണുക"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ഇടത് കുറുക്കുവഴി"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"വലത് കുറുക്കുവഴി"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ഇടത് കുറുക്കുവഴിയും അൺലോക്കുചെയ്യുന്നു"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 40c56b9ba191..9812f4c1fe3d 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi асаалттай"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi сүлжээ байхгүй байна"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Асааж байна…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Дамжуулах"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Дамжуулж байна"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Нэргүй төхөөрөмж"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Дамжуулахад бэлэн"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Тэжээл хэмнэгч асаалттай байна"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Ажиллагаа болон далд датаг бууруулна"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Тэжээл хэмнэгчийг унтраах"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> таны дэлгэц дээр гаргасан бүх зүйлийн зургийг авч эхэлнэ."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> мэдэгдэл, нууц үг, зураг, мессеж болон төлбөрийн мэдээлэл зэрэг таны дэлгэц дээрх бүх зүйлийн зургийг авч эхэлнэ."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-д таны дэлгэцийг бичих эсвэл дамжуулахыг зөвшөөрөх үү?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Дахиж үл харуулах"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Бүгдийг арилгах"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Удирдах"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Утас халж эхэлж байна"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Таны утас хөрж байх зуур зарим онцлогийг хязгаарласан"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Таны утас автоматаар хөрөх болно. Та утсаа ашиглаж болох хэдий ч удаан ажиллаж болзошгүй.\n\nТаны утас хөрсний дараагаар хэвийн ажиллана."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Цэнэглэгчийг салгана уу"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Энэ төхөөрөмжийг цэнэглэхэд асуудал гарлаа. Тэжээлийн залгуурыг салгана уу. Кабель халсан байж болзошгүй тул болгоомжтой байгаарай."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Хянамж болгоомжийн алхмыг харна уу"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Зүүн товчлол"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Баруун товчлол"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Зүүн товчлол нь мөн түгжээг тайлдаг"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a8104c297c77..3af0b4f3210a 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाय-फाय चालू"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"वाय-फाय नेटवर्क उपलब्‍ध नाहीत"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"सुरू करत आहे…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्‍ट करा"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"निनावी डिव्हाइस"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"कास्ट करण्यास तयार"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"बॅटरी सेव्‍हर चालू आहे"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"बॅटरी सेव्हर बंद करा"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपल्‍या स्‍क्रीनवर प्रदर्शित होणारी प्रत्‍येक गोष्‍ट कॅप्‍चर करणे प्रारंभ करेल."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> सूचना, पासवर्ड, फोटो, मेसेज आणि पेमेंट माहितीसह तुमच्या स्क्रीनवरील प्रत्येक गोष्ट कॅप्चर करण्यास सुरुवात करेल."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"तुमची स्क्रीन रेकॉर्ड किंवा कास्ट करण्याची <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ला अनुमती द्यायची का?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"पुन्हा दर्शवू नका"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सर्व साफ करा"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"व्यवस्थापित करा"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"फोन ऊष्ण होत आहे"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"फोन थंड होत असताना काही वैशिष्‍ट्ये मर्यादित असतात"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"तुमचा फोन स्वयंचलितपणे थंड होईल. तुम्ही अद्यापही तुमचा फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nतुमचा फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"चार्जर अनप्लग करा"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"हे डिव्हाइस चार्ज करताना समस्या आहे. पॉवर अडॅप्टर अनप्लग करा आणि शक्य तेवढी काळजी घ्या कदाचित केबल गरम असू शकते."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"काय काळजी घ्यावी ते पाहा"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"डावा शॉर्टकट"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"उजवा शॉर्टकट"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"डावा शॉर्टकट देखील अनलॉक करतो"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 74a506377209..969091346472 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Dihidupkan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tiada rangkaian Wi-Fi tersedia"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Menghidupkan…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Hantar"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Menghantar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Peranti tidak bernama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Bersedia untuk menghantar"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Penjimat Bateri dihidupkan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Mengurangkan prestasi dan data latar belakang"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Matikan Penjimat Bateri"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mula mengabadikan semua yang dipaparkan pada skrin anda.."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mula merakam semua item pada skrin anda, termasuk pemberitahuan, kata laluan, foto, mesej dan maklumat pembayaran."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Benarkan <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> merakam atau menghantar skrin anda?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tunjukkan lagi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Kosongkan semua"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Urus"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon semakin panas"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Sesetengah ciri adalah terhad semasa telefon menyejuk"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Cabut palam pengejas"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Terdapat isu semasa mengecas peranti ini. Cabut palam penyesuai kuasa. Berhati-hati kerana kabel mungkin hangat."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Lihat langkah penjagaan"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Pintasan kiri"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pintasan kanan"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Pintasan kiri juga membuka kunci"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index a7b518941f6c..17dc52f91b33 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ဖွင့်နေသည်…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ဘက်ထရီ အားထိန်းကို ဖွင့်ထားခြင်း"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ဘက်ထရီ အားထိန်းကို ပိတ်ရန်"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> သည် အကြောင်းကြားချက်၊ စကားဝှက်၊ ဓာတ်ပုံ၊ မက်ဆေ့ဂျ်နှင့် ငွေပေးချေမှု အချက်အလက်များ အပါအဝင် သင့်ဖန်သားပြင်ပေါ်ရှိ အရာအားလုံးကို စတင် ဖမ်းယူပါမည်။"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"သင့်ဖန်သားပြင် ရိုက်ကူးရန် သို့မဟုတ် ကာ့စ်လုပ်ရန် <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ကို ခွင့်ပြုမလား။"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"နောက်ထပ် မပြပါနှင့်"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"အားလုံး ဖယ်ရှားရန်"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"စီမံရန်"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ဖုန်း ပူနွေးလာပါပြီ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"အားသွင်းကိရိယာ ပလပ်ဖြုတ်ပါ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ဤစက်ပစ္စည်းကို အားသွင်းရာတွင် ပြဿနာရှိနေသည်။ ပါဝါ ကြားခံကိရိယာကို ပလပ်ဖြုတ်ပါ။ ကေဘယ်ကြိုး ပူနွေးနေနိုင်သဖြင့် သတိထားပါ။"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ဂရုပြုစရာ အဆင့်များ ကြည့်ရန်"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"လက်ဝဲ ဖြတ်လမ်းလင့်ခ်"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"လက်ယာ ဖြတ်လမ်းလင့်ခ်"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"လက်ဝဲ ဖြတ်လမ်းလင့်ခ်ဖြင့်လည်း လော့ခ်ဖွင့်ရန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index dbe4718c72c0..8a175b2b205c 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Slår på …"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klar til å caste"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batterisparing er på"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduserer ytelsen og begrenser bakgrunnsdataene"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Slå av batterisparing"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar opp alt som vies på skjermen din."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> begynner å ta opp alt på skjermen din, inkludert varsler, passord, bilder, meldinger og betalingsopplysninger."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vil du tillate at <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar opp eller caster skjermen din?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ikke vis igjen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Fjern alt"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Administrer"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefonen begynner å bli varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Enkelte funksjoner er begrenset mens telefonen kjøles ned"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonen din kommer til å prøve å kjøle seg ned automatisk. Du kan fremdeles bruke telefonen, men den kjører muligens saktere.\n\nTelefonen kommer til å kjøre som normalt, når den har kjølt seg ned."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Koble fra laderen"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Det oppsto et problem med lading av enheten. Koble fra strømadapteren, og vær forsiktig, kabelen kan være varm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Se vedlikeholdstrinnene"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Venstre hurtigtast"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Høyre hurtigtast"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Venstre hurtigtast låser også opp"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 2a3d9e08573d..60279a966a98 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi सक्रिय छ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi नेटवर्क अनुपलब्ध"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"सक्रिय गर्दै…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"प्रसारण गर्दै"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"बेनाम उपकरण"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"प्रसारण गर्न तयार"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ब्याट्री सेभर सक्रिय छ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ब्याट्री सेभर निष्क्रिय पार्नुहोस्"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले आफ्नो स्क्रीनमा प्रदर्शित हुने सबै खिच्न शुरू गर्ने छ।"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले सूचना, पासवर्ड, तस्बिर, सन्देश र भुक्तानीसम्बन्धी जानकारीलगायत तपाईंको स्क्रिनमा रहेका सबै कुरा खिच्न थाल्ने छ।"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> लाई तपाईंको स्क्रिन रेकर्ड गर्न वा cast गर्न दिने हो?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"फेरि नदेखाउनुहोस्"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सबै हटाउनुहोस्"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"व्यवस्थित गर्नुहोस्"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"फोन तातो भइरहेको छ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"फोन चिसो हुँदै गर्दा केही विशेषताहरूलाई सीमित गरिन्छ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"तपाईंको फोन स्वतः चिसो हुने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"चार्जर अनप्लग गर्नुहोस्‌"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"यो यन्त्र चार्ज गर्दा कुनै समस्या भयो। पावर एडाप्टर अनप्लग गर्नुहोस्‌ र केबल तातो हुन सक्ने भएकाले ध्यान दिनुहोस्‌।"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"हेरचाहसम्बन्धी चरणहरू हेर्नुहोस्‌"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"बायाँतिरको सर्टकट"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"दायाँतिरको सर्टकट"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"बायाँतिरको सर्टकटले पनि अनलक गर्छ"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 8dca6724fcdb..e501a09d4532 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen wifi-netwerken beschikbaar"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Inschakelen..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Casten"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Casten"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Naamloos apparaat"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Klaar om te casten"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batterijbesparing aan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Vermindert de prestaties en achtergrondgegevens"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Batterijbesparing uitschakelen"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> gaat alles vastleggen dat wordt weergegeven op je scherm."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Vanaf nu legt <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alles op je scherm vast, waaronder meldingen, wachtwoorden, foto\'s, berichten en betalingsgegevens."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> toestaan je scherm vast te leggen of te casten?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Niet opnieuw weergeven"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Alles wissen"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Beheren"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"De telefoon wordt warm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Oplader loskoppelen"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Er is een probleem met het opladen van dit apparaat. Koppel de voedingsadapter los. Wees voorzichtig, want de kabel kan warm zijn."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Onderhoudsstappen bekijken"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Snelkoppeling links"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Snelkoppeling rechts"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Snelkoppeling links ontgrendelt ook"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index c7b6b181912f..20e0e7b617d1 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ୱାଇ-ଫାଇ ଅନ୍‍ ଅଛି"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ଅନ୍ ହେଉଛି…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"କାଷ୍ଟ"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ନାମହୀନ ଡିଭାଇସ୍‍"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"କାଷ୍ଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ"</string>
@@ -437,7 +438,10 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ଅଛି"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅଫ୍‍ କରନ୍ତୁ"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍‌ରେ ପ୍ରଦର୍ଶିତ ହେଉଥିବା ସମସ୍ତ ବସ୍ତୁକୁ କ୍ୟାପଚର୍ କରିବା ଆରମ୍ଭ ହୋଇଯିବ।"</string>
+ <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
+ <skip />
+ <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
+ <skip />
<string name="media_projection_remember_text" msgid="3103510882172746752">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ପରିଚାଳନା କରନ୍ତୁ"</string>
@@ -814,6 +818,10 @@
<string name="high_temp_title" msgid="4589508026407318374">"ଫୋନ୍‍ ଗରମ ହୋଇଯାଉଛି"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ଫୋନ୍‍ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର୍ ସୀମିତ ଭାବେ କାମ କରିଥାଏ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ଆପଣଙ୍କ ଫୋନ୍‍ ସ୍ୱଚାଳିତ ଭାବେ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ତଥାପି ନିଜ ଫୋନ୍‍ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ୍‍ ଥଣ୍ଡା ହୋଇଯିବାପରେ, ଏହା ସାମାନ୍ୟ ଭାବେ ଚାଲିବ।"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ଚାର୍ଜର୍‍ ଅନ୍‍ପ୍ଲଗ୍‌ କରନ୍ତୁ"</string>
+ <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
+ <skip />
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ସେବା ସମ୍ବନ୍ଧିତ ଷ୍ଟେପ୍‌ଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ବାମ ଶର୍ଟକଟ୍‍"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ଡାହାଣ ଶର୍ଟକଟ୍‍"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ବାମ ଶର୍ଟକଟ୍‍ ମଧ୍ୟ ଅନଲକ୍‍ କରେ"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index cc39bdef60b5..9ac544afa55a 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ਵਾਈ-ਫਾਈ ਚਾਲੂ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ਕਾਸਟ"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਾ ਡੀਵਾਈਸ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ਜੋੜਨ ਲਈ ਤਿਆਰ"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸੂਚਨਾਵਾਂ, ਪਾਸਵਰਡਾਂ, ਫ਼ੋਟੋਆਂ, ਸੁਨੇਹਿਆਂ ਅਤੇ ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ ਸਮੇਤ, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ।"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"ਕੀ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ਨੂੰ ਆਪਣੀ ਸਕ੍ਰੀਨ ਲਈ ਰਿਕਾਰਡ ਜਾਂ ਕਾਸਟ ਕਰਨ ਦੇਣਾ ਹੈ?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ਫ਼ੋਨ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਿਤ ਹੁੰਦੀਆਂ ਹਨ"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਵੈਚਲਿਤ ਰੂਪ ਵਿੱਚ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰੰਤੂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਵਧੇਰੇ ਹੌਲੀ ਚੱਲੇ।\n\nਇੱਕ ਵਾਰ ਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਧਾਰਨ ਤੌਰ \'ਤੇ ਚੱਲੇਗਾ।"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ਚਾਰਜਰ ਨੂੰ ਕੱਢੋ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਚਾਰਜ ਕਰਨ ਵਿੱਚ ਕੋਈ ਸਮੱਸਿਆ ਆ ਗਈ ਹੈ। ਪਾਵਰ ਅਡਾਪਟਰ ਨੂੰ ਕੱਢੋ ਅਤੇ ਧਿਆਨ ਰੱਖੋ ਸ਼ਾਇਦ ਕੇਬਲ ਗਰਮ ਹੋਵੇ।"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ਦੇਖਭਾਲ ਦੇ ਪੜਾਅ ਦੇਖੋ"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ਖੱਬਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ਸੱਜਾ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ਖੱਬੇ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵੀ ਅਣਲਾਕ ਹੁੰਦੀ ਹੈ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 565cc56d8e4d..409d2ceed08b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi wł."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Brak dostępnych sieci Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Włączam…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Przesyłanie"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Przesyłam"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Urządzenie bez nazwy"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gotowy do działania"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Oszczędzanie baterii jest włączone"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Zmniejsza wydajność i ogranicza dane w tle"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Wyłącz Oszczędzanie baterii"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> będzie zapisywać wszystko, co wyświetli się na ekranie."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> zacznie rejestrować całą zawartość ekranu, w tym powiadomienia, hasła, zdjęcia, wiadomości i dane karty."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Zezwolić aplikacji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> na rejestrowanie lub przesyłanie zawartości ekranu?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nie pokazuj ponownie"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ukryj wszystkie"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Zarządzaj"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon się nagrzewa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale telefon może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działał normalnie."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Odłącz ładowarkę"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Podczas ładowania tego urządzenia wystąpił błąd. Odłącz zasilacz, zwracając uwagę na kabel, który może być gorący."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Zobacz instrukcję postępowania"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lewy skrót"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Prawy skrót"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lewy skrót również odblokowuje"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 5392913b5ffe..559f50c803bc 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ativando…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Economia de bateria ativada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados em segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desativar a Economia de bateria"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Tudo o que aparecer na sua tela, incluindo notificações, senhas, fotos, mensagens e informações de pagamento, será capturado pelo <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Permitir que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grave ou transmita sua tela?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gerenciar"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"O smartphone está esquentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alguns recursos ficam limitados enquanto o smartphone é resfriado"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconecte o carregador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Ocorreu um problema com o carregamento deste dispositivo. Desconecte o adaptador de energia com cuidado, já que o cabo pode estar quente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver etapas de cuidado"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho à esquerda"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho à direita"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho à esquerda também desbloqueia"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 48e0cdc5a0ae..87d16db3e8fa 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ligado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Não estão disponíveis redes Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"A ativar..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmissão"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Poupança de bateria ativada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados de segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desativar a Poupança de bateria"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"O(a) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vai começar a captar tudo o que é apresentado no ecrã."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"O(a) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> irá começar a captar tudo o que é apresentado no ecrã, incluindo notificações, palavras-passe, fotos, mensagens e informações de pagamento."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Pretende permitir que o(a) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grave ou transmita o seu ecrã?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar de novo"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gerir"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"O telemóvel está a aquecer"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Algumas funcionalidades são limitadas enquanto o telemóvel arrefece"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"O telemóvel tenta arrefecer automaticamente. Pode continuar a utilizá-lo, mas este poderá funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, funcionará normalmente."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desligar o carregador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Ocorreu um problema ao carregar este dispositivo. Desligue o transformador e tenha cuidado porque o cabo pode estar quente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver os passos a ter em consideração"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho esquerdo"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho direito"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho esquerdo também desbloqueia"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 5392913b5ffe..559f50c803bc 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ativando…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pronto para transmitir"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Economia de bateria ativada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados em segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Desativar a Economia de bateria"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Tudo o que aparecer na sua tela, incluindo notificações, senhas, fotos, mensagens e informações de pagamento, será capturado pelo <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Permitir que <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> grave ou transmita sua tela?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gerenciar"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"O smartphone está esquentando"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Alguns recursos ficam limitados enquanto o smartphone é resfriado"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Desconecte o carregador"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Ocorreu um problema com o carregamento deste dispositivo. Desconecte o adaptador de energia com cuidado, já que o cabo pode estar quente."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Ver etapas de cuidado"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Atalho à esquerda"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Atalho à direita"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"O atalho à esquerda também desbloqueia"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index fa42f763d6d9..d2a3fe7835e0 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Se activează..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Proiectați"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Se proiectează"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispozitiv nedenumit"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pregătit pentru proiecție"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Economisire baterie activată"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce performanța și datele de fundal"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Dezactivați economisirea bateriei"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va începe să captureze tot ceea ce se afișează pe ecran."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va începe să captureze totul de pe ecran, inclusiv notificările, parolele, fotografiile, mesajele și informațiile de plată."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Permiteți <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> să înregistreze sau să proiecteze ecranul?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nu se mai afișează"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Ștergeți toate notificările"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Gestionați"</string>
@@ -819,6 +821,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefonul se încălzește"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Anumite funcții sunt limitate în timp ce telefonul se răcește"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Deconectați încărcătorul"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Există o problemă la încărcarea acestui dispozitiv. Deconectați adaptorul de curent și aveți grijă, deoarece cablul poate fi cald."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Vedeți pașii pentru îngrijire"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Comanda rapidă din stânga"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Comanda rapidă din dreapta"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Comanda rapidă din stânga și deblochează"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 0f0dd7899d5e..879989166d50 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi включен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Не удалось найти доступные сети Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Включение…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Передача изображения"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Безымянное устройство"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово к передаче"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Режим энергосбережения включен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Откл. фоновой передачи данных"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Отключить режим энергосбережения"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Приложение <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> получит доступ к изображению на экране устройства."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Приложение \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" будет транслировать всю информацию на экране, в том числе уведомления, пароли, фотографии, сообщения и платежные данные."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Разрешить приложению \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" записывать или транслировать экран устройства?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Больше не показывать"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Очистить все"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Настроить"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефон нагревается"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Пока телефон не остынет, некоторые функции могут быть недоступны."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ваш телефон остынет автоматически.\n\nОбратите внимание, что до тех пор он может работать медленнее, чем обычно."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Отключите зарядное устройство"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Во время зарядки возникла проблема. Отключите адаптер питания. Будьте осторожны, кабель может быть горячим."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Подробнее о действиях при перегреве…"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ярлык слева"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Ярлык справа"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ярлык слева также разблокирует экран"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 11a869f3a5c4..3302e7aff986 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ක්‍රියාත්මකයි"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ජාල ලබා ගත නොහැකිය"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ක්‍රියාත්මක කරමින්…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"කාස්ට් කිරීම"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"නම් නොකළ උපාංගය"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"කාස්ට් කිරීමට සුදානම්"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"බැටරි සුරැකුම ක්‍රියාත්මකයි"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ක්‍රියාකාරිත්වය සහ පසුබිම් දත්ත අඩු කරන්න"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"බැටරි සුරැකුම ක්‍රියාවිරහිත කරන්න"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"ඔබගේ තීරයේ දර්ශනය වන සෑම දෙයම <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ලබාගැනීම ආරම්භ කරන ලදි."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> දැනුම්දීම්, මුරපද, ඡායාරූප, පණිවුඩ සහ ගෙවීමේ තොරතුරු ඇතුළුව ඔබේ තිරයේ සැම දෙයක්ම ග්‍රහණ කිරීමට පටන් ගනියි."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"ඔබේ තිරය සටහන් කිරීමට හෝ විකාශන කිරීමට <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ට ඉඩ දෙන්නේද?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"නැවත නොපෙන්වන්න"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"සියල්ල හිස් කරන්න"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"කළමනාකරණය කරන්න"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"දුරකථනය උණුසුම් වෙමින්"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"දුරකථනය සිසිල් වන අතරතුර සමහර විශේෂාංග සීමිත විය හැකිය"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"ඔබගේ දුරකථනය ස්වයංක්‍රියව සිසිල් වීමට උත්සාහ කරනු ඇත. ඔබට තවම ඔබේ දුරකථනය භාවිත කළ හැකිය, නමුත් එය සෙමින් ධාවනය විය හැකිය.\n\nඔබේ දුරකථනය සිසිල් වූ පසු, එය සාමාන්‍ය ලෙස ධාවනය වනු ඇත."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"චාජරය පේනුවෙන් ඉවත් කරන්න"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"මෙම උපාංගය ආරෝපණ කිරීමේ ගැටලුවක් තිබේ බල ඇඩැප්ටරය ගලවා කේබලය උණුසුම් විය හැකි බැවින් පරෙස්සම් වන්න."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"රැකවරණ පියවර බලන්න"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"වම් කෙටි මග"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"දකුණු කෙටි මග"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"වම් කෙටි මගද අගුලු හැරේ"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3b9cc23dc1e8..6a2234619df4 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi‑Fi je zapnuté"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi‑Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Zapína sa…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Prenos"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Prenáša sa"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepomenované zariadenie"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pripravené na prenášanie"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Šetrič batérie je zapnutý"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Obmedzí výkonnosť a prenos údajov na pozadí"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Vypnúť šetrič batérie"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikácia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávať všetok obsah zobrazený na vašej obrazovke."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne snímať všetok obsah obrazovky vrátane upozornení, hesiel, fotiek, správ a platobných údajov."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Chcete povoliť aplikácii <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> zaznamenať alebo prenášať vašu obrazovku?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Nabudúce nezobrazovať"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Vymazať všetko"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Spravovať"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Teplota telefónu stúpa"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude telefón fungovať ako normálne."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Odpojte nabíjačku"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Vyskytol sa problém s nabíjaním tohto zariadenia. Odpojte nabíjačku a postupujte opatrne, pretože kábel môže byť horúci."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Zobraziť opatrenia"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Ľavá skratka"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Pravá skratka"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ľavá skratka tiež odomkne"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4866f22b1dec..50fe72df2b85 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je vklopljen."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Na voljo ni nobeno omrežje Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Vklapljanje …"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Predvajanje"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Predvajanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovana naprava"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Pripravljeno za predvajanje"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Omeji zmogljivost delovanja in prenos podatkov v ozadju"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Izklop varčevanja z energijo akumulatorja"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bo začela zajemati vse, kar je prikazano na zaslonu."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bo začela zajemati vse podatke na zaslonu, vključno z obvestili, gesli, fotografijami, sporočili in podatki o plačilih."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Ali aplikaciji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> dovolite snemanje ali predvajanje zaslona?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Tega ne prikaži več"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši vse"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Upravljanje"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon se segreva"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Nekatere funkcije bodo med ohlajanjem omejene."</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se telefon ohladi, bo zopet deloval kot običajno."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Odklopite polnilnik"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Pri polnjenju te naprave je prišlo do težave. Previdno odklopite napajalnik, ker se je kabel morda segrel."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Oglejte si navodila za ukrepanje"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Leva bližnjica"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Desna bližnjica"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Levo bližnjico uporabi tudi za odklepanje"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 4fb2585df196..eafcc337960d 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi i aktivizuar"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nuk ka rrjete Wi-Fi të disponueshme"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Po aktivizohet…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmeto"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Po transmeton"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Pajisje e paemërtuar"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Gati për transmetim"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"\"Kursyesi i baterisë\" është i aktivizuar"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Pakëson veprimtarinë dhe të dhënat në sfond"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Çaktivizo \"Kursyesin e baterisë\""</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> do të fillojë të regjistrojë çdo gjë që shfaqet në ekran."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> do të fillojë të regjistrojë çdo gjë në ekranin tënd, duke përfshirë njoftimet, fjalëkalimet, fotografitë, mesazhet dhe informacionet e pagesës."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Të lejohet që <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> të regjistrojë ose të transmetojë ekranin tënd?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Mos e shfaq sërish"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Pastroji të gjitha"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Menaxho"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefoni po bëhet i ngrohtë"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Disa funksione janë të kufizuara kur telefoni është duke u ftohur"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefoni yt do të përpiqet automatikisht që të ftohet. Mund ta përdorësh përsëri telefonin, por ai mund të punojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të punojë si normalisht."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Shkëput karikuesin"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Ka një problem me karikimin e kësaj pajisjeje. Hiqe spinën dhe trego kujdes pasi kablloja mund të jetë e ngrohtë."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Shiko hapat për kujdesin"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Shkurtorja majtas"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Shkurtorja djathtas"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Shkurtorja majtas shkyç po ashtu"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 535ae7248a0f..81c7b2ecd897 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -326,7 +326,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi је укључен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Није доступна ниједна Wi-Fi мрежа"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Укључује се..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Пребацивање"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Пребацивање"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименовани уређај"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Спремно за пребацивање"</string>
@@ -440,7 +441,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Уштеда батерије је укључена"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Смањује перформансе и позадинске податке"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Искључи Уштеду батерије"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ће почети да снима све што се приказује на екрану."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ће почети да снима све на екрану, укључујући обавештења, лозинке, слике, поруке и информације о плаћању."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Желите ли да дозволите да <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> снима или пребацује садржај екрана?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Не приказуј поново"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Обриши све"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Управљајте"</string>
@@ -819,6 +821,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефон се загрејао"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Неке функције су ограничене док се телефон не охлади"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Телефон ће аутоматски покушати да се охлади. И даље ћете моћи да користите телефон, али ће спорије реаговати.\n\nКада се телефон охлади, нормално ће радити."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Искључите пуњач из напајања"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Дошло је до проблема са пуњењем овог уређаја. Искључите адаптер из напајања и будите пажљиви јер кабл може да буде топао."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Погледајте упозорења"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Лева пречица"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Десна пречица"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"И лева пречица откључава"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 8352a2313e20..317cc8c81f2d 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi är aktiverat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Det finns inga tillgängliga Wi-Fi-nätverk"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Aktiverar …"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Casta"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Castar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Namnlös enhet"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Redo att casta"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Batterisparläget är aktiverat"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Minskar prestanda och bakgrundsdata"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Inaktivera batterisparläget"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar en bild av allt som visas på skärmen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> börjar spela in allt på skärmen, inklusive aviseringar, lösenord, foton, meddelanden och betalningsuppgifter."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vill du tillåta att <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> spelar in eller castar skärmen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Visa inte igen"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Rensa alla"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Hantera"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Mobilen börjar bli varm"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Vissa funktioner är begränsade medan mobilen svalnar"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Mobilen försöker svalna automatiskt. Du kan fortfarande använda mobilen, men den kan vara långsammare än vanligt.\n\nMobilen fungerar som vanligt när den har svalnat."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Koppla ur laddaren"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Det går inte att ladda denna enhet. Koppla ur nätadaptern, men var försiktig eftersom kabeln kan vara varm."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Visa alla skötselråd"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Vänster genväg"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Höger genväg"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lås även upp enheten med vänster genväg"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 407c056322dd..1b57252fd86e 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Imewasha Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hakuna mitandao ya Wi-Fi inayopatikana"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Inawasha..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Tuma"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Inatuma"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Kifaa hakina jina"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tayari kutuma"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Kiokoa Betri kimewashwa"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Hupunguza utendaji na data ya chini chini"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Zima Kiokoa Betri"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> itaanza kupiga picha kila kitu kinachoonyeshwa kwenye skrini yako."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> itaanza kurekodi kila kitu kwenye skrini ikiwa ni pamoja na arifa, manenosiri, picha, ujumbe na maelezo ya malipo."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Ungependa kuruhusu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> irekodi au kutuma kwenye skrini yako?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Usionyeshe tena"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Futa zote"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Dhibiti"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Joto la simu linaongezeka"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Baadhi ya vipengele havitatumika kwenye simu wakati inapoa"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole. \n\nPindi simu yako itakapopoa, itaendelea kufanya kazi kama kawaida."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Chomoa chaja"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Kuna tatizo la kuchaji kifaa hiki. Chomoa adapta ya nishati na uwe mwangalifu, huenda kebo ni moto."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Angalia hatua za ulinzi"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Njia ya mkato ya kushoto"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Njia ya mkato ya kulia"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Njia ya mkato ya kushoto pia inafungua"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 3f81f729ccde..adff7269763f 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ஆன் செய்கிறது…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"திரையிடத் தயார்"</string>
@@ -437,7 +438,10 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"செயல்திறனையும் பின்புல டேட்டா உபயோகத்தையும் குறைக்கிறது"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"பேட்டரி சேமிப்பானை ஆஃப் செய்"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"திரையில் காட்டப்படும் அனைத்தையும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> படமெடுக்கும்."</string>
+ <!-- no translation found for media_projection_dialog_text (1443042478990422751) -->
+ <skip />
+ <!-- no translation found for media_projection_dialog_title (7574971526813630219) -->
+ <skip />
<string name="media_projection_remember_text" msgid="3103510882172746752">"மீண்டும் காட்டாதே"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"எல்லாவற்றையும் அழி"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"அறிவிப்புகளை நிர்வகி"</string>
@@ -814,6 +818,10 @@
<string name="high_temp_title" msgid="4589508026407318374">"மொபைல் சூடாகிறது"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"மொபைலின் வெப்ப அளவு குறையும் போது, சில அம்சங்களைப் பயன்படுத்த முடியாது"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"உங்கள் மொபைலின் வெப்ப அளவு தானாகவே குறையும். தொடர்ந்து நீங்கள் மொபைலைப் பயன்படுத்தலாம், ஆனால் அதன் வேகம் குறைவாக இருக்கக்கூடும்.\n\nமொபைலின் வெப்ப அளவு குறைந்தவுடன், அது இயல்பு நிலையில் இயங்கும்."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"சார்ஜரைத் துண்டிக்கவும்"</string>
+ <!-- no translation found for high_temp_alarm_notify_message (1802871059489414932) -->
+ <skip />
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"இடப்புற ஷார்ட்கட்"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"வலப்புற ஷார்ட்கட்"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"இடப்புற ஷார்ட்கட் மூலமாகவும் திறக்கும்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index c0a093a8223d..de7f48c2831e 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -38,7 +38,7 @@
<string name="battery_saver_start_action" msgid="8187820911065797519">"బ్యాటరీ సేవర్‌ను ఆన్ చేయండి"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"సెట్టింగ్‌లు"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"స్క్రీన్‌ను స్వయంచాలకంగా తిప్పండి"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"స్క్రీన్ ఆటో-రొటేట్‌"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"మ్యూట్"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"స్వయంచాలకం"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"నోటిఫికేషన్‌లు"</string>
@@ -302,7 +302,7 @@
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ఆన్ చేస్తోంది…"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"ప్రకాశం"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"స్వయంచాలకంగా తిప్పడం"</string>
- <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"స్క్రీన్‌ను స్వయంచాలకంగా తిప్పు"</string>
+ <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"స్క్రీన్ ఆటో-రొటేట్‌"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="8187398200140760213">"<xliff:g id="ID_1">%s</xliff:g> మోడ్"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"తిప్పడం లాక్ చేయబడింది"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"పోర్ట్రెయిట్"</string>
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ఆన్‌లో ఉంది"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi నెట్‌వర్క్‌లు ఏవీ అందుబాటులో లేవు"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"ఆన్ చేస్తోంది…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"ప్రసారం"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"ప్రసారం చేస్తోంది"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"పేరులేని పరికరం"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ప్రసారం చేయడానికి సిద్ధంగా ఉంది"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"బ్యాటరీ సేవర్ ఆన్‌లో ఉంది"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"బ్యాటరీ సేవర్‌ను ఆఫ్ చేయండి"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> మీ స్క్రీన్‌పై కనిపించే ప్రతిదాన్ని క్యాప్చర్ చేయడం ప్రారంభిస్తుంది."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"నోటిఫికేషన్‌లు, పాస్‌వర్డ్‌లు, ఫోటోలు, సందేశాలు మరియు చెల్లింపు సమాచారంతో సహా <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> మీ స్క్రీన్‌లోని ప్రతి సమాచారాన్నీ క్యాప్చర్ చేయడం ప్రారంభిస్తుంది."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"మీ స్క్రీన్‌ను రికార్డ్ లేదా క్యాస్ట్ చేయడానికి <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ను అనుమతించాలా?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"మళ్లీ చూపవద్దు"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"అన్నీ క్లియర్ చేయండి"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"నిర్వహించండి"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"ఫోన్ వేడెక్కుతోంది"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని లక్షణాలు పరిమితం చేయబడ్డాయి"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"మీ ఫోన్ స్వయంచాలకంగా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ప్లగ్ నుండి ఛార్జర్‌ తీసివేయండి"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"ఈ పరికరాన్ని ఛార్జ్ చేయడంలో సమస్య ఉంది. పవర్ అడాప్టర్‌ను ప్లగ్ నుండి తీసివేసి, కేబుల్ ఏమైనా వేడిగా అయితే తగిన జాగ్రత్తలు తీసుకోండి."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ఎడమవైపు షార్ట్‌కట్"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"కుడివైపు షార్ట్‌కట్"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ఎడమవైపు షార్ట్‌కట్ కూడా అన్‌లాక్ చేస్తుంది"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 3c75c9330abf..cc708e6c65e5 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi เปิดอยู่"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ไม่มีเครือข่าย Wi-Fi พร้อมใช้งาน"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"กำลังเปิด..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"แคสต์"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"กำลังส่ง"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"อุปกรณ์ที่ไม่มีชื่อ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"พร้อมที่จะส่ง"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ลดการใช้แบตเตอรี่และอินเทอร์เน็ตที่ใช้งานอยู่เบื้องหลัง"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"ปิดโหมดประหยัดแบตเตอรี่"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> จะเริ่มจับภาพทุกอย่างที่แสดงบนหน้าจอ"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> จะเริ่มจับภาพทุกสิ่งบนหน้าจอ รวมถึงการแจ้งเตือน รหัสผ่าน รูปภาพ ข้อความ และข้อมูลการชำระเงิน"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"อนุญาตให้ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> บันทึกหรือแคสต์หน้าจอของคุณไหม"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"ไม่ต้องแสดงข้อความนี้อีก"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"ล้างทั้งหมด"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"จัดการ"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"โทรศัพท์เริ่มเครื่องร้อน"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"ถอดปลั๊กที่ชาร์จ"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"พบปัญหาในการชาร์จอุปกรณ์นี้ ถอดปลั๊กอะแดปเตอร์ด้วยความระมัดระวังเพราะสายอาจร้อน"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"ดูขั้นตอนในการดูแลรักษา"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ทางลัดทางซ้าย"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ทางลัดทางขวา"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"ทางลัดทางซ้ายปลดล็อกได้ด้วย"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 3c05d39c6b16..bd814c7f0429 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Naka-on Ang Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Walang available na mga Wi-Fi network"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Ino-on…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"I-cast"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Nagka-cast"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Walang pangalang device"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Handang mag-cast"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Naka-on ang Pangtipid sa Baterya"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Binabawasan ang performance at data sa background"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"I-off ang Pangtipid sa Baterya"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"Sisimulan ng i-capture ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang lahat ng ipinapakita sa iyong screen."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"Magsisimula ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> na i-capture ang lahat sa iyong screen kasama ang mga notification, password, larawan, mensahe at impormasyon sa pagbabayad."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Payagan ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> na i-record o i-cast ang iyong screen?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Huwag ipakitang muli"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"I-clear lahat"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Pamahalaan"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Umiinit ang telepono"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Limitado ang ilang feature habang nagku-cool down ang telepono"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Awtomatikong susubukan ng iyong telepono na mag-cool down. Magagamit mo pa rin ang iyong telepono, ngunit maaaring mas mabagal ang paggana nito.\n\nKapag nakapag-cool down na ang iyong telepono, gagana na ito nang normal."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Hugutin ang charger"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"May isyu sa pag-charge ng device na ito. Hugutin ang power adapter at mag-ingat dahil maaaring mainit ang cable."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Tingnan ang mga hakbang sa pangangalaga"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Kaliwang shortcut"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Kanang shortcut"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Ina-unlock din ng kaliwang shortcut ang"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 0f2a7e7af75b..72531315cebe 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kablosuz Bağlantı Açık"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Kullanılabilir kablosuz ağ yok"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Açılıyor…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayınla"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayınlanıyor"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Yayın için hazır"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Pil Tasarrufu açık"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Performansı ve arka plan verilerini azaltır"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Pil Tasarrufu\'nu kapat"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ekranınızda görüntülenen her şeyi kaydetmeye başlayacak."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ekranınızda görüntülenen her şeyi (bildirimler, şifreler, fotoğraflar, mesajlar ve ödeme bilgileri dahil) kaydetmeye başlayacak."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> öğesinin ekranınızı kaydetmesine veya yayınlamasına izin veriyor musunuz?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Bir daha gösterme"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Tümünü temizle"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Yönet"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon ısınıyor"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Şarj cihazını çıkarın"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Bu cihaz şarj edilirken bir sorun oluştu. Güç adaptörünün fişini çekin. Kablo sıcak olabileceğinden fişi çekerken dikkatli olun."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Bakımla ilgili adımlara bakın"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Sol kısayol"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Sağ kısayol"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Sol kısayol aynı zamanda kilidi açar"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index a1db3354bcff..213decb6c34d 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -327,7 +327,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi увімкнено"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Немає доступних мереж Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Увімкнення…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляція"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Готово до трансляції"</string>
@@ -443,7 +444,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Режим економії заряду акумулятора ввімкнено"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Знижується продуктивність і обмежуються фонові дані"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Вимкнути режим економії заряду акумулятора"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> отримає доступ до всіх даних, які відображаються на вашому екрані."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> отримає доступ до всіх даних на екрані, зокрема до сповіщень, паролів, фотографій, повідомлень і платіжної інформації."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Дозволити додатку <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> записувати або транслювати дані на екрані?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Більше не показувати"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Очистити все"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Керувати"</string>
@@ -824,6 +826,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Телефон нагрівається"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Під час охолодження деякі функції обмежуються"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ваш телефон охолоджуватиметься автоматично. Ви можете далі користуватися телефоном, але він може працювати повільніше.\n\nКоли телефон охолоне, він працюватиме належним чином."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Відключіть зарядний пристрій"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Виникла проблема із заряджанням пристрою. Відключіть адаптер живлення, однак будьте обережні, оскільки кабель може бути гарячим."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Переглянути застереження"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Комбінація клавіш ліворуч"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Комбінація клавіш праворуч"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Комбінація клавіш ліворуч також розблоковує"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 45dc3b9407ad..f6d5888fb5cb 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"‏Wi-Fi آن ہے"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"‏کوئی WI-FI نیٹ ورک دستیاب نہیں"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"آن ہو رہا ہے…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"کاسٹ کریں"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"کاسٹنگ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"بغیر نام والا آلہ"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"کاسٹ کرنے کیلئے تیار"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"بیٹری سیور آن ہے"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"بیٹری سیور آف کریں"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> آپ کی اسکرین پر ڈسپلے ہونے والی ہر چیز کو کیپچر کرنا شروع کر دیگی۔"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> آپ کی اسکرین پر ہر چیز بشمول اطلاعات، پاس ورڈز، تصاویر، پیغامات اور ادائیگی کی معلومات کو کیپچر کرنا شروع کر دے گا۔"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> کو آپ کی اسکرین کو ریکارڈ یا کاسٹ کرنے کی اجازت دیں؟"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"دوبارہ نہ دکھائیں"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"سبھی کو صاف کریں"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"نظم کریں"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"فون گرم ہو رہا ہے"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"فون کے ٹھنڈے ہو جانے تک کچھ خصوصیات محدود ہیں"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"آپ کا فون خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ ابھی بھی اپنا فون استعمال کر سکتے ہیں، مگر ہو سکتا ہے یہ سست چلے۔\n\nایک بار آپ کا فون ٹھنڈا ہوجائے تو یہ معمول کے مطابق چلے گا۔"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"چارجر ان پلگ کریں"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"اس آلہ کو چارج کرنے میں ایک مسئلہ ہے۔ پاور ایڈاپٹر کو ان پلگ کریں اور دھیان دیں کیونکہ تار گرم ہو سکتا ہے۔"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"نگہداشت کے اقدامات ملاحظہ کریں"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"بائيں جانب کا شارٹ کٹ"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"دائیں جانب کا شارٹ کٹ"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"بائيں جانب کے شارٹ کٹ سے بھی غیرمقفل ہوتا ہے"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index de98f25e8936..39d9acd9cc61 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi yoqilgan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hech qanday Wi-Fi tarmog‘i mavjud emas"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Yoqilmoqda…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Translatsiya"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Translatsiya qilinmoqda"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nomsiz qurilma"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tarqatish uchun tayyor"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Quvvat tejash rejimi yoniq"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Unumdorlik pasayadi va fonda internetdan foydalanish cheklanadi"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Quvvat tejash rejimidan chiqish"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilovasi qurilma ekranidagi har qanday tasvirni ko‘rishni boshlaydi."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekrandagi bildirishnomalar, parollar, rasmlar, xabarlar va toʻlovlar kabi barcha narsalarni translatsiya qilishni boshlaydi."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranni yozib olishi va translatsiya qilishiga ruxsat berilsinmi?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Boshqa ko‘rsatilmasin"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hammasini tozalash"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Boshqarish"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Telefon qizib ketdi"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Telefon sovish paytida ayrim funksiyalar ishlamasligi mumkin"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Telefon avtomatik ravishda o‘zini sovitadi. Telefoningizdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Quvvatlash moslamasini uzing"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Bu qurilmani quvvatlashda muammo bor. Quvvat adapteri va kabelni tarmoqdan uzing, ular qizib ketgan boʻlishi mumkin."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Batafsil axborot"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Chapga yorlig‘i"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"O‘ngga yorlig‘i"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Chapga tugmasi ham qulfdan chiqaradi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 42357df8a62f..d36ba308fb1a 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi đang bật"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Không có mạng Wi-Fi"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Đang bật…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Truyền"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Đang truyền"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Thiết bị không có tên"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Sẵn sàng truyền"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Trình tiết kiệm pin đang bật"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Giảm hiệu suất và dữ liệu nền"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Tắt trình tiết kiệm pin"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ bắt đầu chụp mọi thứ hiển thị trên màn hình."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ bắt đầu chụp mọi thứ trên màn hình của bạn, bao gồm cả thông báo, mật khẩu, ảnh, tin nhắn và thông tin thanh toán."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Bạn có muốn cho phép <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ghi hoặc truyền màn hình của bạn không?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Không hiển thị lại"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Xóa tất cả"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Quản lý"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Điện thoại đang nóng lên"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Một số tính năng bị hạn chế trong khi điện thoại nguội dần"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn có thể sử dụng điện thoại, nhưng điện thoại có thể chạy chậm hơn. \n\nSau khi đã nguội, điện thoại sẽ chạy bình thường."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Rút phích cắm bộ sạc"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Đã xảy ra sự cố khi sạc thiết bị này. Hãy rút phích cắm bộ chuyển đổi điện và cẩn thận vì dây cáp có thể nóng."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Xem các bước chăm sóc"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Lối tắt bên trái"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Lối tắt bên phải"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Lối tắt bên trái cũng mở khóa"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index c1a0bf4e3fbf..d645d47c3483 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN 已开启"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"没有 WLAN 网络"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"正在开启…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"投射"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"正在投射"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名设备"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"已准备好投射"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"省电模式已开启"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低性能并限制后台流量"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"关闭省电模式"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>将开始截取您的屏幕上显示的所有内容。"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>将开始捕获您屏幕上显示的所有内容(包括通知、密码、照片、消息和付款信息)。"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"要允许<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>录制或投射您的屏幕内容吗?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不再显示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"手机温度上升中"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"手机降温时,部分功能的使用会受限制"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"您的手机将自动尝试降温。您依然可以使用您的手机,但是手机运行速度可能会更慢。\n\n手机降温后,就会恢复正常的运行速度。"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"拔下充电器"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"为此设备充电时出现问题。这可能是由数据线太热所导致,请拔下电源适配器并采取相应的处理措施。"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"查看处理步骤"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"向左快捷方式"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"向右快捷方式"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"向左快捷方式也可以解锁设备"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 436aecc61bc4..ad6000b84446 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 已開啟"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有可用的 Wi-Fi 網絡"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"正在開啟…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"正在放送"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"放送準備完成"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"省電模式已開啟"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"關閉省電模式"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取您的螢幕上顯示的內容。"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取螢幕上的所有內容,包括通知、密碼、相片、訊息和付款資料。"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"要允許 <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 錄製或投放您的畫面嗎?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不用再顯示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"手機溫度正在上升"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"手機降溫時,部分功能會受限制"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"手機會自動嘗試降溫。您仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"拔下充電器"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"為此裝置充電時發生問題。請拔除電源適配器並注意安全,因為連接線可能會發熱。"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"查看保養步驟"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"向左捷徑"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"向右捷徑"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"向左捷徑亦能將裝置解鎖"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index fbb69312b7e2..edb3f62794d9 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"已開啟 Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有 Wi-Fi 網路"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"開啟中…"</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"可以開始投放了"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"節約耗電量模式已開啟"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"關閉節約耗電量模式"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取你的螢幕上顯示的內容。"</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 會開始擷取畫面上的所有內容 (包含通知、密碼、相片、訊息和付款資訊)。"</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"要允許 <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 錄製或投放你的畫面嗎?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"不要再顯示"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"手機變熱"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"手機降溫時,部分功能會受限"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"手機會自動嘗試降溫。你仍可繼續使用手機,但是手機的運作速度可能會較慢。\n\n手機降溫完畢後,就會恢復正常的運作速度。"</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"拔除充電器"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"為這個裝置充電時發生問題。這可能是因為傳輸線過熱所致,請拔除電源變壓器並採取處理措施。"</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"查看處理步驟"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"向左快速鍵"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"向右快速鍵"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"向左快速鍵可一併解鎖裝置"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 0eb6bd4c26f3..e92d6abc8e38 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -325,7 +325,8 @@
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"I-Wi-Fi ivuliwe"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Awekho amanethiwekhi we-Wi-Fi atholakalayo"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7748206246119760554">"Iyavula..."</string>
- <string name="quick_settings_cast_title" msgid="7709016546426454729">"Abalingisi"</string>
+ <!-- no translation found for quick_settings_cast_title (6954684227605751758) -->
+ <skip />
<string name="quick_settings_casting" msgid="6601710681033353316">"Ukusakaza"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Idivayisi engenalo igama"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Ilungele ukusakaza"</string>
@@ -437,7 +438,8 @@
<string name="battery_saver_notification_title" msgid="8614079794522291840">"Isilondolozi sebhethri sivuliwe"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Sehlisa ukusebenza nedatha yasemuva"</string>
<string name="battery_saver_notification_action_text" msgid="132118784269455533">"Vala isilondolozi sebhethri"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> izoqala ukuthwebula yonke into eboniswa kusikrini sakho."</string>
+ <string name="media_projection_dialog_text" msgid="1443042478990422751">"I-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> izoqala ukuthatha yonke into kusikrini sakho efaka izaziso, amaphasiwedi, izithombe, imilayezo, nolwazi lwenkokhelo."</string>
+ <string name="media_projection_dialog_title" msgid="7574971526813630219">"Vumela i-<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ukuthi irekhode noma isakaze isikrini sakho?"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ungabonisi futhi"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Sula konke"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Phatha"</string>
@@ -814,6 +816,9 @@
<string name="high_temp_title" msgid="4589508026407318374">"Ifoni iyafudumala"</string>
<string name="high_temp_notif_message" msgid="5642466103153429279">"Ezinye izici zikhawulelwe ngenkathi ifoni iphola"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile."</string>
+ <string name="high_temp_alarm_title" msgid="442812040762745210">"Khipha ishaja"</string>
+ <string name="high_temp_alarm_notify_message" msgid="1802871059489414932">"Kukhona inkinga yokushaja le divayisi. Khipha i-adaptha yamandla, uphinde unakekele njengoba ikhebuli kungenzeka lifudumele."</string>
+ <string name="high_temp_alarm_help_care_steps" msgid="3631075329318070726">"Bona izinyathelo zokunakekelwa"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"Isinqamuleli sangakwesokunxele"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"Isinqamuleli sangakwesokudla"</string>
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"Isinqamuleli sangakwesokunxele naso siyavula"</string>
diff --git a/packages/SystemUI/res/values/internal.xml b/packages/SystemUI/res/values/internal.xml
index e0d3cd23565f..930cfce65b61 100644
--- a/packages/SystemUI/res/values/internal.xml
+++ b/packages/SystemUI/res/values/internal.xml
@@ -18,6 +18,5 @@
<dimen name="status_bar_height">@*android:dimen/status_bar_height</dimen>
<dimen name="navigation_bar_height">@*android:dimen/navigation_bar_height</dimen>
<dimen name="navigation_bar_height_car_mode">@*android:dimen/navigation_bar_height_car_mode</dimen>
- <color name="screen_pinning_primary_text">@*android:color/primary_text_default_material_light</color>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 30dbc8bd1d20..2cd2c439ee65 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -239,10 +239,19 @@
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
</style>
- <style name="TextAppearance.DeviceManagementDialog.Title" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle">
+ <style name="TextAppearance.DeviceManagementDialog">
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ </style>
+
+ <style name="TextAppearance.DeviceManagementDialog.Title" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle"/>
+
+ <style name="DeviceManagementDialogTitle">
<item name="android:gravity">center</item>
+ <item name="android:textAppearance">@style/TextAppearance.DeviceManagementDialog.Title</item>
</style>
+ <style name="TextAppearance.DeviceManagementDialog.Content" parent="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
+
<style name="BaseBrightnessDialogContainer" parent="@style/Theme.SystemUI">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 078947ca0468..953816e8bf12 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -17,6 +17,7 @@
package com.android.systemui.shared.recents;
import android.graphics.Rect;
+import android.os.Bundle;
import android.view.MotionEvent;
/**
@@ -82,4 +83,13 @@ interface ISystemUiProxy {
*/
boolean supportsRoundedCornersOnWindows() = 11;
+ /**
+ * Proxies the assistant gesture's progress started from navigation bar.
+ */
+ void onAssistantProgress(float progress) = 12;
+
+ /**
+ * Start the assistant.
+ */
+ void startAssistant(in Bundle bundle) = 13;
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 46ed715bd48f..0f71ffb34938 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -16,6 +16,7 @@
package com.android.systemui.shared.system;
+import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE;
@@ -464,6 +465,17 @@ public class ActivityManagerWrapper {
}
/**
+ * @return whether lock task mode is active in kiosk-mode (not screen pinning).
+ */
+ public boolean isLockTaskKioskModeActive() {
+ try {
+ return ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_LOCKED;
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
* Shows a voice session identified by {@code token}
* @return true if the session was shown, false otherwise
*/
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/DevicePolicyManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/DevicePolicyManagerWrapper.java
new file mode 100644
index 000000000000..c6722aece9fc
--- /dev/null
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/DevicePolicyManagerWrapper.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.shared.system;
+
+import android.app.AppGlobals;
+import android.app.admin.DevicePolicyManager;
+
+/**
+ * Wrapper for {@link DevicePolicyManager}.
+ */
+public class DevicePolicyManagerWrapper {
+ private static final DevicePolicyManagerWrapper sInstance = new DevicePolicyManagerWrapper();
+
+ private static final DevicePolicyManager sDevicePolicyManager =
+ AppGlobals.getInitialApplication().getSystemService(DevicePolicyManager.class);
+
+ private DevicePolicyManagerWrapper() { }
+
+ public static DevicePolicyManagerWrapper getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * Returns whether the given package is allowed to run in Lock Task mode.
+ */
+ public boolean isLockTaskPermitted(String pkg) {
+ return sDevicePolicyManager.isLockTaskPermitted(pkg);
+ }
+}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
index 32e4bbf4cd50..443c1e1280fa 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
@@ -22,8 +22,10 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.ResolveInfoFlags;
import android.content.pm.ResolveInfo;
import android.os.RemoteException;
+import android.os.UserHandle;
import java.util.List;
@@ -40,6 +42,8 @@ public class PackageManagerWrapper {
return sInstance;
}
+ private PackageManagerWrapper() {}
+
/**
* @return the activity info for a given {@param componentName} and {@param userId}.
*/
@@ -65,4 +69,19 @@ public class PackageManagerWrapper {
return null;
}
}
+
+ /**
+ * Determine the best Activity to perform for a given Intent.
+ */
+ public ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags) {
+ final String resolvedType =
+ intent.resolveTypeIfNeeded(AppGlobals.getInitialApplication().getContentResolver());
+ try {
+ return mIPackageManager.resolveIntent(
+ intent, resolvedType, flags, UserHandle.getCallingUserId());
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
index 1539582ef18b..64517bae6d6b 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
@@ -52,9 +52,11 @@ public class CarrierTextController {
private boolean mTelephonyCapable;
private boolean mShowMissingSim;
private boolean mShowAirplaneMode;
- private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @VisibleForTesting
+ protected KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private WifiManager mWifiManager;
- private boolean[] mSimErrorState = new boolean[TelephonyManager.getDefault().getPhoneCount()];
+ private boolean[] mSimErrorState;
+ private final int mSimSlotsNumber;
private CarrierTextCallback mCarrierTextCallback;
private Context mContext;
private CharSequence mSeparator;
@@ -72,7 +74,8 @@ public class CarrierTextController {
}
};
- private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
+ @VisibleForTesting
+ protected final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
@Override
public void onRefreshCarrierInfo() {
if (DEBUG) {
@@ -93,7 +96,7 @@ public class CarrierTextController {
}
public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) {
- if (slotId < 0) {
+ if (slotId < 0 || slotId >= mSimSlotsNumber) {
Log.d(TAG, "onSimStateChanged() - slotId invalid: " + slotId
+ " mTelephonyCapable: " + Boolean.toString(mTelephonyCapable));
return;
@@ -144,36 +147,48 @@ public class CarrierTextController {
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mSeparator = separator;
mWakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class);
+ mSimSlotsNumber = ((TelephonyManager) context.getSystemService(
+ Context.TELEPHONY_SERVICE)).getPhoneCount();
+ mSimErrorState = new boolean[mSimSlotsNumber];
}
/**
* Checks if there are faulty cards. Adds the text depending on the slot of the card
*
* @param text: current carrier text based on the sim state
+ * @param carrierNames names order by subscription order
+ * @param subOrderBySlot array containing the sub index for each slot ID
* @param noSims: whether a valid sim card is inserted
* @return text
*/
- private CharSequence updateCarrierTextWithSimIoError(CharSequence text, boolean noSims) {
+ private CharSequence updateCarrierTextWithSimIoError(CharSequence text,
+ CharSequence[] carrierNames, int[] subOrderBySlot, boolean noSims) {
final CharSequence carrier = "";
CharSequence carrierTextForSimIOError = getCarrierTextForSimState(
IccCardConstants.State.CARD_IO_ERROR, carrier);
+ // mSimErrorState has the state of each sim indexed by slotID.
for (int index = 0; index < mSimErrorState.length; index++) {
- if (mSimErrorState[index]) {
- // In the case when no sim cards are detected but a faulty card is inserted
- // overwrite the text and only show "Invalid card"
- if (noSims) {
- return concatenate(carrierTextForSimIOError,
- getContext().getText(
- com.android.internal.R.string.emergency_calls_only),
- mSeparator);
- } else if (index == 0) {
- // prepend "Invalid card" when faulty card is inserted in slot 0
- text = concatenate(carrierTextForSimIOError, text, mSeparator);
- } else {
- // concatenate "Invalid card" when faulty card is inserted in slot 1
- text = concatenate(text, carrierTextForSimIOError, mSeparator);
- }
+ if (!mSimErrorState[index]) {
+ continue;
+ }
+ // In the case when no sim cards are detected but a faulty card is inserted
+ // overwrite the text and only show "Invalid card"
+ if (noSims) {
+ return concatenate(carrierTextForSimIOError,
+ getContext().getText(
+ com.android.internal.R.string.emergency_calls_only),
+ mSeparator);
+ } else if (subOrderBySlot[index] != -1) {
+ int subIndex = subOrderBySlot[index];
+ // prepend "Invalid card" when faulty card is inserted in slot 0 or 1
+ carrierNames[subIndex] = concatenate(carrierTextForSimIOError,
+ carrierNames[subIndex],
+ mSeparator);
+ } else {
+ // concatenate "Invalid card" when faulty card is inserted in other slot
+ text = concatenate(text, carrierTextForSimIOError, mSeparator);
}
+
}
return text;
}
@@ -209,16 +224,25 @@ public class CarrierTextController {
protected void updateCarrierText() {
boolean allSimsMissing = true;
boolean anySimReadyAndInService = false;
- boolean missingSimsWithSubs = false;
CharSequence displayText = null;
List<SubscriptionInfo> subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false);
final int numSubs = subs.size();
final int[] subsIds = new int[numSubs];
+ // This array will contain in position i, the index of subscription in slot ID i.
+ // -1 if no subscription in that slot
+ final int[] subOrderBySlot = new int[mSimSlotsNumber];
+ for (int i = 0; i < mSimSlotsNumber; i++) {
+ subOrderBySlot[i] = -1;
+ }
+ final CharSequence[] carrierNames = new CharSequence[numSubs];
if (DEBUG) Log.d(TAG, "updateCarrierText(): " + numSubs);
+
for (int i = 0; i < numSubs; i++) {
int subId = subs.get(i).getSubscriptionId();
+ carrierNames[i] = "";
subsIds[i] = subId;
+ subOrderBySlot[subs.get(i).getSimSlotIndex()] = i;
IccCardConstants.State simState = mKeyguardUpdateMonitor.getSimState(subId);
CharSequence carrierName = subs.get(i).getCarrierName();
CharSequence carrierTextForSimState = getCarrierTextForSimState(simState, carrierName);
@@ -227,7 +251,7 @@ public class CarrierTextController {
}
if (carrierTextForSimState != null) {
allSimsMissing = false;
- displayText = concatenate(displayText, carrierTextForSimState, mSeparator);
+ carrierNames[i] = carrierTextForSimState;
}
if (simState == IccCardConstants.State.READY) {
ServiceState ss = mKeyguardUpdateMonitor.mServiceStates.get(subId);
@@ -256,7 +280,6 @@ public class CarrierTextController {
// described above.
displayText = makeCarrierStringOnEmergencyCapable(
getMissingSimMessage(), subs.get(0).getCarrierName());
- missingSimsWithSubs = true;
} else {
// We don't have a SubscriptionInfo to get the emergency calls only from.
// Grab it from the old sticky broadcast if possible instead. We can use it
@@ -286,24 +309,32 @@ public class CarrierTextController {
}
}
- displayText = updateCarrierTextWithSimIoError(displayText, allSimsMissing);
+ displayText = updateCarrierTextWithSimIoError(displayText, carrierNames, subOrderBySlot,
+ allSimsMissing);
// APM (airplane mode) != no carrier state. There are carrier services
// (e.g. WFC = Wi-Fi calling) which may operate in APM.
if (!anySimReadyAndInService && WirelessUtils.isAirplaneModeOn(mContext)) {
displayText = getAirplaneModeMessage();
}
- Handler handler = Dependency.get(Dependency.MAIN_HANDLER);
+ if (TextUtils.isEmpty(displayText)) {
+ displayText = TextUtils.join(mSeparator, carrierNames);
+ }
final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo(
displayText,
- displayText.toString().split(mSeparator.toString()),
- anySimReadyAndInService && !missingSimsWithSubs,
+ carrierNames,
+ !allSimsMissing,
subsIds);
+ postToCallback(info);
+ }
+
+ @VisibleForTesting
+ protected void postToCallback(CarrierTextCallbackInfo info) {
+ Handler handler = Dependency.get(Dependency.MAIN_HANDLER);
final CarrierTextCallback callback = mCarrierTextCallback;
if (callback != null) {
handler.post(() -> callback.updateCarrierInfo(info));
}
-
}
private Context getContext() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index 563b0077c7f4..507c82246293 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -148,6 +148,7 @@ public class KeyguardClockSwitch extends RelativeLayout {
Dependency.get(StatusBarStateController.class).removeCallback(mStateListener);
Dependency.get(SysuiColorExtractor.class)
.removeOnColorsChangedListener(mColorsListener);
+ setClockPlugin(null);
}
private void setClockPlugin(ClockPlugin plugin) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index b0670fd0a91a..17546c512778 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -27,7 +27,6 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.format.DateFormat;
-import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
@@ -42,8 +41,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.google.android.collect.Sets;
-
import java.util.Locale;
import java.util.TimeZone;
@@ -63,7 +60,6 @@ public class KeyguardStatusView extends GridLayout implements
private Runnable mPendingMarqueeStart;
private Handler mHandler;
- private ArraySet<View> mVisibleInDoze;
private boolean mPulsing;
private float mDarkAmount = 0;
private int mTextColor;
@@ -175,7 +171,6 @@ public class KeyguardStatusView extends GridLayout implements
}
mOwnerInfo = findViewById(R.id.owner_info);
mKeyguardSlice = findViewById(R.id.keyguard_status_area);
- mVisibleInDoze = Sets.newArraySet(mClockView, mKeyguardSlice);
mTextColor = mClockView.getCurrentTextColor();
mKeyguardSlice.setContentChangeListener(this::onSliceContentChanged);
@@ -348,7 +343,6 @@ public class KeyguardStatusView extends GridLayout implements
}
final int blendedTextColor = ColorUtils.blendARGB(mTextColor, Color.WHITE, mDarkAmount);
- updateDozeVisibleViews();
mKeyguardSlice.setDarkAmount(mDarkAmount);
mClockView.setTextColor(blendedTextColor);
}
@@ -372,13 +366,6 @@ public class KeyguardStatusView extends GridLayout implements
return;
}
mPulsing = pulsing;
- updateDozeVisibleViews();
- }
-
- private void updateDozeVisibleViews() {
- for (View child : mVisibleInDoze) {
- child.setAlpha(mDarkAmount == 1 && mPulsing ? 0.8f : 1);
- }
}
private boolean shouldShowLogout() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 3ac7fd4c61c1..f20811856706 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -196,6 +196,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private static KeyguardUpdateMonitor sInstance;
private final Context mContext;
+ private final boolean mIsPrimaryUser;
HashMap<Integer, SimData> mSimDatas = new HashMap<Integer, SimData>();
HashMap<Integer, ServiceState> mServiceStates = new HashMap<Integer, ServiceState>();
@@ -242,8 +243,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private boolean mIsDreaming;
private final DevicePolicyManager mDevicePolicyManager;
private boolean mLogoutEnabled;
- private boolean mFingerprintLockedOut;
- private boolean mFaceLockedOut;
/**
* Short delay before restarting biometric authentication after a successful try
@@ -648,11 +647,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
- if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT
- || msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) {
- mFingerprintLockedOut = true;
- }
-
if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) {
mLockPatternUtils.requireStrongAuth(
LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
@@ -668,7 +662,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFingerprintLockoutReset() {
- mFingerprintLockedOut = false;
updateFingerprintListeningState();
}
@@ -806,11 +799,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
- if (msgId == FaceManager.FACE_ERROR_LOCKOUT
- || msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
- mFaceLockedOut = true;
- }
-
if (msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
mLockPatternUtils.requireStrongAuth(
LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
@@ -827,7 +815,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFaceLockoutReset() {
- mFaceLockedOut = false;
updateFaceListeningState();
}
@@ -1530,6 +1517,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
mUserManager = context.getSystemService(UserManager.class);
+ mIsPrimaryUser = mUserManager.isPrimaryUser();
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled();
updateAirplaneModeState();
@@ -1608,21 +1596,25 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private boolean shouldListenForFingerprint() {
- return (mKeyguardIsVisible || !mDeviceInteractive ||
+ // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
+ // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
+ final boolean shouldListen = (mKeyguardIsVisible || !mDeviceInteractive ||
(mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming))
&& !mSwitchingUser && !isFingerprintDisabled(getCurrentUser())
- && !mKeyguardGoingAway && !mFingerprintLockedOut;
+ && !mKeyguardGoingAway && mIsPrimaryUser;
+ return shouldListen;
}
private boolean shouldListenForFace() {
final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep;
final int user = getCurrentUser();
-
+ // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an
+ // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware.
return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant())
&& !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user)
- && !mKeyguardGoingAway && !mFaceLockedOut && mFaceSettingEnabledForUser
- && mUserManager.isUserUnlocked(user);
+ && !mKeyguardGoingAway && mFaceSettingEnabledForUser
+ && mUserManager.isUserUnlocked(user) && mIsPrimaryUser;
}
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 87f004fc12e6..f946cc103927 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -48,6 +48,9 @@ import com.android.systemui.power.PowerUI;
import com.android.systemui.privacy.PrivacyItemController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.plugins.PluginManager;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
+import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationListener;
@@ -285,6 +288,9 @@ public class Dependency extends SystemUI {
@Nullable
@Inject @Named(LEAK_REPORT_EMAIL_NAME) Lazy<String> mLeakReportEmail;
@Inject Lazy<ClockManager> mClockManager;
+ @Inject Lazy<ActivityManagerWrapper> mActivityManagerWrapper;
+ @Inject Lazy<DevicePolicyManagerWrapper> mDevicePolicyManagerWrapper;
+ @Inject Lazy<PackageManagerWrapper> mPackageManagerWrapper;
@Inject
public Dependency() {
@@ -452,6 +458,9 @@ public class Dependency extends SystemUI {
mForegroundServiceNotificationListener::get);
mProviders.put(ClockManager.class, mClockManager::get);
mProviders.put(PrivacyItemController.class, mPrivacyItemController::get);
+ mProviders.put(ActivityManagerWrapper.class, mActivityManagerWrapper::get);
+ mProviders.put(DevicePolicyManagerWrapper.class, mDevicePolicyManagerWrapper::get);
+ mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get);
// TODO(b/118592525): to support multi-display , we start to add something which is
diff --git a/packages/SystemUI/src/com/android/systemui/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
index a517d7ce8e0e..895f9b9a1cdf 100644
--- a/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
@@ -41,6 +41,9 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.plugins.PluginInitializerImpl;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.shared.plugins.PluginManagerImpl;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
+import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
@@ -181,4 +184,22 @@ public class DependencyProvider {
@Named(MAIN_HANDLER_NAME) Handler mainHandler) {
return new AutoHideController(context, mainHandler);
}
+
+ @Singleton
+ @Provides
+ public ActivityManagerWrapper provideActivityManagerWrapper() {
+ return ActivityManagerWrapper.getInstance();
+ }
+
+ @Singleton
+ @Provides
+ public DevicePolicyManagerWrapper provideDevicePolicyManagerWrapper() {
+ return DevicePolicyManagerWrapper.getInstance();
+ }
+
+ @Singleton
+ @Provides
+ public PackageManagerWrapper providePackageManagerWrapper() {
+ return PackageManagerWrapper.getInstance();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/analytics/DataCollector.java b/packages/SystemUI/src/com/android/systemui/analytics/DataCollector.java
index 46e004c5304a..0db5bef783c0 100644
--- a/packages/SystemUI/src/com/android/systemui/analytics/DataCollector.java
+++ b/packages/SystemUI/src/com/android/systemui/analytics/DataCollector.java
@@ -380,6 +380,20 @@ public class DataCollector implements SensorEventListener {
addEvent(PhoneEvent.ON_NOTIFICATION_START_DRAGGING_DOWN);
}
+ public void onStartExpandingFromPulse() {
+ if (DEBUG) {
+ Log.d(TAG, "onStartExpandingFromPulse");
+ }
+ // TODO: maybe add event
+ }
+
+ public void onExpansionFromPulseStopped() {
+ if (DEBUG) {
+ Log.d(TAG, "onExpansionFromPulseStopped");
+ }
+ // TODO: maybe add event
+ }
+
public void onNotificatonStopDraggingDown() {
if (DEBUG) {
Log.d(TAG, "onNotificationStopDraggingDown");
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
index 909896eb6c55..f8856ce15f83 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/Classifier.java
@@ -32,6 +32,7 @@ public abstract class Classifier {
public static final int RIGHT_AFFORDANCE = 6;
public static final int GENERIC = 7;
public static final int BOUNCER_UNLOCK = 8;
+ public static final int PULSE_EXPAND = 9;
/**
* Contains all the information about touch events from which the classifier can query
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/DirectionEvaluator.java b/packages/SystemUI/src/com/android/systemui/classifier/DirectionEvaluator.java
index 5f04222197ab..78b41683a32b 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/DirectionEvaluator.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/DirectionEvaluator.java
@@ -22,6 +22,7 @@ public class DirectionEvaluator {
boolean vertical = Math.abs(yDiff) >= Math.abs(xDiff);
switch (type) {
case Classifier.QUICK_SETTINGS:
+ case Classifier.PULSE_EXPAND:
case Classifier.NOTIFICATION_DRAG_DOWN:
if (!vertical || yDiff <= 0.0) {
return falsingEvaluation;
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
index 8f215ff47855..a63fdbd63e02 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
@@ -408,10 +408,22 @@ public class FalsingManager implements SensorEventListener, StateListener {
mDataCollector.onNotificatonStartDraggingDown();
}
+ public void onStartExpandingFromPulse() {
+ if (FalsingLog.ENABLED) {
+ FalsingLog.i("onStartExpandingFromPulse", "");
+ }
+ mHumanInteractionClassifier.setType(Classifier.PULSE_EXPAND);
+ mDataCollector.onStartExpandingFromPulse();
+ }
+
public void onNotificatonStopDraggingDown() {
mDataCollector.onNotificatonStopDraggingDown();
}
+ public void onExpansionFromPulseStopped() {
+ mDataCollector.onExpansionFromPulseStopped();
+ }
+
public void onNotificationDismissed() {
mDataCollector.onNotificationDismissed();
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java
index 577d57a9990e..0cc50cddbfc6 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java
@@ -128,7 +128,8 @@ public class HumanInteractionClassifier extends Classifier {
// sent to the classifiers until the finger moves far enough. When the finger if lifted
// up, the last MotionEvent which was far enough from the finger is set as the final
// MotionEvent and sent to the Classifiers.
- if (mCurrentType == Classifier.NOTIFICATION_DRAG_DOWN) {
+ if (mCurrentType == Classifier.NOTIFICATION_DRAG_DOWN
+ || mCurrentType == Classifier.PULSE_EXPAND) {
mBufferedEvents.add(MotionEvent.obtain(event));
Point pointEnd = new Point(event.getX() / mDpi, event.getY() / mDpi);
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 172746e2ffbe..0be9e25bfc27 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1787,6 +1787,7 @@ public class KeyguardViewMediator extends SystemUI {
mHideAnimationRun = false;
adjustStatusBarLocked();
userActivity();
+ mUpdateMonitor.setKeyguardGoingAway(false /* away */);
mShowKeyguardWakeLock.release();
}
mKeyguardDisplayManager.show();
@@ -1907,7 +1908,6 @@ public class KeyguardViewMediator extends SystemUI {
mHideAnimationRun = false;
adjustStatusBarLocked();
sendUserPresentBroadcast();
- mUpdateMonitor.setKeyguardGoingAway(false /* goingAway */);
}
Trace.endSection();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index f91c9d944439..bbd8de333d79 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -521,16 +521,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
}
}
} else {
- // If there are sims ready but there are not the same number of carrier names as
- // subscription ids, just show the full text in the first slot
- mInfos[0].visible = true;
- mCarrierTexts[0].setText(info.carrierText);
- mCarrierGroups[0].setVisibility(View.VISIBLE);
- for (int i = 1; i < SIM_SLOTS; i++) {
- mInfos[i].visible = false;
- mCarrierTexts[i].setText("");
- mCarrierGroups[i].setVisibility(View.GONE);
- }
+ Log.e(TAG, "Carrier information arrays not of same length");
}
} else {
mInfos[0].visible = false;
@@ -612,8 +603,10 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
// Only show marquee when visible
if (visibility == VISIBLE) {
setEllipsize(TextUtils.TruncateAt.MARQUEE);
+ setSelected(true);
} else {
setEllipsize(TextUtils.TruncateAt.END);
+ setSelected(false);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
index 4dcacd4bffdc..70062492c162 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
@@ -27,6 +27,7 @@ import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
+import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -166,7 +167,8 @@ public class TileQueryHelper {
icon.mutate();
icon.setTint(mContext.getColor(android.R.color.white));
CharSequence label = info.serviceInfo.loadLabel(pm);
- addTile(spec, icon, label != null ? label.toString() : "null", appLabel);
+ createStateAndAddTile(spec, icon, label != null ? label.toString() : "null",
+ appLabel);
}
notifyTilesChanged(true);
@@ -207,9 +209,10 @@ public class TileQueryHelper {
mSpecs.add(spec);
}
- private void addTile(
+ private void createStateAndAddTile(
String spec, Drawable drawable, CharSequence label, CharSequence appLabel) {
QSTile.State state = new QSTile.State();
+ state.state = Tile.STATE_INACTIVE;
state.label = label;
state.contentDescription = label;
state.icon = new DrawableIcon(drawable);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 83c4cfc6c126..b7948882208d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -29,6 +29,7 @@ import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUP
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS;
+import android.annotation.FloatRange;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -269,6 +270,30 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
+ public void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {
+ if (!verifyCaller("onAssistantProgress")) {
+ return;
+ }
+ long token = Binder.clearCallingIdentity();
+ try {
+ mHandler.post(() -> notifyAssistantProgress(progress));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ public void startAssistant(Bundle bundle) {
+ if (!verifyCaller("startAssistant")) {
+ return;
+ }
+ long token = Binder.clearCallingIdentity();
+ try {
+ mHandler.post(() -> notifyStartAssistant(bundle));
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
private boolean verifyCaller(String reason) {
final int callerId = Binder.getCallingUserHandle().getIdentifier();
if (callerId != mCurrentBoundedUserId) {
@@ -590,6 +615,18 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
+ private void notifyAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {
+ for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
+ mConnectionCallbacks.get(i).onAssistantProgress(progress);
+ }
+ }
+
+ private void notifyStartAssistant(Bundle bundle) {
+ for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
+ mConnectionCallbacks.get(i).startAssistant(bundle);
+ }
+ }
+
private void updateEnabledState() {
mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,
MATCH_DIRECT_BOOT_UNAWARE,
@@ -637,5 +674,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
default void onOverviewShown(boolean fromHome) {}
default void onQuickScrubStarted() {}
default void onBackButtonAlphaChanged(float alpha, boolean animate) {}
+ default void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {}
+ default void startAssistant(Bundle bundle) {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
index a6af82a28bce..33bcefb323f8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -237,7 +237,8 @@ public abstract class AlertingNotificationManager implements NotificationLifetim
*/
protected boolean canRemoveImmediately(String key) {
AlertEntry alertEntry = mAlertEntries.get(key);
- return alertEntry == null || alertEntry.wasShownLongEnough();
+ return alertEntry == null || alertEntry.wasShownLongEnough()
+ || alertEntry.mEntry.isRowDismissed();
}
///////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
index 57d058880118..5f878cee12d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java
@@ -131,7 +131,7 @@ public class AmbientPulseManager extends AlertingNotificationManager {
* @param entry the entry that changed
* @param isPulsing true if the entry is now pulsing, false otherwise
*/
- void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing);
+ void onAmbientStateChanged(@NonNull NotificationEntry entry, boolean isPulsing);
}
private final class AmbientEntry extends AlertEntry {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
index 2edea789d820..9f382eabc180 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
@@ -110,9 +110,7 @@ public class NavigationBarController implements DisplayListener, Callbacks {
* @param display the display to add navigation bar on.
*/
private void createNavigationBar(Display display) {
- if (display == null
- || (display.getDisplayId() != DEFAULT_DISPLAY
- && !display.supportsSystemDecorations())) {
+ if (display == null) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 110d51563e2c..2cca701ef582 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -232,7 +232,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
openedAmount = Math.min(1.0f, openedAmount);
viewState.openedAmount = openedAmount;
viewState.clipTopAmount = 0;
- viewState.alpha = mAmbientState.hasPulsingNotifications() ? 0 : 1;
+ viewState.alpha = 1;
viewState.belowSpeedBump = mAmbientState.getSpeedBumpIndex() == 0;
viewState.hideSensitive = false;
viewState.xTranslation = getTranslationX();
@@ -290,6 +290,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
&& !mAmbientState.isPanelTracking();
int baseZHeight = mAmbientState.getBaseZHeight();
int backgroundTop = 0;
+ int clipTopAmount = 0;
float firstElementRoundness = 0.0f;
ExpandableNotificationRow previousRow = null;
@@ -319,7 +320,8 @@ public class NotificationShelf extends ActivatableNotificationView implements
rowTranslationY + getNotificationMergeSize());
}
}
- updateNotificationClipHeight(row, notificationClipEnd);
+ int clipTop = updateNotificationClipHeight(row, notificationClipEnd, notGoneIndex);
+ clipTopAmount = Math.max(clipTop, clipTopAmount);
float inShelfAmount = updateIconAppearance(row, expandAmount, scrolling, scrollingFast,
expandingAnimated, isLastChild);
numViewsInShelf += inShelfAmount;
@@ -379,9 +381,9 @@ public class NotificationShelf extends ActivatableNotificationView implements
previousColor = ownColorUntinted;
previousRow = row;
}
-
clipTransientViews();
+ setClipTopAmount(clipTopAmount);
setBackgroundTop(backgroundTop);
setFirstElementRoundness(firstElementRoundness);
mShelfIcons.setSpeedBumpIndex(mAmbientState.getSpeedBumpIndex());
@@ -415,7 +417,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
View transientView = mHostLayout.getTransientView(i);
if (transientView instanceof ExpandableNotificationRow) {
ExpandableNotificationRow transientRow = (ExpandableNotificationRow) transientView;
- updateNotificationClipHeight(transientRow, getTranslationY());
+ updateNotificationClipHeight(transientRow, getTranslationY(), -1);
} else {
Log.e(TAG, "NotificationShelf.clipTransientViews(): "
+ "Trying to clip non-row transient view");
@@ -432,9 +434,13 @@ public class NotificationShelf extends ActivatableNotificationView implements
private void updateIconClipAmount(ExpandableNotificationRow row) {
float maxTop = row.getTranslationY();
+ if (getClipTopAmount() != 0) {
+ // if the shelf is clipped, lets make sure we also clip the icon
+ maxTop = Math.max(maxTop, getTranslationY() + getClipTopAmount());
+ }
StatusBarIconView icon = row.getEntry().expandedIcon;
float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY();
- if (shelfIconPosition < maxTop && !mAmbientState.isDark()) {
+ if (shelfIconPosition < maxTop && !mAmbientState.isFullyDark()) {
int top = (int) (maxTop - shelfIconPosition);
Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight()));
icon.setClipBounds(clipRect);
@@ -485,12 +491,18 @@ public class NotificationShelf extends ActivatableNotificationView implements
}
}
- private void updateNotificationClipHeight(ExpandableNotificationRow row,
- float notificationClipEnd) {
+ /**
+ * Update the clipping of this view.
+ * @return the amount that our own top should be clipped
+ */
+ private int updateNotificationClipHeight(ExpandableNotificationRow row,
+ float notificationClipEnd, int childIndex) {
float viewEnd = row.getTranslationY() + row.getActualHeight();
boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway())
&& !mAmbientState.isDozingAndNotPulsing(row);
- if (viewEnd > notificationClipEnd
+ boolean shouldClipOwnTop = row.showingAmbientPulsing()
+ || (mAmbientState.isPulseExpanding() && childIndex == 0);
+ if (viewEnd > notificationClipEnd && !shouldClipOwnTop
&& (mAmbientState.isShadeExpanded() || !isPinned)) {
int clipBottomAmount = (int) (viewEnd - notificationClipEnd);
if (isPinned) {
@@ -501,6 +513,11 @@ public class NotificationShelf extends ActivatableNotificationView implements
} else {
row.setClipBottomAmount(0);
}
+ if (shouldClipOwnTop) {
+ return (int) (viewEnd - getTranslationY());
+ } else {
+ return 0;
+ }
}
@Override
@@ -653,7 +670,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
? fullTransitionAmount
: transitionAmount;
iconState.clampedAppearAmount = clampedAmount;
- float contentTransformationAmount = !mAmbientState.isAboveShelf(row)
+ float contentTransformationAmount = !row.isAboveShelf()
&& (isLastChild || iconState.translateContent)
? iconTransitionAmount
: 0.0f;
@@ -722,7 +739,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
iconState.scaleY = 1.0f;
iconState.hidden = false;
}
- if (mAmbientState.isAboveShelf(row) || (!row.isInShelf() && (isLastChild && row.areGutsExposed()
+ if (row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed()
|| row.getTranslationZ() > mAmbientState.getBaseZHeight()))) {
iconState.hidden = true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
new file mode 100644
index 000000000000..e5dbcd374169
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ObjectAnimator
+import android.animation.ValueAnimator
+import android.content.Context
+import android.os.PowerManager
+import android.os.PowerManager.WAKE_REASON_GESTURE
+import android.os.SystemClock
+import android.view.MotionEvent
+import android.view.ViewConfiguration
+
+import com.android.systemui.Gefingerpoken
+import com.android.systemui.Interpolators
+import com.android.systemui.R
+import com.android.systemui.classifier.FalsingManager
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.row.ExpandableView
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
+import com.android.systemui.statusbar.phone.ShadeController
+
+import javax.inject.Inject
+import javax.inject.Singleton
+import kotlin.math.max
+
+/**
+ * A utility class to enable the downward swipe on when pulsing.
+ */
+@Singleton
+class PulseExpansionHandler @Inject
+constructor(context: Context,
+ private val mWakeUpCoordinator: NotificationWakeUpCoordinator) : Gefingerpoken {
+ companion object {
+ private val RUBBERBAND_FACTOR_STATIC = 0.25f
+ private val SPRING_BACK_ANIMATION_LENGTH_MS = 375
+ }
+ private val mPowerManager: PowerManager?
+ private var mShadeController: ShadeController? = null
+
+ private val mMinDragDistance: Int
+ private var mInitialTouchX: Float = 0.0f
+ private var mInitialTouchY: Float = 0.0f
+ var isExpanding: Boolean = false
+ private set
+ private val mTouchSlop: Float
+ private var mExpansionCallback: ExpansionCallback? = null
+ private lateinit var mStackScroller: NotificationStackScrollLayout
+ private val mTemp2 = IntArray(2)
+ private var mDraggedFarEnough: Boolean = false
+ private var mStartingChild: ExpandableView? = null
+ private val mFalsingManager: FalsingManager
+ private var mPulsing: Boolean = false
+ var isWakingToShadeLocked: Boolean = false
+ private set
+ private var mEmptyDragAmount: Float = 0.0f
+ private var mWakeUpHeight: Float = 0.0f
+ private var mReachedWakeUpHeight: Boolean = false
+
+ private val isFalseTouch: Boolean
+ get() = mFalsingManager.isFalseTouch
+
+ init {
+ mMinDragDistance = context.resources.getDimensionPixelSize(
+ R.dimen.keyguard_drag_down_min_distance)
+ mTouchSlop = ViewConfiguration.get(context).scaledTouchSlop.toFloat()
+ mFalsingManager = FalsingManager.getInstance(context)
+ mPowerManager = context.getSystemService(PowerManager::class.java)
+ }
+
+ override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
+ return maybeStartExpansion(event)
+ }
+
+ private fun maybeStartExpansion(event: MotionEvent): Boolean {
+ if (!mPulsing) {
+ return false
+ }
+ val x = event.x
+ val y = event.y
+
+ when (event.actionMasked) {
+ MotionEvent.ACTION_DOWN -> {
+ mDraggedFarEnough = false
+ isExpanding = false
+ mStartingChild = null
+ mInitialTouchY = y
+ mInitialTouchX = x
+ }
+
+ MotionEvent.ACTION_MOVE -> {
+ val h = y - mInitialTouchY
+ if (h > mTouchSlop && h > Math.abs(x - mInitialTouchX)) {
+ mFalsingManager.onStartExpandingFromPulse()
+ isExpanding = true
+ captureStartingChild(mInitialTouchX, mInitialTouchY)
+ mInitialTouchY = y
+ mInitialTouchX = x
+ mWakeUpHeight = mWakeUpCoordinator.getWakeUpHeight()
+ mReachedWakeUpHeight = false
+ return true
+ }
+ }
+ }
+ return false
+ }
+
+ override fun onTouchEvent(event: MotionEvent): Boolean {
+ if (!isExpanding) {
+ return maybeStartExpansion(event)
+ }
+ val y = event.y
+
+ when (event.actionMasked) {
+ MotionEvent.ACTION_MOVE -> updateExpansionHeight(y - mInitialTouchY)
+ MotionEvent.ACTION_UP -> if (!mFalsingManager.isUnlockingDisabled && !isFalseTouch) {
+ finishExpansion()
+ } else {
+ cancelExpansion()
+ }
+ MotionEvent.ACTION_CANCEL -> cancelExpansion()
+ }
+ return isExpanding
+ }
+
+ private fun finishExpansion() {
+ resetClock()
+ if (mStartingChild != null) {
+ setUserLocked(mStartingChild!!, false)
+ mStartingChild = null
+ }
+ isExpanding = false
+ isWakingToShadeLocked = true
+ mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE,
+ "com.android.systemui:PULSEDRAG")
+ mShadeController!!.goToLockedShade(mStartingChild)
+ if (mStartingChild is ExpandableNotificationRow) {
+ val row = mStartingChild as ExpandableNotificationRow?
+ row!!.onExpandedByGesture(true /* userExpanded */)
+ }
+ }
+
+ private fun updateExpansionHeight(height: Float) {
+ var expansionHeight = max(height, 0.0f)
+ if (!mReachedWakeUpHeight && height > mWakeUpHeight) {
+ mReachedWakeUpHeight = true;
+ }
+ if (mStartingChild != null) {
+ val child = mStartingChild!!
+ val newHeight = Math.min((child.collapsedHeight + expansionHeight).toInt(),
+ child.maxContentHeight)
+ child.actualHeight = newHeight
+ expansionHeight = max(newHeight.toFloat(), expansionHeight)
+ } else {
+ val target = if (mReachedWakeUpHeight) mWakeUpHeight else 0.0f
+ mWakeUpCoordinator.setNotificationsVisibleForExpansion(height > target,
+ true /* animate */,
+ true /* increaseSpeed */)
+ expansionHeight = max(mWakeUpHeight, expansionHeight)
+ }
+ val emptyDragAmount = mWakeUpCoordinator.setPulseHeight(expansionHeight)
+ setEmptyDragAmount(emptyDragAmount * RUBBERBAND_FACTOR_STATIC)
+ }
+
+ private fun captureStartingChild(x: Float, y: Float) {
+ if (mStartingChild == null) {
+ mStartingChild = findView(x, y)
+ if (mStartingChild != null) {
+ setUserLocked(mStartingChild!!, true)
+ }
+ }
+ }
+
+ private fun setEmptyDragAmount(amount: Float) {
+ mEmptyDragAmount = amount
+ mExpansionCallback!!.setEmptyDragAmount(amount)
+ }
+
+ private fun reset(child: ExpandableView) {
+ if (child.actualHeight == child.collapsedHeight) {
+ setUserLocked(child, false)
+ return
+ }
+ val anim = ObjectAnimator.ofInt(child, "actualHeight",
+ child.actualHeight, child.collapsedHeight)
+ anim.interpolator = Interpolators.FAST_OUT_SLOW_IN
+ anim.duration = SPRING_BACK_ANIMATION_LENGTH_MS.toLong()
+ anim.addListener(object : AnimatorListenerAdapter() {
+ override fun onAnimationEnd(animation: Animator) {
+ setUserLocked(child, false)
+ }
+ })
+ anim.start()
+ }
+
+ private fun setUserLocked(child: ExpandableView, userLocked: Boolean) {
+ if (child is ExpandableNotificationRow) {
+ child.isUserLocked = userLocked
+ }
+ }
+
+ private fun resetClock() {
+ val anim = ValueAnimator.ofFloat(mEmptyDragAmount, 0f)
+ anim.interpolator = Interpolators.FAST_OUT_SLOW_IN
+ anim.duration = SPRING_BACK_ANIMATION_LENGTH_MS.toLong()
+ anim.addUpdateListener { animation -> setEmptyDragAmount(animation.animatedValue as Float) }
+ anim.start()
+ }
+
+ private fun cancelExpansion() {
+ mFalsingManager.onExpansionFromPulseStopped()
+ if (mStartingChild != null) {
+ reset(mStartingChild!!)
+ mStartingChild = null
+ } else {
+ resetClock()
+ }
+ mWakeUpCoordinator.setNotificationsVisibleForExpansion(false /* visible */,
+ true /* animate */,
+ false /* increaseSpeed */)
+ isExpanding = false
+ }
+
+ private fun findView(x: Float, y: Float): ExpandableView? {
+ var totalX = x
+ var totalY = y
+ mStackScroller.getLocationOnScreen(mTemp2)
+ totalX += mTemp2[0].toFloat()
+ totalY += mTemp2[1].toFloat()
+ val childAtRawPosition = mStackScroller.getChildAtRawPosition(totalX, totalY)
+ return if (childAtRawPosition != null && childAtRawPosition.isContentExpandable) {
+ childAtRawPosition
+ } else null
+ }
+
+ fun setUp(notificationStackScroller: NotificationStackScrollLayout,
+ expansionCallback: ExpansionCallback,
+ shadeController: ShadeController) {
+ mExpansionCallback = expansionCallback
+ mShadeController = shadeController
+ mStackScroller = notificationStackScroller
+ }
+
+ fun setPulsing(pulsing: Boolean) {
+ mPulsing = pulsing
+ }
+
+ fun onStartedWakingUp() {
+ isWakingToShadeLocked = false
+ }
+
+ interface ExpansionCallback {
+ fun setEmptyDragAmount(amount: Float)
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
new file mode 100644
index 000000000000..ccb8d9bf46c1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification
+
+import android.animation.ObjectAnimator
+import android.util.FloatProperty
+import com.android.systemui.Interpolators
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.statusbar.AmbientPulseManager
+import com.android.systemui.statusbar.SysuiStatusBarStateController
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
+import com.android.systemui.statusbar.notification.stack.StackStateAnimator
+
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class NotificationWakeUpCoordinator @Inject constructor(
+ private val mAmbientPulseManager: AmbientPulseManager,
+ private val mStatusBarStateController: StatusBarStateController)
+ : AmbientPulseManager.OnAmbientChangedListener, StatusBarStateController.StateListener {
+
+ private val mNotificationVisibility
+ = object : FloatProperty<NotificationWakeUpCoordinator>("notificationVisibility") {
+
+ override fun setValue(coordinator: NotificationWakeUpCoordinator, value: Float) {
+ coordinator.setVisibilityAmount(value)
+ }
+
+ override fun get(coordinator: NotificationWakeUpCoordinator): Float? {
+ return coordinator.mLinearVisibilityAmount
+ }
+ }
+ private lateinit var mStackScroller: NotificationStackScrollLayout
+ private var mVisibilityInterpolator = Interpolators.FAST_OUT_SLOW_IN_REVERSE
+
+ private var mLinearDozeAmount: Float = 0.0f
+ private var mDozeAmount: Float = 0.0f
+ private var mNotificationVisibleAmount = 0.0f
+ private var mNotificationsVisible = false
+ private var mNotificationsVisibleForExpansion = false
+ private var mDarkAnimator: ObjectAnimator? = null
+ private var mVisibilityAmount = 0.0f
+ private var mLinearVisibilityAmount = 0.0f
+ private var mWakingUp = false
+ private val mEntrySetToClearWhenFinished = mutableSetOf<NotificationEntry>()
+
+ init {
+ mAmbientPulseManager.addListener(this)
+ mStatusBarStateController.addCallback(this)
+ }
+
+ fun setStackScroller(stackScroller: NotificationStackScrollLayout) {
+ mStackScroller = stackScroller
+ }
+
+ /**
+ * @param visible should notifications be visible
+ * @param animate should this change be animated
+ * @param increaseSpeed should the speed be increased of the animation
+ */
+ fun setNotificationsVisibleForExpansion(visible: Boolean, animate: Boolean,
+ increaseSpeed: Boolean) {
+ mNotificationsVisibleForExpansion = visible
+ updateNotificationVisibility(animate, increaseSpeed)
+ if (!visible && mNotificationsVisible) {
+ // If we stopped expanding and we're still visible because we had a pulse that hasn't
+ // times out, let's release them all to make sure were not stuck in a state where
+ // notifications are visible
+ mAmbientPulseManager.releaseAllImmediately()
+ }
+ }
+
+ private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) {
+ var visible = mNotificationsVisibleForExpansion || mAmbientPulseManager.hasNotifications()
+ if (!visible && mNotificationsVisible && mWakingUp && mDozeAmount != 0.0f) {
+ // let's not make notifications invisible while waking up, otherwise the animation
+ // is strange
+ return;
+ }
+ setNotificationsVisible(visible, animate, increaseSpeed)
+ }
+
+ private fun setNotificationsVisible(visible: Boolean, animate: Boolean,
+ increaseSpeed: Boolean) {
+ if (mNotificationsVisible == visible) {
+ return
+ }
+ mNotificationsVisible = visible
+ mDarkAnimator?.cancel();
+ if (animate) {
+ notifyAnimationStart(visible)
+ startVisibilityAnimation(increaseSpeed)
+ } else {
+ setVisibilityAmount(if (visible) 1.0f else 0.0f)
+ }
+ }
+
+ override fun onDozeAmountChanged(linear: Float, eased: Float) {
+ if (linear != 1.0f && linear != 0.0f
+ && (mLinearDozeAmount == 0.0f || mLinearDozeAmount == 1.0f)) {
+ // Let's notify the scroller that an animation started
+ notifyAnimationStart(mLinearDozeAmount == 1.0f)
+ }
+ mLinearDozeAmount = linear
+ mDozeAmount = eased
+ mStackScroller.setDozeAmount(mDozeAmount)
+ updateDarkAmount()
+ if (linear == 0.0f) {
+ setNotificationsVisible(visible = false, animate = false, increaseSpeed = false);
+ setNotificationsVisibleForExpansion(visible = false, animate = false,
+ increaseSpeed = false)
+ }
+ }
+
+ private fun startVisibilityAnimation(increaseSpeed: Boolean) {
+ if (mNotificationVisibleAmount == 0f || mNotificationVisibleAmount == 1f) {
+ mVisibilityInterpolator = if (mNotificationsVisible)
+ Interpolators.TOUCH_RESPONSE
+ else
+ Interpolators.FAST_OUT_SLOW_IN_REVERSE
+ }
+ val target = if (mNotificationsVisible) 1.0f else 0.0f
+ val darkAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target)
+ darkAnimator.setInterpolator(Interpolators.LINEAR)
+ var duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong()
+ if (increaseSpeed) {
+ duration = (duration.toFloat() / 1.5F).toLong();
+ }
+ darkAnimator.setDuration(duration)
+ darkAnimator.start()
+ mDarkAnimator = darkAnimator
+ }
+
+ private fun setVisibilityAmount(visibilityAmount: Float) {
+ mLinearVisibilityAmount = visibilityAmount
+ mVisibilityAmount = mVisibilityInterpolator.getInterpolation(
+ visibilityAmount)
+ handleAnimationFinished();
+ updateDarkAmount()
+ }
+
+ private fun handleAnimationFinished() {
+ if (mLinearDozeAmount == 0.0f || mLinearVisibilityAmount == 0.0f) {
+ mEntrySetToClearWhenFinished.forEach { it.setAmbientGoingAway(false) }
+ }
+ }
+
+ fun getWakeUpHeight() : Float {
+ return mStackScroller.pulseHeight
+ }
+
+ private fun updateDarkAmount() {
+ val linearAmount = Math.min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount)
+ val amount = Math.min(1.0f - mVisibilityAmount, mDozeAmount)
+ mStackScroller.setDarkAmount(linearAmount, amount)
+ }
+
+ private fun notifyAnimationStart(awake: Boolean) {
+ mStackScroller.notifyDarkAnimationStart(!awake)
+ }
+
+ override fun onDozingChanged(isDozing: Boolean) {
+ if (isDozing) {
+ setNotificationsVisible(visible = false, animate = false, increaseSpeed = false)
+ }
+ }
+
+ fun setPulseHeight(height: Float): Float {
+ return mStackScroller.setPulseHeight(height)
+ }
+
+ fun setWakingUp(wakingUp: Boolean) {
+ mWakingUp = wakingUp
+ if (wakingUp && mNotificationsVisible && !mNotificationsVisibleForExpansion) {
+ // We're waking up while pulsing, let's make sure the animation looks nice
+ mStackScroller.wakeUpFromPulse();
+ }
+ }
+
+ override fun onAmbientStateChanged(entry: NotificationEntry, isPulsing: Boolean) {
+ var animate = true
+ if (!isPulsing) {
+ if (mLinearDozeAmount != 0.0f) {
+ if (entry.isRowDismissed) {
+ // if we animate, we see the shelf briefly visible. Instead we fully animate
+ // the notification and its background out
+ animate = false
+ } else {
+ entry.setAmbientGoingAway(true)
+ mEntrySetToClearWhenFinished.add(entry)
+ }
+ }
+ } else if (mEntrySetToClearWhenFinished.contains(entry)) {
+ mEntrySetToClearWhenFinished.remove(entry)
+ entry.setAmbientGoingAway(false)
+ }
+ updateNotificationVisibility(animate, increaseSpeed = false)
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java
index 8b522a2033f8..04ff58b36c94 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java
@@ -112,8 +112,8 @@ public class NotificationData {
} else if (isHeadsUp) {
// Provide consistent ranking with headsUpManager
return mHeadsUpManager.compare(a, b);
- } else if (a.getRow().isAmbientPulsing() != b.getRow().isAmbientPulsing()) {
- return a.getRow().isAmbientPulsing() ? -1 : 1;
+ } else if (a.getRow().showingAmbientPulsing() != b.getRow().showingAmbientPulsing()) {
+ return a.getRow().showingAmbientPulsing() ? -1 : 1;
} else if (aMedia != bMedia) {
// Upsort current media notification.
return aMedia ? -1 : 1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 3bf4d4beb4f9..5cd1210f7c9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -571,6 +571,12 @@ public final class NotificationEntry {
if (row != null) row.setHeadsUp(shouldHeadsUp);
}
+
+ public void setAmbientGoingAway(boolean goingAway) {
+ if (row != null) row.setAmbientGoingAway(goingAway);
+ }
+
+
public boolean mustStayOnScreen() {
return row != null && row.mustStayOnScreen();
}
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 0fbc55bc08bf..767e14c42365 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
@@ -215,6 +215,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private boolean mIsAmbientPulsing;
/**
+ * Happens when the notification was pulsing before and goes away to ensure smooth animations.
+ */
+ private boolean mAmbientGoingAway;
+
+ /**
* Whether or not the notification should be redacted on the lock screen, i.e has sensitive
* content which should be redacted on the lock screen.
*/
@@ -721,8 +726,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
- public boolean isAmbientPulsing() {
- return mIsAmbientPulsing;
+ @Override
+ public boolean showingAmbientPulsing() {
+ return mIsAmbientPulsing || mAmbientGoingAway;
}
public void setAmbientPulsing(boolean isAmbientPulsing) {
@@ -3004,9 +3010,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
public boolean isAboveShelf() {
- return !isOnKeyguard()
+ return showingAmbientPulsing() || (!isOnKeyguard()
&& (mIsPinned || mHeadsupDisappearRunning || (mIsHeadsUp && mAboveShelf)
- || mExpandAnimationRunning || mChildIsExpanding);
+ || mExpandAnimationRunning || mChildIsExpanding));
}
public void setOnAmbient(boolean onAmbient) {
@@ -3161,6 +3167,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
+ public void setAmbientGoingAway(boolean goingAway) {
+ mAmbientGoingAway = goingAway;
+ }
+
@VisibleForTesting
protected void setChildrenContainer(NotificationChildrenContainer childrenContainer) {
mChildrenContainer = childrenContainer;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index d1a89b4e493f..cac41da52120 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -527,6 +527,10 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable {
public void setHeadsUpIsVisible() {
}
+ public boolean showingAmbientPulsing() {
+ return false;
+ }
+
public boolean isChildInGroup() {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 646617c72128..3cc2e83f7934 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -793,11 +793,11 @@ public class NotificationContentView extends FrameLayout {
}
public int getMaxHeight() {
- if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) {
- return getShowingAmbientView().getHeight();
- } else if (mExpandedChild != null) {
+ if (mExpandedChild != null) {
return getViewHeight(VISIBLE_TYPE_EXPANDED)
+ getExtraRemoteInputHeight(mExpandedRemoteInput);
+ } else if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) {
+ return getShowingAmbientView().getHeight();
} else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) {
return getViewHeight(VISIBLE_TYPE_HEADSUP)
+ getExtraRemoteInputHeight(mHeadsUpRemoteInput);
@@ -1113,15 +1113,6 @@ public class NotificationContentView extends FrameLayout {
* @return one of the static enum types in this view, calculated form the current state
*/
public int calculateVisibleType() {
- if (mContainingNotification.isOnAmbient()) {
- if (mIsChildInGroup && mAmbientSingleLineChild != null) {
- return VISIBLE_TYPE_AMBIENT_SINGLELINE;
- } else if (mAmbientChild != null) {
- return VISIBLE_TYPE_AMBIENT;
- } else {
- return VISIBLE_TYPE_CONTRACTED;
- }
- }
if (mUserExpanding) {
int height = !mIsChildInGroup || isGroupExpanded()
|| mContainingNotification.isExpanded(true /* allowOnKeyguard */)
@@ -1152,8 +1143,10 @@ public class NotificationContentView extends FrameLayout {
if (!noExpandedChild && viewHeight == getViewHeight(VISIBLE_TYPE_EXPANDED)) {
return VISIBLE_TYPE_EXPANDED;
}
+ boolean onAmbient = mContainingNotification.isOnAmbient();
if (!mUserExpanding && mIsChildInGroup && !isGroupExpanded()) {
- return VISIBLE_TYPE_SINGLELINE;
+ return onAmbient ? VISIBLE_TYPE_AMBIENT_SINGLELINE
+ : VISIBLE_TYPE_SINGLELINE;
}
if ((mIsHeadsUp || mHeadsUpAnimatingAway) && mHeadsUpChild != null
@@ -1164,11 +1157,13 @@ public class NotificationContentView extends FrameLayout {
return VISIBLE_TYPE_EXPANDED;
}
} else {
+ int collapsedType = onAmbient && mAmbientChild != null ? VISIBLE_TYPE_AMBIENT :
+ VISIBLE_TYPE_CONTRACTED;
if (noExpandedChild || (mContractedChild != null
- && viewHeight <= getViewHeight(VISIBLE_TYPE_CONTRACTED)
+ && viewHeight <= getViewHeight(collapsedType)
&& (!mIsChildInGroup || isGroupExpanded()
|| !mContainingNotification.isExpanded(true /* allowOnKeyguard */)))) {
- return VISIBLE_TYPE_CONTRACTED;
+ return collapsedType;
} else {
return VISIBLE_TYPE_EXPANDED;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index c246af57504c..ce922801551b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.stack;
import android.annotation.Nullable;
import android.content.Context;
+import android.util.MathUtils;
import android.view.View;
import com.android.systemui.Dependency;
@@ -39,6 +40,7 @@ import java.util.List;
public class AmbientState {
private static final int NO_SECTION_BOUNDARY = -1;
+ private static final float MAX_PULSE_HEIGHT = 100000f;
private ArrayList<ExpandableView> mDraggedViews = new ArrayList<>();
private int mScrollY;
@@ -79,6 +81,8 @@ public class AmbientState {
private ExpandableNotificationRow mExpandingNotification;
private float mDarkAmount;
private boolean mAppearing;
+ private float mPulseHeight = MAX_PULSE_HEIGHT;
+ private float mDozeAmount = 0.0f;
public AmbientState(Context context) {
mSectionBoundaryIndices.add(NO_SECTION_BOUNDARY);
@@ -181,6 +185,10 @@ public class AmbientState {
/** Dark ratio of the status bar **/
public void setDarkAmount(float darkAmount) {
+ if (darkAmount == 1.0f && mDarkAmount != darkAmount) {
+ // Whenever we are fully dark, let's reset the pulseHeight again
+ mPulseHeight = MAX_PULSE_HEIGHT;
+ }
mDarkAmount = darkAmount;
}
@@ -279,7 +287,28 @@ public class AmbientState {
}
public int getInnerHeight() {
- return Math.max(Math.min(mLayoutHeight, mMaxLayoutHeight) - mTopPadding, mLayoutMinHeight);
+ return getInnerHeight(false /* ignorePulseHeight */);
+ }
+
+ /**
+ * @param ignorePulseHeight ignore the pulse height for this request
+ * @return the inner height of the algorithm.
+ */
+ public int getInnerHeight(boolean ignorePulseHeight) {
+ if (mDozeAmount == 1.0f && !isPulseExpanding()) {
+ return mShelf.getHeight();
+ }
+ int height = Math.max(mLayoutMinHeight,
+ Math.min(mLayoutHeight, mMaxLayoutHeight) - mTopPadding);
+ if (ignorePulseHeight) {
+ return height;
+ }
+ float pulseHeight = Math.min(mPulseHeight, (float) height);
+ return (int) MathUtils.lerp(height, pulseHeight, mDozeAmount);
+ }
+
+ public boolean isPulseExpanding() {
+ return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mDarkAmount != 1.0f;
}
public boolean isShadeExpanded() {
@@ -425,19 +454,6 @@ public class AmbientState {
}
/**
- * Similar to the normal is above shelf logic but doesn't allow it to be above in AOD1.
- *
- * @param expandableView the view to check
- */
- public boolean isAboveShelf(ExpandableView expandableView) {
- if (!(expandableView instanceof ExpandableNotificationRow)) {
- return expandableView.isAboveShelf();
- }
- ExpandableNotificationRow row = (ExpandableNotificationRow) expandableView;
- return row.isAboveShelf() && !isDozingAndNotPulsing(row);
- }
-
- /**
* @return whether a view is dozing and not pulsing right now
*/
public boolean isDozingAndNotPulsing(ExpandableView view) {
@@ -488,4 +504,26 @@ public class AmbientState {
public boolean isAppearing() {
return mAppearing;
}
+
+ public void setPulseHeight(float height) {
+ mPulseHeight = height;
+ }
+
+ public void setDozeAmount(float dozeAmount) {
+ if (dozeAmount != mDozeAmount) {
+ mDozeAmount = dozeAmount;
+ if (dozeAmount == 0.0f || dozeAmount == 1.0f) {
+ // We woke all the way up, let's reset the pulse height
+ mPulseHeight = MAX_PULSE_HEIGHT;
+ }
+ }
+ }
+
+ /**
+ * Is the device fully awake, which is different from not tark at all when there are pulsing
+ * notifications.
+ */
+ public boolean isFullyAwake() {
+ return mDozeAmount == 0.0f;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
index 507cf079e1f3..a471d8784c54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java
@@ -132,10 +132,6 @@ public class AnimationFilter {
// to look nice
customDelay = StackStateAnimator.ANIMATION_DELAY_HEADS_UP_CLICKED
+ StackStateAnimator.ANIMATION_DELAY_HEADS_UP;
- } else if (ev.animationType == NotificationStackScrollLayout.AnimationEvent
- .ANIMATION_TYPE_PULSE_APPEAR || ev.animationType ==
- NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) {
- customDelay = StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR / 2;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
index 40cfd4d4aef9..dd6d3833f147 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
@@ -228,4 +228,67 @@ class NotificationSection {
return (mBottomAnimator == null && mCurrentBounds.bottom == bottom)
|| (mBottomAnimator != null && mEndAnimationRect.bottom == bottom);
}
+
+ /**
+ * Update the bounds of this section based on it's views
+ *
+ * @param minTopPosition the minimum position that the top needs to have
+ * @param minBottomPosition the minimum position that the bottom needs to have
+ * @return the position of the new bottom
+ */
+ public int updateBounds(int minTopPosition, int minBottomPosition,
+ boolean shiftBackgroundWithFirst) {
+ int top = minTopPosition;
+ int bottom = minTopPosition;
+ ActivatableNotificationView firstView = getFirstVisibleChild();
+ if (firstView != null) {
+ // Round Y up to avoid seeing the background during animation
+ int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
+ // TODO: look into the already animating part
+ int newTop;
+ if (isTargetTop(finalTranslationY)) {
+ // we're ending up at the same location as we are now, let's just skip the
+ // animation
+ newTop = finalTranslationY;
+ } else {
+ newTop = (int) Math.ceil(firstView.getTranslationY());
+ }
+ top = Math.max(newTop, top);
+ if (firstView.showingAmbientPulsing()) {
+ // If we're pulsing, the notification can actually go below!
+ bottom = Math.max(bottom, finalTranslationY
+ + ExpandableViewState.getFinalActualHeight(firstView));
+ if (shiftBackgroundWithFirst) {
+ mBounds.left += Math.max(firstView.getTranslation(), 0);
+ }
+ }
+ }
+ top = Math.max(minTopPosition, top);
+ ActivatableNotificationView lastView = getLastVisibleChild();
+ if (lastView != null) {
+ float finalTranslationY = ViewState.getFinalTranslationY(lastView);
+ int finalHeight = ExpandableViewState.getFinalActualHeight(lastView);
+ // Round Y down to avoid seeing the background during animation
+ int finalBottom = (int) Math.floor(
+ finalTranslationY + finalHeight - lastView.getClipBottomAmount());
+ int newBottom;
+ if (isTargetBottom(finalBottom)) {
+ // we're ending up at the same location as we are now, lets just skip the animation
+ newBottom = finalBottom;
+ } else {
+ newBottom = (int) (lastView.getTranslationY() + lastView.getActualHeight()
+ - lastView.getClipBottomAmount());
+ // The background can never be lower than the end of the last view
+ minBottomPosition = (int) Math.min(
+ lastView.getTranslationY() + lastView.getActualHeight(),
+ minBottomPosition);
+ }
+ bottom = Math.max(bottom, Math.max(newBottom, minBottomPosition));
+ }
+ bottom = Math.max(top, bottom);
+ mBounds.top = top;
+ mBounds.bottom = bottom;
+ return bottom;
+ }
+
}
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 fbf1e310abf2..a54de5f0f5a9 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
@@ -88,6 +88,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEv
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
+import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DragDownHelper.DragDownCallback;
import com.android.systemui.statusbar.EmptyShadeView;
@@ -167,6 +168,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
* gap is drawn between them). In this case we don't want to round their corners.
*/
private static final int DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX = 1;
+ private final AmbientPulseManager mAmbientPulseManager;
private ExpandHelper mExpandHelper;
private final NotificationSwipeHelper mSwipeHelper;
@@ -363,6 +365,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
};
protected ViewGroup mQsContainer;
private boolean mContinuousShadowUpdate;
+ private boolean mContinuousBackgroundUpdate;
private ViewTreeObserver.OnPreDrawListener mShadowUpdater
= new ViewTreeObserver.OnPreDrawListener() {
@@ -372,6 +375,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
return true;
}
};
+ private ViewTreeObserver.OnPreDrawListener mBackgroundUpdater = () -> {
+ updateBackground();
+ return true;
+ };
private Comparator<ExpandableView> mViewPositionComparator = new Comparator<ExpandableView>() {
@Override
public int compare(ExpandableView view, ExpandableView otherView) {
@@ -392,7 +399,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private boolean mGroupExpandedForMeasure;
private boolean mScrollable;
private View mForcedScroll;
- private ExpandableView mNeedingPulseAnimation;
/**
* @see #setDarkAmount(float, float)
@@ -481,7 +487,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@Named(VIEW_CONTEXT) Context context,
AttributeSet attrs,
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
- NotificationRoundnessManager notificationRoundnessManager) {
+ NotificationRoundnessManager notificationRoundnessManager,
+ AmbientPulseManager ambientPulseManager) {
super(context, attrs, 0, 0);
Resources res = getResources();
@@ -491,6 +498,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mSections[i] = new NotificationSection(this);
}
+ mAmbientPulseManager = ambientPulseManager;
mAmbientState = new AmbientState(context);
mRoundnessManager = notificationRoundnessManager;
mBgColor = context.getColor(R.color.notification_shade_background_color);
@@ -575,6 +583,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
}
+ /**
+ * @return the height at which we will wake up when pulsing
+ */
+ public float getPulseHeight() {
+ ActivatableNotificationView firstChild = getFirstChildWithBackground();
+ if (firstChild != null) {
+ return firstChild.getCollapsedHeight();
+ }
+ return 0f;
+ }
+
@Override
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
public void onDensityOrFontScaleChanged() {
@@ -802,26 +821,32 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
int backgroundRectTop = top;
int lastSectionBottom =
mSections[0].getCurrentBounds().bottom + animationYOffset;
+ int previousLeft = left;
+ boolean first = true;
for (NotificationSection section : mSections) {
if (section.getFirstVisibleChild() == null) {
continue;
}
int sectionTop = section.getCurrentBounds().top + animationYOffset;
+ int ownLeft = Math.min(Math.max(left, section.getCurrentBounds().left), right);
// If sections are directly adjacent to each other, we don't want to draw them
// as separate roundrects, as the rounded corners right next to each other look
// bad.
- if (sectionTop - lastSectionBottom > DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX) {
- canvas.drawRoundRect(left,
+ if (sectionTop - lastSectionBottom > DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX
+ || (previousLeft != ownLeft && !first)) {
+ canvas.drawRoundRect(ownLeft,
backgroundRectTop,
right,
lastSectionBottom,
mCornerRadius, mCornerRadius, mBackgroundPaint);
backgroundRectTop = sectionTop;
}
+ previousLeft = ownLeft;
lastSectionBottom =
section.getCurrentBounds().bottom + animationYOffset;
+ first = false;
}
- canvas.drawRoundRect(left,
+ canvas.drawRoundRect(previousLeft,
backgroundRectTop,
right,
lastSectionBottom,
@@ -1277,7 +1302,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mIsClipped = clipped;
}
- if (mPulsing || mAmbientState.isFullyDark() && mShowDarkShelf) {
+ if (!mAmbientPulseManager.hasNotifications()
+ && mAmbientState.isFullyDark() && mShowDarkShelf) {
setClipBounds(null);
} else if (mAmbientState.isDarkAtAll()) {
setClipBounds(mBackgroundAnimationRect);
@@ -1360,7 +1386,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private boolean isHeadsUpTransition() {
NotificationSection firstVisibleSection = getFirstVisibleSection();
return mTrackingHeadsUp && firstVisibleSection != null
- && mAmbientState.isAboveShelf(firstVisibleSection.getFirstVisibleChild());
+ && firstVisibleSection.getFirstVisibleChild().isAboveShelf();
}
/**
@@ -1514,7 +1540,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
return null;
}
- private ExpandableView getChildAtRawPosition(float touchX, float touchY) {
+ public ExpandableView getChildAtRawPosition(float touchX, float touchY) {
getLocationOnScreen(mTempInt2);
return getChildAtPosition(touchX - mTempInt2[0], touchY - mTempInt2[1]);
}
@@ -2258,9 +2284,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
float previousPaddingAmount = 0.0f;
int numShownItems = 0;
boolean finish = false;
- int maxDisplayedNotifications = mAmbientState.isFullyDark()
- ? (hasPulsingNotifications() ? 1 : 0)
- : mMaxDisplayedNotifications;
+ int maxDisplayedNotifications = mMaxDisplayedNotifications;
for (int i = 0; i < getChildCount(); i++) {
ExpandableView expandableView = (ExpandableView) getChildAt(i);
@@ -2269,11 +2293,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
&& !expandableView.hasNoContentHeight() && !footerViewOnLockScreen) {
boolean limitReached = maxDisplayedNotifications != -1
&& numShownItems >= maxDisplayedNotifications;
- boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isFullyDark()
- && hasPulsingNotifications()
- && expandableView instanceof ExpandableNotificationRow
- && !isPulsing(((ExpandableNotificationRow) expandableView).getEntry());
- if (limitReached || notificationOnAmbientThatIsNotPulsing) {
+ if (limitReached) {
expandableView = mShelf;
finish = true;
}
@@ -2450,129 +2470,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
return;
}
- int top = getSectionTopOrFinalTop(getFirstVisibleSection(), mAnimateNextBackgroundTop);
+ int minTopPosition = 0;
NotificationSection lastSection = getLastVisibleSection();
- ActivatableNotificationView lastView =
- mShelf.hasItemsInStableShelf() && mShelf.getVisibility() != GONE
- ? mShelf
- : lastSection == null ? null : lastSection.getLastVisibleChild();
- int bottom;
- if (lastView != null) {
- bottom = getSectionBottomOrFinalBottom(
- lastSection, lastView, mAnimateNextBackgroundBottom);
- } else {
- top = mTopPadding;
- bottom = top;
- }
if (mStatusBarState != StatusBarState.KEYGUARD) {
- top = (int) Math.max(mTopPadding + mStackTranslation, top);
- } else {
- // otherwise the animation from the shade to the keyguard will jump as it's maxed
- top = Math.max(0, top);
- }
- bottom = Math.max(bottom, top);
-
- setSectionBoundsByPriority(left, right, top, bottom, mSections[0], mSections[1]);
- }
-
- private int getSectionTopOrFinalTop(
- @Nullable NotificationSection section, boolean alreadyAnimating) {
- int top = 0;
- if (section != null) {
- ActivatableNotificationView firstView = section.getFirstVisibleChild();
- if (firstView != null) {
- // Round Y up to avoid seeing the background during animation
- int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
- if (alreadyAnimating || section.isTargetTop(finalTranslationY)) {
- // we're ending up at the same location as we are now, let's just skip the
- // animation
- top = finalTranslationY;
- } else {
- top = (int) Math.ceil(firstView.getTranslationY());
- }
- }
+ minTopPosition = (int) (mTopPadding + mStackTranslation);
+ } else if (lastSection == null) {
+ minTopPosition = mTopPadding;
}
- return top;
- }
-
- private int getSectionBottomOrFinalBottom(
- @Nullable NotificationSection section, boolean alreadyAnimating) {
- return section == null ? 0
- : getSectionBottomOrFinalBottom(
- section, section.getLastVisibleChild(), alreadyAnimating);
- }
-
- private int getSectionBottomOrFinalBottom(
- NotificationSection section,
- ActivatableNotificationView lastView,
- boolean alreadyAnimating) {
- int bottom = 0;
- if (lastView != null) {
- float finalTranslationY;
- if (lastView == mShelf) {
- finalTranslationY = mShelf.getTranslationY();
- } else {
- finalTranslationY = ViewState.getFinalTranslationY(lastView);
- }
- int finalHeight = ExpandableViewState.getFinalActualHeight(lastView);
- // Round Y down to avoid seeing the background during animation
- int finalBottom = (int) Math.floor(
- finalTranslationY + finalHeight - lastView.getClipBottomAmount());
- if (alreadyAnimating || section.isTargetBottom(finalBottom)) {
- // we're ending up at the same location as we are now, lets just skip the animation
- bottom = finalBottom;
- } else {
- bottom = (int) (lastView.getTranslationY() + lastView.getActualHeight()
- - lastView.getClipBottomAmount());
- }
- }
- return bottom;
- }
-
- private void setSectionBoundsByPriority(int left, int right, int top, int bottom,
- NotificationSection highPrioritySection, NotificationSection lowPrioritySection) {
- if (NotificationUtils.useNewInterruptionModel(mContext)) {
- // TODO(kprevas): can we use section boundary indices from mAmbientState instead?
- ActivatableNotificationView lastChildAboveGap = getLastHighPriorityChild();
- ActivatableNotificationView firstChildBelowGap = getFirstLowPriorityChild();
- if (lastChildAboveGap != null && firstChildBelowGap != null) {
- int gapTop = getSectionBottomOrFinalBottom(
- highPrioritySection, mAnimateNextSectionBoundsChange);
- gapTop = Math.max(top, Math.min(gapTop, bottom));
-
- int gapBottom = getSectionTopOrFinalTop(
- lowPrioritySection, mAnimateNextSectionBoundsChange);
- gapBottom = Math.max(top, Math.min(gapBottom, bottom));
-
- highPrioritySection.getBounds().set(left, top, right, gapTop);
- lowPrioritySection.getBounds().set(left, gapBottom, right, bottom);
- } else if (lastChildAboveGap != null) {
- highPrioritySection.getBounds().set(left, top, right, bottom);
- lowPrioritySection.getBounds().set(left, bottom, right, bottom);
- } else {
- highPrioritySection.getBounds().set(left, top, right, top);
- lowPrioritySection.getBounds().set(left, top, right, bottom);
- }
- } else {
- highPrioritySection.getBounds().set(left, top, right, bottom);
- lowPrioritySection.getBounds().set(left, bottom, right, bottom);
- }
- }
-
- @ShadeViewRefactor(RefactorComponent.COORDINATOR)
- private ActivatableNotificationView getFirstPinnedHeadsUp() {
- int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- View child = getChildAt(i);
- if (child.getVisibility() != View.GONE
- && child instanceof ExpandableNotificationRow) {
- ExpandableNotificationRow row = (ExpandableNotificationRow) child;
- if (row.isPinned()) {
- return row;
- }
+ boolean shiftPulsingWithFirst = mAmbientPulseManager.getAllEntries().count() <= 1;
+ for (NotificationSection section : mSections) {
+ int minBottomPosition = minTopPosition;
+ if (section == lastSection) {
+ // We need to make sure the section goes all the way to the shelf
+ minBottomPosition = (int) (mShelf.getTranslationY() + mShelf.getIntrinsicHeight());
}
+ minTopPosition = section.updateBounds(minTopPosition, minBottomPosition,
+ shiftPulsingWithFirst);
+ shiftPulsingWithFirst = false;
}
- return null;
}
private NotificationSection getFirstVisibleSection() {
@@ -3462,7 +3377,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
generateViewResizeEvent();
generateGroupExpansionEvent();
generateAnimateEverythingEvent();
- generatePulsingAnimationEvent();
}
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
@@ -4462,10 +4376,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
- public void setIsExpanded(boolean isExpanded) {
+ private void setIsExpanded(boolean isExpanded) {
boolean changed = isExpanded != mIsExpanded;
mIsExpanded = isExpanded;
mStackScrollAlgorithm.setIsExpanded(isExpanded);
+ mAmbientState.setShadeExpanded(isExpanded);
+ mStateAnimator.setShadeExpanded(isExpanded);
if (changed) {
if (!mIsExpanded) {
mGroupManager.collapseAllGroups();
@@ -5207,12 +5123,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
}
- @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- public void setShadeExpanded(boolean shadeExpanded) {
- mAmbientState.setShadeExpanded(shadeExpanded);
- mStateAnimator.setShadeExpanded(shadeExpanded);
- }
-
/**
* Set the boundary for the bottom heads up position. The heads up will always be above this
* position.
@@ -5274,24 +5184,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
return;
}
mPulsing = pulsing;
- mNeedingPulseAnimation = animated ? getFirstChildNotGone() : null;
mAmbientState.setPulsing(pulsing);
updateNotificationAnimationStates();
updateAlgorithmHeightAndPadding();
updateContentHeight();
requestChildrenUpdate();
notifyHeightChangeListener(null, animated);
- mNeedsAnimation |= animated;
- }
-
- @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- private void generatePulsingAnimationEvent() {
- if (mNeedingPulseAnimation != null) {
- int type = mPulsing ? AnimationEvent.ANIMATION_TYPE_PULSE_APPEAR
- : AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR;
- mAnimationEvents.add(new AnimationEvent(mNeedingPulseAnimation, type));
- mNeedingPulseAnimation = null;
- }
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
@@ -5734,6 +5632,56 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
/**
+ * Set how far the wake up is when waking up from pulsing. This is a height and will adjust the
+ * notification positions accordingly.
+ * @param height the new wake up height
+ * @return the overflow how much the height is further than he lowest notification
+ */
+ public float setPulseHeight(float height) {
+ mAmbientState.setPulseHeight(height);
+ requestChildrenUpdate();
+ return Math.max(0, height - mAmbientState.getInnerHeight(true /* ignorePulseHeight */));
+ }
+
+ /**
+ * Set the amount how much we're dozing. This is different from how dark the shade is, when
+ * the notification is pulsing.
+ */
+ public void setDozeAmount(float dozeAmount) {
+ mAmbientState.setDozeAmount(dozeAmount);
+ updateContinuousBackgroundDrawing();
+ requestChildrenUpdate();
+ }
+
+ public void wakeUpFromPulse() {
+ setPulseHeight(getPulseHeight());
+ // Let's place the hidden views at the end of the pulsing notification to make sure we have
+ // a smooth animation
+ boolean firstVisibleView = true;
+ float wakeUplocation = -1f;
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ ExpandableView view = (ExpandableView) getChildAt(i);
+ if (view.getVisibility() == View.GONE) {
+ continue;
+ }
+ boolean isShelf = view == mShelf;
+ if (!(view instanceof ExpandableNotificationRow) && !isShelf) {
+ continue;
+ }
+ if (view.getVisibility() == View.VISIBLE && !isShelf) {
+ if (firstVisibleView) {
+ firstVisibleView = false;
+ wakeUplocation = view.getTranslationY()
+ + view.getActualHeight() - mShelf.getIntrinsicHeight();
+ }
+ } else if (!firstVisibleView) {
+ view.setTranslationY(wakeUplocation);
+ }
+ }
+ }
+
+ /**
* A listener that is notified when the empty space below the notifications is clicked on
*/
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
@@ -5825,6 +5773,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mAmbientState.setSectionBoundaryIndex(0, gapIndex);
}
+ private void updateContinuousBackgroundDrawing() {
+ boolean continuousBackground = !mAmbientState.isFullyAwake()
+ && !mAmbientState.getDraggedViews().isEmpty();
+ if (continuousBackground != mContinuousBackgroundUpdate) {
+ mContinuousBackgroundUpdate = continuousBackground;
+ if (continuousBackground) {
+ getViewTreeObserver().addOnPreDrawListener(mBackgroundUpdater);
+ } else {
+ getViewTreeObserver().removeOnPreDrawListener(mBackgroundUpdater);
+ }
+ }
+ }
+
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
private void updateContinuousShadowDrawing() {
boolean continuousShadowUpdate = mAnimationRunning
@@ -5969,18 +5930,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
.animateTopInset()
.animateY()
.animateZ(),
-
- // ANIMATION_TYPE_PULSE_APPEAR
- new AnimationFilter()
- .animateAlpha()
- .hasDelays()
- .animateY(),
-
- // ANIMATION_TYPE_PULSE_DISAPPEAR
- new AnimationFilter()
- .animateAlpha()
- .hasDelays()
- .animateY(),
};
static int[] LENGTHS = new int[]{
@@ -6035,12 +5984,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
// ANIMATION_TYPE_EVERYTHING
StackStateAnimator.ANIMATION_DURATION_STANDARD,
-
- // ANIMATION_TYPE_PULSE_APPEAR
- StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR,
-
- // ANIMATION_TYPE_PULSE_DISAPPEAR
- StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR / 2,
};
static final int ANIMATION_TYPE_ADD = 0;
@@ -6060,8 +6003,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 14;
static final int ANIMATION_TYPE_HEADS_UP_OTHER = 15;
static final int ANIMATION_TYPE_EVERYTHING = 16;
- static final int ANIMATION_TYPE_PULSE_APPEAR = 17;
- static final int ANIMATION_TYPE_PULSE_DISAPPEAR = 18;
static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1;
static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2;
@@ -6198,8 +6139,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
@Override
- public boolean isExpanded() {
- return NotificationStackScrollLayout.this.isExpanded();
+ public boolean shouldDismissQuickly() {
+ return NotificationStackScrollLayout.this.isExpanded() && mAmbientState.isFullyAwake();
}
@Override
@@ -6299,6 +6240,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
setSwipingInProgress(true);
mAmbientState.onBeginDrag((ExpandableView) v);
updateContinuousShadowDrawing();
+ updateContinuousBackgroundDrawing();
requestChildrenUpdate();
}
@@ -6306,6 +6248,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
public void onChildSnappedBack(View animView, float targetLeft) {
mAmbientState.onDragFinished(animView);
updateContinuousShadowDrawing();
+ updateContinuousBackgroundDrawing();
NotificationMenuRowPlugin menuRow = mSwipeHelper.getCurrentMenuRow();
if (menuRow != null && targetLeft == 0) {
menuRow.resetMenu();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
index 975aee51228b..478427cc32a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java
@@ -231,7 +231,7 @@ class NotificationSwipeHelper extends SwipeHelper
public void dismissChild(final View view, float velocity,
boolean useAccelerateInterpolator) {
superDismissChild(view, velocity, useAccelerateInterpolator);
- if (mCallback.isExpanded()) {
+ if (mCallback.shouldDismissQuickly()) {
// We don't want to quick-dismiss when it's a heads up as this might lead to closing
// of the panel early.
mCallback.handleChildViewDismissed(view);
@@ -418,7 +418,11 @@ class NotificationSwipeHelper extends SwipeHelper
}
public interface NotificationCallback extends SwipeHelper.Callback{
- boolean isExpanded();
+ /**
+ * @return if the view should be dismissed as soon as the touch is released, otherwise its
+ * removed when the animation finishes.
+ */
+ boolean shouldDismissQuickly();
void handleChildViewDismissed(View view);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index 7882fd32e044..f97a7e653104 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -101,6 +101,7 @@ public class StackScrollAlgorithm {
updateZValuesForState(algorithmState, ambientState);
updateHeadsUpStates(algorithmState, ambientState);
+ updatePulsingStates(algorithmState, ambientState);
updateDimmedActivatedHideSensitive(ambientState, algorithmState);
updateClipping(algorithmState, ambientState);
@@ -477,6 +478,23 @@ public class StackScrollAlgorithm {
return algorithmState.getPaddingAfterChild(child);
}
+ private void updatePulsingStates(StackScrollAlgorithmState algorithmState,
+ AmbientState ambientState) {
+ int childCount = algorithmState.visibleChildren.size();
+ for (int i = 0; i < childCount; i++) {
+ View child = algorithmState.visibleChildren.get(i);
+ if (!(child instanceof ExpandableNotificationRow)) {
+ continue;
+ }
+ ExpandableNotificationRow row = (ExpandableNotificationRow) child;
+ if (!row.showingAmbientPulsing() || (i == 0 && ambientState.isPulseExpanding())) {
+ continue;
+ }
+ ExpandableViewState viewState = row.getViewState();
+ viewState.hidden = false;
+ }
+ }
+
private void updateHeadsUpStates(StackScrollAlgorithmState algorithmState,
AmbientState ambientState) {
int childCount = algorithmState.visibleChildren.size();
@@ -501,7 +519,7 @@ public class StackScrollAlgorithm {
if (row.mustStayOnScreen() && !childState.headsUpIsVisible) {
// Ensure that the heads up is always visible even when scrolled off
clampHunToTop(ambientState, row, childState);
- if (i == 0 && ambientState.isAboveShelf(row)) {
+ if (i == 0 && row.isAboveShelf()) {
// the first hun can't get off screen.
clampHunToMaxTranslation(ambientState, row, childState);
childState.hidden = false;
@@ -635,7 +653,7 @@ public class StackScrollAlgorithm {
}
childViewState.zTranslation = baseZ
+ childrenOnTop * zDistanceBetweenElements;
- } else if (i == 0 && ambientState.isAboveShelf(child)) {
+ } else if (i == 0 && child.isAboveShelf()) {
// In case this is a new view that has never been measured before, we don't want to
// elevate if we are currently expanded more then the notification
int shelfHeight = ambientState.getShelf() == null ? 0 :
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
index b4c205ab980c..7332b034b9bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
@@ -419,32 +419,6 @@ public class StackStateAnimator {
ExpandableNotificationRow row = (ExpandableNotificationRow) event.mChangingView;
row.prepareExpansionChanged();
} else if (event.animationType == NotificationStackScrollLayout
- .AnimationEvent.ANIMATION_TYPE_PULSE_APPEAR) {
- ExpandableViewState viewState = changingView.getViewState();
- if (viewState != null) {
- mTmpState.copyFrom(viewState);
- mTmpState.yTranslation += mPulsingAppearingTranslation;
- mTmpState.alpha = 0;
- mTmpState.applyToView(changingView);
-
- mTmpState.copyFrom(mShelf.getViewState());
- mTmpState.applyToView(mShelf);
- }
- } else if (event.animationType == NotificationStackScrollLayout
- .AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) {
- ExpandableViewState viewState = changingView.getViewState();
- if (viewState != null) {
- viewState.alpha = 0;
- // We want to animate the alpha away before the view starts translating,
- // otherwise everything will overlap and look xtra ugly.
- float originalYTranslation = viewState.yTranslation;
- viewState.yTranslation = changingView.getTranslationY();
- mAnimationFilter.animateAlpha = true;
- mAnimationProperties.duration = ANIMATION_DURATION_PULSE_APPEAR / 2;
- viewState.animateTo(changingView, mAnimationProperties);
- viewState.yTranslation = originalYTranslation;
- }
- } else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_HEADS_UP_APPEAR) {
// This item is added, initialize it's properties.
ExpandableViewState viewState = changingView.getViewState();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 1eb499048db8..9be47f742ed9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -185,6 +185,11 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
}
@Override
+ public void startAssistant(Bundle bundle) {
+ mAssistManager.startAssist(bundle);
+ }
+
+ @Override
public void onBackButtonAlphaChanged(float alpha, boolean animate) {
final ButtonDispatcher backButton = mNavigationBarView.getBackButton();
if (QuickStepController.shouldhideBackButton(getContext())) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index f4fa1e8246e6..a35488518faa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -18,6 +18,10 @@ package com.android.systemui.statusbar.phone;
import static com.android.systemui.SysUiServiceProvider.getComponent;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
+import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
+
+
+import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -72,11 +76,13 @@ import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShelf;
+import com.android.systemui.statusbar.PulseExpansionHandler;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
@@ -96,12 +102,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
+import javax.inject.Inject;
+import javax.inject.Named;
+
public class NotificationPanelView extends PanelView implements
ExpandableView.OnHeightChangedListener,
View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener,
OnHeadsUpChangedListener, QS.HeightListener, ZenModeController.Callback,
- ConfigurationController.ConfigurationListener, StateListener {
+ ConfigurationController.ConfigurationListener, StateListener,
+ PulseExpansionHandler.ExpansionCallback {
private static final boolean DEBUG = false;
@@ -136,6 +146,8 @@ public class NotificationPanelView extends PanelView implements
private final PowerManager mPowerManager;
private final AccessibilityManager mAccessibilityManager;
+ private final NotificationWakeUpCoordinator mWakeUpCoordinator;
+ private final PulseExpansionHandler mPulseExpansionHandler;
private KeyguardAffordanceHelper mAffordanceHelper;
private KeyguardUserSwitcher mKeyguardUserSwitcher;
@@ -317,17 +329,22 @@ public class NotificationPanelView extends PanelView implements
Dependency.get(ShadeController.class);
private int mDisplayId;
- public NotificationPanelView(Context context, AttributeSet attrs) {
+ @Inject
+ public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
+ NotificationWakeUpCoordinator coordinator,
+ PulseExpansionHandler pulseExpansionHandler) {
super(context, attrs);
setWillNotDraw(!DEBUG);
mFalsingManager = FalsingManager.getInstance(context);
mPowerManager = context.getSystemService(PowerManager.class);
+ mWakeUpCoordinator = coordinator;
mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
mAlphaPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
setPanelAlpha(255, false /* animate */);
mCommandQueue = getComponent(context, CommandQueue.class);
mDisplayId = context.getDisplayId();
+ mPulseExpansionHandler = pulseExpansionHandler;
}
/**
@@ -364,7 +381,9 @@ public class NotificationPanelView extends PanelView implements
initBottomArea();
+ mWakeUpCoordinator.setStackScroller(mNotificationStackScroller);
mQsFrame = findViewById(R.id.qs_frame);
+ mPulseExpansionHandler.setUp(mNotificationStackScroller, this, mShadeController);
}
@Override
@@ -594,8 +613,7 @@ public class NotificationPanelView extends PanelView implements
stackScrollerPadding = mClockPositionResult.stackScrollerPadding;
}
mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding);
- int burnInXOffset = mPulsing ? 0 : mClockPositionResult.clockX;
- mNotificationStackScroller.setAntiBurnInOffsetX(burnInXOffset);
+ mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX);
mStackScrollerMeasuringPass++;
requestScrollerTopPaddingUpdate(animate);
@@ -786,6 +804,9 @@ public class NotificationPanelView extends PanelView implements
MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_PEEK, 1);
return true;
}
+ if (mPulseExpansionHandler.onInterceptTouchEvent(event)) {
+ return true;
+ }
if (!isFullyCollapsed() && onQsIntercept(event)) {
return true;
@@ -945,6 +966,10 @@ public class NotificationPanelView extends PanelView implements
return false;
}
initDownStates(event);
+ if (!mIsExpanding && mPulseExpansionHandler.onTouchEvent(event)) {
+ // We're expanding all the other ones shouldn't get this anymore
+ return true;
+ }
if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp()
&& mHeadsUpTouchHelper.onInterceptTouchEvent(event)) {
mIsExpansionFromHeadsUp = true;
@@ -1488,16 +1513,16 @@ public class NotificationPanelView extends PanelView implements
int max = mBarState == StatusBarState.KEYGUARD
? Math.max(maxNotificationPadding, maxQsPadding)
: maxQsPadding;
- return (int) interpolate(getExpandedFraction(),
- mQsMinExpansionHeight, max);
+ return (int) MathUtils.lerp((float) mQsMinExpansionHeight, (float) max,
+ getExpandedFraction());
} else if (mQsSizeChangeAnimator != null) {
return (int) mQsSizeChangeAnimator.getAnimatedValue();
} else if (mKeyguardShowing) {
// We can only do the smoother transition on Keyguard when we also are not collapsing
// from a scrolled quick settings.
- return interpolate(getQsExpansionFraction(),
- mNotificationStackScroller.getIntrinsicPadding(),
- mQsMaxExpansionHeight + mQsNotificationTopPadding);
+ return MathUtils.lerp((float) mNotificationStackScroller.getIntrinsicPadding(),
+ (float) (mQsMaxExpansionHeight + mQsNotificationTopPadding),
+ getQsExpansionFraction());
} else {
return mQsExpansionHeight + mQsNotificationTopPadding;
}
@@ -1698,7 +1723,6 @@ public class NotificationPanelView extends PanelView implements
updateUnlockIcon();
updateNotificationTranslucency();
updatePanelExpanded();
- mNotificationStackScroller.setShadeExpanded(!isFullyCollapsed());
if (DEBUG) {
invalidate();
}
@@ -2812,9 +2836,6 @@ public class NotificationPanelView extends PanelView implements
final float darkAmount = dozing ? 1 : 0;
mStatusBarStateController.setDozeAmount(darkAmount, animate);
- if (animate) {
- mNotificationStackScroller.notifyDarkAnimationStart(mDozing);
- }
}
@Override
@@ -2825,7 +2846,6 @@ public class NotificationPanelView extends PanelView implements
mKeyguardStatusView.setDarkAmount(mInterpolatedDarkAmount);
mKeyguardBottomArea.setDarkAmount(mInterpolatedDarkAmount);
positionClockAndNotifications();
- mNotificationStackScroller.setDarkAmount(linearAmount, mInterpolatedDarkAmount);
}
public void setPulsing(boolean pulsing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 4d0c8c3a7fb6..2495d2253abb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -1172,9 +1172,11 @@ public abstract class PanelView extends FrameLayout {
}
protected void notifyBarPanelExpansionChanged() {
- mBar.panelExpansionChanged(mExpandedFraction, mExpandedFraction > 0f
- || mPeekAnimator != null || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp()
- || mTracking || mHeightAnimator != null);
+ if (mBar != null) {
+ mBar.panelExpansionChanged(mExpandedFraction, mExpandedFraction > 0f
+ || mPeekAnimator != null || mInstantExpanding
+ || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null);
+ }
if (mExpansionListener != null) {
mExpansionListener.accept(mExpandedFraction, mTracking);
}
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 41580f6146de..d18b4190400a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -184,6 +184,7 @@ import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
@@ -195,6 +196,7 @@ import com.android.systemui.statusbar.notification.NotificationClicker;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.NotificationListController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl;
@@ -363,6 +365,10 @@ public class StatusBar extends SystemUI implements DemoMode,
protected StatusBarIconController mIconController;
@Inject
InjectionInflationController mInjectionInflater;
+ @Inject
+ PulseExpansionHandler mPulseExpansionHandler;
+ @Inject
+ NotificationWakeUpCoordinator mWakeUpCoordinator;
// expanded notifications
protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
@@ -1079,7 +1085,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public boolean isDozing() {
- return mDozing && mNotificationPanel.isFullyDark();
+ return mDozing;
}
@Override
@@ -2965,7 +2971,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mHandler.removeMessages(MSG_LAUNCH_TRANSITION_TIMEOUT);
if (mUserSwitcherController != null && mUserSwitcherController.useFullscreenUserSwitcher()) {
mStatusBarStateController.setState(StatusBarState.FULLSCREEN_USER_SWITCHER);
- } else {
+ } else if (!mPulseExpansionHandler.isWakingToShadeLocked()){
mStatusBarStateController.setState(StatusBarState.KEYGUARD);
}
updatePanelExpansionForKeyguard();
@@ -3588,12 +3594,19 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onStartedWakingUp() {
mDeviceInteractive = true;
+ mWakeUpCoordinator.setWakingUp(true);
mAmbientPulseManager.releaseAllImmediately();
mVisualStabilityManager.setScreenOn(true);
updateNotificationPanelTouchState();
updateVisibleToUser();
updateIsKeyguard();
mDozeServiceHost.stopDozing();
+ mPulseExpansionHandler.onStartedWakingUp();
+ }
+
+ @Override
+ public void onFinishedWakingUp() {
+ mWakeUpCoordinator.setWakingUp(false);
}
};
@@ -3896,6 +3909,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardUpdateMonitor.onAuthInterruptDetected(pulsing /* active */);
}
updateScrimController();
+ mPulseExpansionHandler.setPulsing(pulsing);
}
}, reason);
// DozeScrimController is in pulse state, now let's ask ScrimController to start
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 50c4fac31bbf..a8ae5f65a2a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -388,7 +388,8 @@ public class StatusBarWindowView extends FrameLayout {
if (mNotificationPanel.isFullyExpanded()
&& stackScrollLayout.getVisibility() == View.VISIBLE
&& mStatusBarStateController.getState() == StatusBarState.KEYGUARD
- && !mService.isBouncerShowing()) {
+ && !mService.isBouncerShowing()
+ && !mService.isDozing()) {
intercept = mDragDownHelper.onInterceptTouchEvent(ev);
}
if (!intercept) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java
index d8ea1f6eef5f..5b2e398b66e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java
@@ -21,12 +21,18 @@ import android.annotation.Nullable;
import android.app.Notification;
import android.app.RemoteInput;
import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
import android.widget.Button;
import com.android.internal.util.ArrayUtils;
+import com.android.systemui.Dependency;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
+import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -191,14 +197,47 @@ public class InflatedSmartReplies {
boolean useSmartActions = !ArrayUtils.isEmpty(entry.systemGeneratedSmartActions)
&& notification.getAllowSystemGeneratedContextualActions();
if (useSmartActions) {
+ List<Notification.Action> systemGeneratedActions =
+ entry.systemGeneratedSmartActions;
+ // Filter actions if we're in kiosk-mode - we don't care about screen pinning mode,
+ // since notifications aren't shown there anyway.
+ ActivityManagerWrapper activityManagerWrapper =
+ Dependency.get(ActivityManagerWrapper.class);
+ if (activityManagerWrapper.isLockTaskKioskModeActive()) {
+ systemGeneratedActions = filterWhiteListedLockTaskApps(systemGeneratedActions);
+ }
smartActions = new SmartReplyView.SmartActions(
- entry.systemGeneratedSmartActions, true /* fromAssistant */);
+ systemGeneratedActions, true /* fromAssistant */);
}
}
return new SmartRepliesAndActions(smartReplies, smartActions);
}
/**
+ * Filter actions so that only actions pointing to whitelisted apps are allowed.
+ * This filtering is only meaningful when in lock-task mode.
+ */
+ private static List<Notification.Action> filterWhiteListedLockTaskApps(
+ List<Notification.Action> actions) {
+ PackageManagerWrapper packageManagerWrapper = Dependency.get(PackageManagerWrapper.class);
+ DevicePolicyManagerWrapper devicePolicyManagerWrapper =
+ Dependency.get(DevicePolicyManagerWrapper.class);
+ List<Notification.Action> filteredActions = new ArrayList<>();
+ for (Notification.Action action : actions) {
+ if (action.actionIntent == null) continue;
+ Intent intent = action.actionIntent.getIntent();
+ // Only allow actions that are explicit (implicit intents are not handled in lock-task
+ // mode), and link to whitelisted apps.
+ ResolveInfo resolveInfo = packageManagerWrapper.resolveActivity(intent, 0 /* flags */);
+ if (resolveInfo != null && devicePolicyManagerWrapper.isLockTaskPermitted(
+ resolveInfo.activityInfo.packageName)) {
+ filteredActions.add(action);
+ }
+ }
+ return filteredActions;
+ }
+
+ /**
* Returns whether the {@link Notification} represented by entry has a free-form remote input.
* Such an input can be used e.g. to implement smart reply buttons - by passing the replies
* through the remote input.
diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
index faebf60dc688..c6636b480bfa 100644
--- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
+++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java
@@ -27,6 +27,7 @@ import com.android.systemui.SystemUIFactory;
import com.android.systemui.qs.QSFooterImpl;
import com.android.systemui.qs.QuickStatusBarHeader;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
+import com.android.systemui.statusbar.phone.NotificationPanelView;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -118,6 +119,11 @@ public class InjectionInflationController {
* Creates the NotificationStackScrollLayout.
*/
NotificationStackScrollLayout createNotificationStackScrollLayout();
+
+ /**
+ * Creates the NotificationPanelView.
+ */
+ NotificationPanelView createPanelView();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Util.java b/packages/SystemUI/src/com/android/systemui/volume/Util.java
index c6d62181540e..7edb5a55a9ae 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Util.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Util.java
@@ -16,52 +16,13 @@
package com.android.systemui.volume;
-import android.content.Context;
import android.media.AudioManager;
-import android.media.MediaMetadata;
-import android.media.VolumeProvider;
-import android.media.session.MediaController.PlaybackInfo;
-import android.media.session.PlaybackState;
-import android.telephony.TelephonyManager;
import android.view.View;
-import android.widget.TextView;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.Objects;
/**
* Static helpers for the volume dialog.
*/
-class Util {
-
- // Note: currently not shown (only used in the text footer)
- private static final SimpleDateFormat HMMAA = new SimpleDateFormat("h:mm aa", Locale.US);
-
- private static int[] AUDIO_MANAGER_FLAGS = new int[] {
- AudioManager.FLAG_SHOW_UI,
- AudioManager.FLAG_VIBRATE,
- AudioManager.FLAG_PLAY_SOUND,
- AudioManager.FLAG_ALLOW_RINGER_MODES,
- AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE,
- AudioManager.FLAG_SHOW_VIBRATE_HINT,
- AudioManager.FLAG_SHOW_SILENT_HINT,
- AudioManager.FLAG_FROM_KEY,
- AudioManager.FLAG_SHOW_UI_WARNINGS,
- };
-
- private static String[] AUDIO_MANAGER_FLAG_NAMES = new String[] {
- "SHOW_UI",
- "VIBRATE",
- "PLAY_SOUND",
- "ALLOW_RINGER_MODES",
- "REMOVE_SOUND_AND_VIBRATE",
- "SHOW_VIBRATE_HINT",
- "SHOW_SILENT_HINT",
- "FROM_KEY",
- "SHOW_UI_WARNINGS",
- };
+class Util extends com.android.settingslib.volume.Util {
public static String logTag(Class<?> c) {
final String tag = "vol." + c.getSimpleName();
@@ -70,106 +31,19 @@ class Util {
public static String ringerModeToString(int ringerMode) {
switch (ringerMode) {
- case AudioManager.RINGER_MODE_SILENT: return "RINGER_MODE_SILENT";
- case AudioManager.RINGER_MODE_VIBRATE: return "RINGER_MODE_VIBRATE";
- case AudioManager.RINGER_MODE_NORMAL: return "RINGER_MODE_NORMAL";
- default: return "RINGER_MODE_UNKNOWN_" + ringerMode;
- }
- }
-
- public static String mediaMetadataToString(MediaMetadata metadata) {
- if (metadata == null) return null;
- return metadata.getDescription().toString();
- }
-
- public static String playbackInfoToString(PlaybackInfo info) {
- if (info == null) return null;
- final String type = playbackInfoTypeToString(info.getPlaybackType());
- final String vc = volumeProviderControlToString(info.getVolumeControl());
- return String.format("PlaybackInfo[vol=%s,max=%s,type=%s,vc=%s],atts=%s",
- info.getCurrentVolume(), info.getMaxVolume(), type, vc, info.getAudioAttributes());
- }
-
- public static String playbackInfoTypeToString(int type) {
- switch (type) {
- case PlaybackInfo.PLAYBACK_TYPE_LOCAL: return "LOCAL";
- case PlaybackInfo.PLAYBACK_TYPE_REMOTE: return "REMOTE";
- default: return "UNKNOWN_" + type;
- }
- }
-
- public static String playbackStateStateToString(int state) {
- switch (state) {
- case PlaybackState.STATE_NONE: return "STATE_NONE";
- case PlaybackState.STATE_STOPPED: return "STATE_STOPPED";
- case PlaybackState.STATE_PAUSED: return "STATE_PAUSED";
- case PlaybackState.STATE_PLAYING: return "STATE_PLAYING";
- default: return "UNKNOWN_" + state;
- }
- }
-
- public static String volumeProviderControlToString(int control) {
- switch (control) {
- case VolumeProvider.VOLUME_CONTROL_ABSOLUTE: return "VOLUME_CONTROL_ABSOLUTE";
- case VolumeProvider.VOLUME_CONTROL_FIXED: return "VOLUME_CONTROL_FIXED";
- case VolumeProvider.VOLUME_CONTROL_RELATIVE: return "VOLUME_CONTROL_RELATIVE";
- default: return "VOLUME_CONTROL_UNKNOWN_" + control;
- }
- }
-
- public static String playbackStateToString(PlaybackState playbackState) {
- if (playbackState == null) return null;
- return playbackStateStateToString(playbackState.getState()) + " " + playbackState;
- }
-
- public static String audioManagerFlagsToString(int value) {
- return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES);
- }
-
- private static String bitFieldToString(int value, int[] values, String[] names) {
- if (value == 0) return "";
- final StringBuilder sb = new StringBuilder();
- for (int i = 0; i < values.length; i++) {
- if ((value & values[i]) != 0) {
- if (sb.length() > 0) sb.append(',');
- sb.append(names[i]);
- }
- value &= ~values[i];
- }
- if (value != 0) {
- if (sb.length() > 0) sb.append(',');
- sb.append("UNKNOWN_").append(value);
+ case AudioManager.RINGER_MODE_SILENT:
+ return "RINGER_MODE_SILENT";
+ case AudioManager.RINGER_MODE_VIBRATE:
+ return "RINGER_MODE_VIBRATE";
+ case AudioManager.RINGER_MODE_NORMAL:
+ return "RINGER_MODE_NORMAL";
+ default:
+ return "RINGER_MODE_UNKNOWN_" + ringerMode;
}
- return sb.toString();
- }
-
- public static String getShortTime(long millis) {
- return HMMAA.format(new Date(millis));
- }
-
- private static CharSequence emptyToNull(CharSequence str) {
- return str == null || str.length() == 0 ? null : str;
- }
-
- public static boolean setText(TextView tv, CharSequence text) {
- if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false;
- tv.setText(text);
- return true;
}
public static final void setVisOrGone(View v, boolean vis) {
if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return;
v.setVisibility(vis ? View.VISIBLE : View.GONE);
}
-
- public static final void setVisOrInvis(View v, boolean vis) {
- if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return;
- v.setVisibility(vis ? View.VISIBLE : View.INVISIBLE);
- }
-
- public static boolean isVoiceCapable(Context context) {
- final TelephonyManager telephony =
- (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- return telephony != null && telephony.isVoiceCapable();
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
index 32bc01cdfdfe..4c16297154f3 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
@@ -53,6 +53,7 @@ import android.util.Log;
import android.view.accessibility.AccessibilityManager;
import com.android.internal.annotations.GuardedBy;
+import com.android.settingslib.volume.MediaSessions;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index 7f83ed6164b9..b97f55ce06d7 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -16,20 +16,20 @@ package com.android;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import android.content.pm.PackageManager;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.internal.runner.ClassPathScanner;
-import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
-import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
import android.testing.AndroidTestingRunner;
import android.text.TextUtils;
import android.util.Log;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.internal.runner.ClassPathScanner;
+import androidx.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
+import androidx.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
+
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
new file mode 100644
index 000000000000..8e061cc84396
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.keyguard;
+
+
+import static android.telephony.SubscriptionManager.DATA_ROAMING_DISABLE;
+import static android.telephony.SubscriptionManager.DATA_ROAMING_ENABLE;
+import static android.telephony.SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.telephony.SubscriptionInfo;
+import android.telephony.TelephonyManager;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.internal.telephony.IccCardConstants;
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class CarrierTextControllerTest extends SysuiTestCase {
+
+ private static final CharSequence SEPARATOR = " \u2014 ";
+ private static final String TEST_CARRIER = "TEST_CARRIER";
+ private static final SubscriptionInfo TEST_SUBSCRIPTION = new SubscriptionInfo(0, "", 0,
+ TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
+ DATA_ROAMING_DISABLE, null, null, null, null, false, null, "");
+ private static final SubscriptionInfo TEST_SUBSCRIPTION_ROAMING = new SubscriptionInfo(0, "", 0,
+ TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
+ DATA_ROAMING_ENABLE, null, null, null, null, false, null, "");
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private CarrierTextController.CarrierTextCallback mCarrierTextCallback;
+ @Mock
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ private CarrierTextController.CarrierTextCallbackInfo mCarrierTextCallbackInfo;
+
+ private CarrierTextController mCarrierTextController;
+ private TestableLooper mTestableLooper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mTestableLooper = TestableLooper.get(this);
+
+ mContext.addMockSystemService(WifiManager.class, mWifiManager);
+ mContext.addMockSystemService(ConnectivityManager.class, mConnectivityManager);
+ mContext.addMockSystemService(TelephonyManager.class, mTelephonyManager);
+ mDependency.injectMockDependency(WakefulnessLifecycle.class);
+ mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
+ new Handler(mTestableLooper.getLooper()));
+
+ mCarrierTextCallbackInfo = new CarrierTextController.CarrierTextCallbackInfo("",
+ new CharSequence[]{}, false, new int[]{});
+ when(mTelephonyManager.getPhoneCount()).thenReturn(2);
+ mCarrierTextController = new TestCarrierTextController(mContext, SEPARATOR, true, true,
+ mKeyguardUpdateMonitor);
+ // This should not start listening on any of the real dependencies
+ mCarrierTextController.setListening(mCarrierTextCallback);
+ }
+
+ @Test
+ public void testWrongSlots() {
+ reset(mCarrierTextCallback);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(
+ new ArrayList<>());
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ IccCardConstants.State.CARD_IO_ERROR);
+ // This should not produce an out of bounds error, even though there are no subscriptions
+ mCarrierTextController.mCallback.onSimStateChanged(0, -3,
+ IccCardConstants.State.CARD_IO_ERROR);
+ mCarrierTextController.mCallback.onSimStateChanged(0, 3, IccCardConstants.State.READY);
+ verify(mCarrierTextCallback, never()).updateCarrierInfo(any());
+ }
+
+ @Test
+ public void testMoreSlotsThanSubs() {
+ reset(mCarrierTextCallback);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(
+ new ArrayList<>());
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(
+ IccCardConstants.State.CARD_IO_ERROR);
+ // This should not produce an out of bounds error, even though there are no subscriptions
+ mCarrierTextController.mCallback.onSimStateChanged(0, 1,
+ IccCardConstants.State.CARD_IO_ERROR);
+
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(
+ any(CarrierTextController.CarrierTextCallbackInfo.class));
+ }
+
+ @Test
+ public void testCallback() {
+ reset(mCarrierTextCallback);
+ mCarrierTextController.postToCallback(mCarrierTextCallbackInfo);
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertEquals(mCarrierTextCallbackInfo, captor.getValue());
+ }
+
+ @Test
+ public void testNullingCallback() {
+ reset(mCarrierTextCallback);
+
+ mCarrierTextController.postToCallback(mCarrierTextCallbackInfo);
+ mCarrierTextController.setListening(null);
+
+ // This shouldn't produce NPE
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(any());
+ }
+
+ @Test
+ public void testCreateInfo_OneValidSubscription() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mCarrierTextController.updateCarrierText();
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+
+ CarrierTextController.CarrierTextCallbackInfo info = captor.getValue();
+ assertEquals(1, info.listOfCarriers.length);
+ assertEquals(TEST_CARRIER, info.listOfCarriers[0]);
+ assertEquals(1, info.subscriptionIds.length);
+ }
+
+ @Test
+ public void testCreateInfo_OneValidSubscriptionWithRoaming() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION_ROAMING);
+ when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mCarrierTextController.updateCarrierText();
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+
+ CarrierTextController.CarrierTextCallbackInfo info = captor.getValue();
+ assertEquals(1, info.listOfCarriers.length);
+ assertTrue(info.listOfCarriers[0].toString().contains(TEST_CARRIER));
+ assertEquals(1, info.subscriptionIds.length);
+ }
+
+ @Test
+ public void testCreateInfo_noSubscriptions() {
+ reset(mCarrierTextCallback);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(
+ new ArrayList<>());
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mCarrierTextController.updateCarrierText();
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+
+ CarrierTextController.CarrierTextCallbackInfo info = captor.getValue();
+ assertEquals(0, info.listOfCarriers.length);
+ assertEquals(0, info.subscriptionIds.length);
+
+ }
+
+ public static class TestCarrierTextController extends CarrierTextController {
+ private KeyguardUpdateMonitor mKUM;
+
+ public TestCarrierTextController(Context context, CharSequence separator,
+ boolean showAirplaneMode, boolean showMissingSim, KeyguardUpdateMonitor kum) {
+ super(context, separator, showAirplaneMode, showMissingSim);
+ mKUM = kum;
+ }
+
+ @Override
+ public void setListening(CarrierTextCallback callback) {
+ super.setListening(callback);
+ mKeyguardUpdateMonitor = mKUM;
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
index e37ea95515d0..dcafa7203ce9 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -20,12 +20,13 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
index ab3a3e126b34..e7469c328fdf 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
@@ -16,7 +16,7 @@
package com.android.keyguard
-import android.support.test.filters.SmallTest
+import androidx.test.filters.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
index 58870e4acbd0..eadb1b63df90 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
@@ -21,12 +21,13 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index fcf327b5d1fa..8db195a23a15 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
@@ -16,19 +16,18 @@
package com.android.keyguard;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import android.content.Context;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.UiThreadTest;
-import android.util.Log;
import android.view.LayoutInflater;
-import android.view.View;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class KeyguardSecurityContainerTest extends SysuiTestCase {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index d5a275ebd78e..ffe3ece52e45 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -106,6 +106,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
when(mFaceManager.hasEnrolledTemplates()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mUserManager.isUserUnlocked(anyInt())).thenReturn(true);
+ when(mUserManager.isPrimaryUser()).thenReturn(true);
when(mStrongAuthTracker.isUnlockingWithBiometricAllowed()).thenReturn(true);
context.addMockSystemService(TrustManager.class, mTrustManager);
context.addMockSystemService(FingerprintManager.class, mFingerprintManager);
@@ -320,16 +321,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
}
@Test
- public void testNeverAuthenticates_whenFaceLockout() {
- mKeyguardUpdateMonitor.mFaceAuthenticationCallback
- .onAuthenticationError(FaceManager.FACE_ERROR_LOCKOUT, "lockout");
- mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
- mTestableLooper.processAllMessages();
-
- verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any());
- }
-
- @Test
public void testOnFaceAuthenticated_skipsFaceWhenAuthenticated() {
mKeyguardUpdateMonitor.onFaceAuthenticated(KeyguardUpdateMonitor.getCurrentUser());
mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java b/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java
index e1f56a47e641..d1573c3cac76 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java
@@ -16,8 +16,6 @@
package com.android.systemui;
-import com.android.settingslib.graph.BatteryMeterDrawableBase;
-
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyFloat;
import static org.mockito.Mockito.anyString;
@@ -30,9 +28,12 @@ import static org.mockito.Mockito.verify;
import android.content.res.Resources;
import android.graphics.Canvas;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.settingslib.graph.BatteryMeterDrawableBase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
index 61bfa758ad79..b1ca169eac0c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
@@ -21,7 +21,8 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.statusbar.policy.FlashlightController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
index 948e0014a451..e07d17fa8966 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
@@ -22,12 +22,13 @@ import static org.mockito.Mockito.when;
import android.animation.ObjectAnimator;
import android.content.Context;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.util.Assert;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
index 31e8071f5677..8a6ee12d7068 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
@@ -31,10 +31,11 @@ import android.app.NotificationManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.widget.RemoteViews;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.messages.nano.SystemMessageProto;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
index e4d56d756c87..48a536924475 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ImageWallpaperTest.java
@@ -16,9 +16,10 @@
package com.android.systemui;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java
index 4d33d437ff79..e0ca87c0223d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java
@@ -19,10 +19,11 @@ 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 androidx.test.filters.SmallTest;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index 0114075b1e65..64ab060e14a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -39,7 +39,6 @@ import android.app.Fragment;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Handler;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -47,6 +46,8 @@ import android.view.Display;
import android.view.View;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R.dimen;
import com.android.systemui.ScreenDecorations.TunablePaddingTagListener;
import com.android.systemui.fragments.FragmentHostManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
index 383db053b1f5..c6e85c3f81a0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java
@@ -29,9 +29,10 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.settingslib.SliceBroadcastRelay;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
index b6335f368183..256cfb28d4de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
@@ -19,10 +19,11 @@ import static org.mockito.Mockito.when;
import android.app.Fragment;
import android.app.Instrumentation;
-import android.support.test.InstrumentationRegistry;
import android.testing.BaseFragmentTest;
import android.testing.DexmakerShareClassLoaderRule;
+import androidx.test.InstrumentationRegistry;
+
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.systemui.utils.leaks.LeakCheckedTest.SysuiLeakCheck;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 9c5a59243d05..8d93f967be4f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -23,11 +23,12 @@ import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.ParcelFileDescriptor;
-import android.support.test.InstrumentationRegistry;
import android.testing.DexmakerShareClassLoaderRule;
import android.testing.LeakCheck;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.util.Assert;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
index 2582946333c0..73ee0bdfc619 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
@@ -28,10 +28,11 @@ import static org.mockito.Mockito.verify;
import android.app.AppOpsManager;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index ca72602f2c2b..0fd783423464 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -25,12 +25,13 @@ import static org.mockito.Mockito.when;
import android.app.IActivityManager;
import android.content.Context;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.WindowManager;
import android.widget.FrameLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/ExpandedAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/ExpandedAnimationControllerTest.java
index b4059c5db3b6..b8add89243ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/ExpandedAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/ExpandedAnimationControllerTest.java
@@ -21,12 +21,12 @@ import static org.junit.Assert.assertEquals;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.PointF;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.view.View;
import android.widget.FrameLayout;
import androidx.dynamicanimation.animation.DynamicAnimation;
+import androidx.test.filters.SmallTest;
import com.android.systemui.R;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
index c32140401fb2..a50919b22a6a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/PhysicsAnimationLayoutTest.java
@@ -28,13 +28,13 @@ import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.view.View;
import android.widget.FrameLayout;
import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.SpringForce;
+import androidx.test.filters.SmallTest;
import com.google.android.collect.Sets;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
index 97935ed9714f..943d927e2190 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
@@ -19,13 +19,13 @@ package com.android.systemui.bubbles.animation;
import static org.junit.Assert.assertEquals;
import android.graphics.PointF;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.view.View;
import android.widget.FrameLayout;
import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.SpringForce;
+import androidx.test.filters.SmallTest;
import com.android.systemui.R;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/chooser/ChooserHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/chooser/ChooserHelperTest.java
index 19ad7ca64577..ecfb9ee4950e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/chooser/ChooserHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/chooser/ChooserHelperTest.java
@@ -29,9 +29,10 @@ import android.app.Activity;
import android.app.ActivityTaskManager;
import android.content.Intent;
import android.os.Binder;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
index 13dc36da2698..1649f9845661 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
@@ -22,8 +22,9 @@ import static org.junit.Assert.assertNotEquals;
import android.app.WallpaperColors;
import android.app.WallpaperManager;
import android.graphics.Color;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/AlwaysOnDisplayPolicyTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/AlwaysOnDisplayPolicyTest.java
index 0bbdeb537248..ec9acdf26c8a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/AlwaysOnDisplayPolicyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/AlwaysOnDisplayPolicyTest.java
@@ -19,10 +19,11 @@ package com.android.systemui.doze;
import static com.google.common.truth.Truth.assertThat;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.format.DateUtils;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
index 6807c22175ab..20756c5e4015 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
@@ -21,8 +21,9 @@ import static junit.framework.TestCase.assertEquals;
import android.hardware.display.AmbientDisplayConfiguration;
import android.os.UserHandle;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java
index 23ff3d483599..4ba28582d7ba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeDockHandlerTest.java
@@ -30,12 +30,13 @@ import android.app.Instrumentation;
import android.hardware.display.AmbientDisplayConfiguration;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManagerFake;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index f972508c0375..6dfb19ea075a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -39,10 +39,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.hardware.display.AmbientDisplayConfiguration;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.UiThreadTest;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.wakelock.WakeLockFake;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index 1cf73b00d219..cde3398f91a6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -28,17 +28,16 @@ import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import android.content.Intent;
import android.os.PowerManager;
import android.os.UserHandle;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.utils.hardware.FakeSensorManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
index a17a95f6543d..903e4a1efa53 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -22,9 +22,10 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
index b6039b66e6cb..bfd448a2926d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
@@ -30,19 +30,16 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLockFake;
import com.android.systemui.utils.os.FakeHandler;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
index 463a6e63835e..4467faf66830 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java
@@ -32,11 +32,12 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.hardware.display.AmbientDisplayConfiguration;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
index ed935619b2f6..fac58a0a78ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java
@@ -22,9 +22,10 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.view.Display;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index ca373478f33c..8941182b1384 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -30,11 +30,12 @@ import android.app.Instrumentation;
import android.hardware.display.AmbientDisplayConfiguration;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManagerFake;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
index 0d8d9526f607..25231bcbc1c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
@@ -27,19 +27,17 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
-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.AlarmManager;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.PowerManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
@@ -47,7 +45,6 @@ import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -172,4 +169,4 @@ public class DozeUiTest extends SysuiTestCase {
mDozeUi.transitionTo(UNINITIALIZED, DOZE);
verify(mHost).setAnimateWakeup(eq(false));
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
index 9eb94f4aed72..beba905279aa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java
@@ -24,7 +24,8 @@ import static org.mockito.Mockito.when;
import android.app.IWallpaperManager;
import android.os.RemoteException;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java
index 308670dc7cfb..d35fc30da6c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java
@@ -19,12 +19,11 @@ package com.android.systemui.keyguard;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.UiOffloadThread;
import org.junit.Before;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index e1717be7b16d..63d42a70aa98 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -30,7 +30,6 @@ import android.content.ContentResolver;
import android.media.MediaMetadata;
import android.net.Uri;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -41,6 +40,7 @@ import androidx.slice.SliceProvider;
import androidx.slice.SliceSpecs;
import androidx.slice.builders.ListBuilder;
import androidx.slice.core.SliceQuery;
+import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
index e0807d648f40..50914c86b933 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
@@ -19,9 +19,10 @@ package com.android.systemui.keyguard;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ScreenLifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ScreenLifecycleTest.java
index 8c918f6a7af2..06e597e1c87a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ScreenLifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ScreenLifecycleTest.java
@@ -21,9 +21,10 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
index 9eba9b894064..1dc415048f74 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WakefulnessLifecycleTest.java
@@ -22,9 +22,10 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
index 199c4c283452..d26ae6aaad79 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -16,13 +16,13 @@
package com.android.systemui.keyguard;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.argThat;
import android.app.Activity;
import android.app.ActivityManager;
@@ -36,13 +36,14 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.shared.system.ActivityManagerWrapper;
-
import com.android.systemui.shared.system.TaskStackChangeListener;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
index 9f3573f6a4ee..6e726cf6bf8d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
@@ -17,13 +17,11 @@
package com.android.systemui.keyguard;
import static android.app.ActivityManager.TaskDescription;
+
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import android.annotation.ColorInt;
import android.annotation.UserIdInt;
import android.app.KeyguardManager;
@@ -33,6 +31,9 @@ import android.content.Intent;
import android.graphics.Color;
import android.os.Looper;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WorkLockActivity;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java
index b7c1e8ea31b4..3155e57d8ab3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java
@@ -26,13 +26,14 @@ import static org.junit.Assert.assertTrue;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
index cd500b4c38f9..5876ae1910be 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java
@@ -30,9 +30,10 @@ import static org.mockito.Mockito.verify;
import android.app.Notification;
import android.app.NotificationManager;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.NotificationChannels;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt
index b6e0d905f473..6302f9d56dc3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt
@@ -16,8 +16,8 @@
package com.android.systemui.privacy
-import android.support.test.filters.SmallTest
-import android.support.test.runner.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.runner.AndroidJUnit4
import com.android.systemui.SysuiTestCase
import org.junit.Assert.assertEquals
import org.junit.Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
index bb384dd52875..1783d9dacd3b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt
@@ -24,7 +24,7 @@ import android.content.pm.UserInfo
import android.os.Handler
import android.os.UserHandle
import android.os.UserManager
-import android.support.test.filters.SmallTest
+import androidx.test.filters.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java
index dfc1852502e2..0ae9461d38b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java
@@ -22,10 +22,11 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.provider.Settings.Secure;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Prefs;
import com.android.systemui.Prefs.Key;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
index f845f3adc636..8879e83b4d0e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
@@ -23,7 +23,6 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -31,6 +30,8 @@ import android.testing.ViewUtils;
import android.view.LayoutInflater;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
index 374a73c1d451..a8b169cc63d2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
@@ -22,7 +22,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.telephony.SubscriptionManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -30,6 +29,8 @@ import android.testing.TestableLooper.RunWithLooper;
import android.view.LayoutInflater;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.keyguard.CarrierTextController.CarrierTextCallbackInfo;
import com.android.systemui.R;
import com.android.systemui.R.id;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 823485f4624d..10d1572ca621 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -23,7 +23,6 @@ import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.LayoutInflaterBuilder;
import android.testing.TestableLooper;
@@ -31,6 +30,8 @@ import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.widget.FrameLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.keyguard.CarrierText;
import com.android.systemui.Dependency;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 12a122a5c734..c6b31d03ff3b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -23,13 +23,14 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 78700b88d4bc..a458928da9d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -19,9 +19,10 @@ package com.android.systemui.qs;
import static junit.framework.TestCase.assertFalse;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
index e2159d24ad85..ea8c64ac53bb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
@@ -16,27 +16,26 @@
package com.android.systemui.qs;
+import static org.junit.Assert.assertTrue;
+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.content.Context;
import android.graphics.drawable.Drawable;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.qs.QSTile.SlashState;
import com.android.systemui.qs.tileimpl.SlashImageView;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java
index 2040e7578910..fef47bd6a392 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java
@@ -27,12 +27,12 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.tileimpl.QSIconViewImpl;
import com.android.systemui.qs.tileimpl.QSTileView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/TouchAnimatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/TouchAnimatorTest.java
index 4cc0e20dd964..c43c3e629c8a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/TouchAnimatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/TouchAnimatorTest.java
@@ -14,18 +14,21 @@
package com.android.systemui.qs;
-import android.support.test.runner.AndroidJUnit4;
+import static junit.framework.Assert.assertEquals;
+
import android.test.suitebuilder.annotation.SmallTest;
import android.view.View;
-import com.android.systemui.qs.TouchAnimator.Listener;
+
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.qs.TouchAnimator.Listener;
+
import org.junit.Before;
-import org.junit.runner.RunWith;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mockito;
-import static junit.framework.Assert.assertEquals;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TouchAnimatorTest extends SysuiTestCase {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
index 0239ab090dfc..25bac7ae4117 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
@@ -18,11 +18,12 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.QSTileHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
index c3a3e6339daa..9e226f693622 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java
@@ -14,12 +14,14 @@
package com.android.systemui.qs.customize;
+import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeastOnce;
@@ -29,15 +31,21 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.Manifest;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
+import android.service.quicksettings.Tile;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.text.TextUtils;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -47,7 +55,9 @@ import com.android.systemui.qs.QSTileHost;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -67,6 +77,8 @@ public class TileQueryHelperTest extends SysuiTestCase {
private static final String STOCK_TILES = "wifi,dnd,cell,battery";
private static final String ALL_TILES = "wifi,dnd,nfc,cell,battery";
private static final Set<String> FACTORY_TILES = new ArraySet<>();
+ private static final String TEST_PKG = "test_pkg";
+ private static final String TEST_CLS = "test_cls";
static {
FACTORY_TILES.addAll(Arrays.asList(
@@ -81,6 +93,8 @@ public class TileQueryHelperTest extends SysuiTestCase {
private QSTileHost mQSTileHost;
@Mock
private PackageManager mPackageManager;
+ @Captor
+ private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor;
private QSTile.State mState;
private TestableLooper mBGLooper;
@@ -153,8 +167,6 @@ public class TileQueryHelperTest extends SysuiTestCase {
@Test
public void testQueryTiles_correctTilesAndOrderOnlyStockTiles() {
- ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
-
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
ONLY_STOCK_TILES);
mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
@@ -165,9 +177,9 @@ public class TileQueryHelperTest extends SysuiTestCase {
mBGLooper.processAllMessages();
waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
- verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
+ verify(mListener, atLeastOnce()).onTilesChanged(mCaptor.capture());
List<String> specs = new ArrayList<>();
- for (TileQueryHelper.TileInfo t : captor.getValue()) {
+ for (TileQueryHelper.TileInfo t : mCaptor.getValue()) {
specs.add(t.spec);
}
String tiles = TextUtils.join(",", specs);
@@ -176,8 +188,6 @@ public class TileQueryHelperTest extends SysuiTestCase {
@Test
public void testQueryTiles_correctTilesAndOrderOtherFactoryTiles() {
- ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
-
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
CURRENT_TILES);
mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
@@ -188,9 +198,9 @@ public class TileQueryHelperTest extends SysuiTestCase {
mBGLooper.processAllMessages();
waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
- verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
+ verify(mListener, atLeastOnce()).onTilesChanged(mCaptor.capture());
List<String> specs = new ArrayList<>();
- for (TileQueryHelper.TileInfo t : captor.getValue()) {
+ for (TileQueryHelper.TileInfo t : mCaptor.getValue()) {
specs.add(t.spec);
}
String tiles = TextUtils.join(",", specs);
@@ -199,8 +209,6 @@ public class TileQueryHelperTest extends SysuiTestCase {
@Test
public void testQueryTiles_otherTileNotIncluded() {
- ArgumentCaptor<List<TileQueryHelper.TileInfo>> captor = ArgumentCaptor.forClass(List.class);
-
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES,
WITH_OTHER_TILES);
mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
@@ -211,15 +219,44 @@ public class TileQueryHelperTest extends SysuiTestCase {
mBGLooper.processAllMessages();
waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
- verify(mListener, atLeastOnce()).onTilesChanged(captor.capture());
+ verify(mListener, atLeastOnce()).onTilesChanged(mCaptor.capture());
List<String> specs = new ArrayList<>();
- for (TileQueryHelper.TileInfo t : captor.getValue()) {
+ for (TileQueryHelper.TileInfo t : mCaptor.getValue()) {
specs.add(t.spec);
}
assertFalse(specs.contains("other"));
}
@Test
+ public void testThirdPartyTilesInactive() {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ ServiceInfo serviceInfo = mock(ServiceInfo.class, Answers.RETURNS_MOCKS);
+ resolveInfo.serviceInfo = serviceInfo;
+ serviceInfo.packageName = TEST_PKG;
+ serviceInfo.name = TEST_CLS;
+ serviceInfo.icon = R.drawable.android;
+ serviceInfo.permission = Manifest.permission.BIND_QUICK_SETTINGS_TILE;
+ serviceInfo.applicationInfo = mock(ApplicationInfo.class, Answers.RETURNS_MOCKS);
+ serviceInfo.applicationInfo.icon = R.drawable.android;
+ List<ResolveInfo> list = new ArrayList<>();
+ list.add(resolveInfo);
+ when(mPackageManager.queryIntentServicesAsUser(any(), anyInt(), anyInt())).thenReturn(list);
+
+ Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, "");
+ mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
+ "");
+
+ mTileQueryHelper.queryTiles(mQSTileHost);
+ mBGLooper.processAllMessages();
+ waitForIdleSync(Dependency.get(Dependency.MAIN_HANDLER));
+
+ verify(mListener, atLeastOnce()).onTilesChanged(mCaptor.capture());
+ List<TileQueryHelper.TileInfo> tileInfos = mCaptor.getValue();
+ assertEquals(1, tileInfos.size());
+ assertEquals(Tile.STATE_INACTIVE, tileInfos.get(0).state.state);
+ }
+
+ @Test
public void testQueryTiles_nullSetting() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, null);
mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileColorPickerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileColorPickerTest.java
index ba451e1e10dc..ec8552b7f394 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileColorPickerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileColorPickerTest.java
@@ -15,17 +15,20 @@
*/
package com.android.systemui.qs.external;
+import static junit.framework.Assert.assertEquals;
+
import android.content.res.ColorStateList;
import android.service.quicksettings.Tile;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import com.android.systemui.R;
-
-import static junit.framework.Assert.assertEquals;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
index e5e8ae3311ef..f35295cf6f99 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java
@@ -40,9 +40,10 @@ import android.service.quicksettings.IQSService;
import android.service.quicksettings.IQSTileService;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import org.junit.After;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
index cc743245fc42..683e8f4a2511 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServiceManagerTest.java
@@ -15,12 +15,19 @@
*/
package com.android.systemui.qs.external;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import android.content.ComponentName;
import android.os.Handler;
import android.os.HandlerThread;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -28,10 +35,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TileServiceManagerTest extends SysuiTestCase {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
index c5e404385f8b..8a36cfbc4e2e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
@@ -21,14 +21,14 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.service.quicksettings.Tile;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.UiThreadTest;
import android.widget.ImageView;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.qs.QSTile.Icon;
import com.android.systemui.plugins.qs.QSTile.State;
@@ -36,7 +36,6 @@ import com.android.systemui.plugins.qs.QSTile.State;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
@RunWith(AndroidTestingRunner.class)
@UiThreadTest
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 86f6cd331fc9..3df8a8aadda2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -34,15 +34,14 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static java.lang.Thread.sleep;
-
import android.content.Intent;
import android.metrics.LogMaker;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
@@ -61,6 +60,8 @@ import org.mockito.ArgumentMatcher;
import org.mockito.Captor;
import org.mockito.MockitoAnnotations;
+import static java.lang.Thread.sleep;
+
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
index efcbb769cbf0..ea8d4b2f8f60 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
@@ -22,11 +22,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.service.quicksettings.Tile;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.lifecycle.LifecycleOwner;
+import androidx.test.filters.SmallTest;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
@@ -46,7 +46,6 @@ import org.mockito.MockitoAnnotations;
import java.util.HashSet;
import java.util.Set;
-
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@SmallTest
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/SensorPrivacyTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/SensorPrivacyTileTest.java
index 751a616eee32..6386c4cd6331 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/SensorPrivacyTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/SensorPrivacyTileTest.java
@@ -22,10 +22,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.hardware.SensorPrivacyManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ActivityStarter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
index 17d7a4183b16..4162bc1da479 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
@@ -17,7 +17,8 @@
package com.android.systemui.settings;
import android.content.Intent;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
index 3415c72230e4..7d95563f2ff1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java
@@ -41,10 +41,11 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.HandlerThread;
import android.os.UserHandle;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.Plugin;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java
index 9bad78d2d45c..218e7db5e450 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java
@@ -17,15 +17,15 @@ package com.android.systemui.shared.plugins;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.OverlayPlugin;
-import com.android.systemui.shared.plugins.VersionInfo.InvalidVersionException;
import com.android.systemui.plugins.annotations.Requires;
-import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.DetailAdapter;
+import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.QS.HeightListener;
+import com.android.systemui.shared.plugins.VersionInfo.InvalidVersionException;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
index 7b1253af12c6..5c1f473360b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
@@ -32,16 +32,16 @@ import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java
index f0344e6936e7..0b25a7c8e07c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java
@@ -19,10 +19,11 @@ package com.android.systemui.statusbar;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index 51d94f08000a..dd2636803b94 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -25,7 +25,8 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index aae6d93cebed..18ffbb5062a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -33,12 +33,13 @@ import android.content.Context;
import android.graphics.Color;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
index 8e92684876f6..42f476bdc8ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
@@ -19,10 +19,11 @@ package com.android.systemui.statusbar;
import static org.junit.Assert.assertFalse;
import android.os.Handler;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
index cffa9c7d4deb..2a013560bcd3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java
@@ -27,10 +27,11 @@ import android.os.Handler;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
index d7ca5b410e56..490b2eafe471 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java
@@ -35,10 +35,11 @@ import android.os.Handler;
import android.os.Looper;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
index c159516d5bde..b81e04821463 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java
@@ -16,10 +16,11 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputActiveExtender;
import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputHistoryExtender;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index 3c919a17df6c..cef78db1b16b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -30,11 +30,12 @@ import android.content.Intent;
import android.graphics.drawable.Icon;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.widget.RemoteViews;
+import androidx.test.InstrumentationRegistry;
+
import com.android.systemui.R;
import com.android.systemui.bubbles.BubblesTestActivity;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java
index db1e049dec9b..f63389c911c9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java
@@ -22,7 +22,8 @@ import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.Intent;
import android.graphics.drawable.Icon;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.internal.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
index 62700c0b3b4c..6b2e05b23ca7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
@@ -26,13 +26,14 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java
index c2611e410fad..2020d4b9562f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ScrimViewTest.java
@@ -18,23 +18,17 @@ package com.android.systemui.statusbar;
import static junit.framework.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.ViewUtils;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.colorextraction.drawable.GradientDrawable;
import com.android.systemui.statusbar.policy.ConfigurationController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
index 31cd28019ea9..81e373a8be27 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java
@@ -29,10 +29,11 @@ import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.R;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
index e529e4c44c41..4c20b61083f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconListTest.java
@@ -1,6 +1,7 @@
package com.android.systemui.statusbar;
import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
@@ -8,19 +9,21 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.StatusBarIconHolder;
import com.android.systemui.statusbar.phone.StatusBarIconList;
import com.android.systemui.statusbar.phone.StatusBarIconList.Slot;
-import java.util.ArrayList;
-import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.List;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class StatusBarIconListTest extends SysuiTestCase {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
index 8fee1071ba87..9971e0cf81a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -38,8 +38,9 @@ import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/MediaNotificationProcessorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/MediaNotificationProcessorTest.java
index 5d3a86da4874..b03abecbc59b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/MediaNotificationProcessorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/MediaNotificationProcessorTest.java
@@ -27,10 +27,11 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import android.app.Notification;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.widget.RemoteViews;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index 0d4328f94a39..554374432135 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -42,13 +42,13 @@ import android.os.Looper;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
+import androidx.test.filters.SmallTest;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Dependency;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
index 387475f79cc2..91a7ea87a93b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java
@@ -31,12 +31,13 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java
index 4b5037bb3f64..311b81c2858e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationListControllerTest.java
@@ -31,11 +31,12 @@ import android.app.AppOpsManager;
import android.app.Notification;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.R;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index 813fc9d308e5..b35dcb62136c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -24,9 +24,10 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java
index 9f36a1eb9943..79a6ac4cb0c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java
@@ -35,7 +35,6 @@ import static junit.framework.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.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -57,12 +56,13 @@ import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.InitController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java
index f1d900332607..2b343c21fc8f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/ExpansionStateLoggerTest.java
@@ -22,10 +22,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.os.RemoteException;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
index d47700b6f3e0..5e587f848ece 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
@@ -30,10 +30,11 @@ import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
index f6fb4163bfc4..0aa103fa27da 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
@@ -38,7 +38,6 @@ import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
import android.app.NotificationChannel;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -46,6 +45,8 @@ import android.util.ArraySet;
import android.view.NotificationHeaderView;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.NotificationTestHelper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
index aa7889a1ac95..233695848298 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
@@ -16,23 +16,18 @@
package com.android.systemui.statusbar.notification.row;
-import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.LayoutInflater;
import android.view.View;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
index 669b98e1b279..4fe364a7654b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationBlockingHelperManagerTest.java
@@ -30,12 +30,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.NotificationTestHelper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
index 99dc9f87520f..025296d14da4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
@@ -36,7 +36,6 @@ import android.os.CancellationSignal;
import android.os.Handler;
import android.os.Looper;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.ArrayMap;
@@ -44,6 +43,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.RemoteViews;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.InflationTask;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
index d756b0970346..5cd0ca7efa9e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java
@@ -30,13 +30,14 @@ import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
import android.graphics.drawable.Icon;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
import android.view.NotificationHeaderView;
import android.view.View;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
index 727e9af94146..785d5b014862 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java
@@ -49,12 +49,13 @@ import android.os.Binder;
import android.os.Handler;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
index 04d7509f760f..e6389c4adb76 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java
@@ -27,13 +27,14 @@ import static org.mockito.Mockito.when;
import android.app.NotificationChannel;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.ViewUtils;
import android.view.ViewGroup;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.utils.leaks.LeakCheckedTest;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapperTest.java
index fed66af07bcc..63e18ce722c3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapperTest.java
@@ -16,13 +16,14 @@
package com.android.systemui.statusbar.notification.row.wrapper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.widget.RemoteViews;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapperTest.java
index 637b30c6bc00..546315900275 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapperTest.java
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.row.wrapper;
import static org.mockito.Mockito.mock;
import android.content.Context;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -27,6 +26,8 @@ import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java
index bbafb4e4a211..eb4656764c98 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java
@@ -16,13 +16,14 @@
package com.android.systemui.statusbar.notification.stack;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.NotificationHeaderView;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
index ff30a4d6761d..1b4acd71ad31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java
@@ -23,16 +23,16 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
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 d83508201529..1f5759357d8e 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
@@ -38,11 +38,12 @@ import static org.mockito.Mockito.when;
import android.metrics.LogMaker;
import android.provider.Settings;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.Dependency;
@@ -52,6 +53,7 @@ import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
@@ -141,7 +143,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
// holds a copy of the CUT's instances of these classes, so they still refer to the CUT's
// member variables, not the spy's member variables.
mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null,
- true /* allowLongPress */, mNotificationRoundnessManager);
+ true /* allowLongPress */, mNotificationRoundnessManager,
+ new AmbientPulseManager(mContext));
mStackScroller = spy(mStackScrollerInternal);
mStackScroller.setShelf(notificationShelf);
mStackScroller.setStatusBar(mBar);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java
index db39373d3ae4..b24c3ddc1199 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelperTest.java
@@ -31,12 +31,13 @@ import android.animation.Animator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.os.Handler;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SwipeHelper;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
@@ -211,7 +212,7 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
@Test
public void testDismissChild_notExpanded() {
- when(mCallback.isExpanded()).thenReturn(false);
+ when(mCallback.shouldDismissQuickly()).thenReturn(false);
doNothing().when(mSwipeHelper).superDismissChild(mView, 0, false);
doNothing().when(mSwipeHelper).handleMenuCoveredOrDismissed();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index 87699b816c07..1248cbbd335d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -24,11 +24,12 @@ import static org.mockito.Mockito.verify;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.NightDisplayListener;
import android.os.Handler;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.AutoAddTracker;
import com.android.systemui.qs.QSTileHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 3c5425ce7d6f..33af96f1f13f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -24,12 +24,13 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.when;
import android.app.StatusBarManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.view.ViewPropertyAnimator;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt
index 0d13e975e56a..fee3ccb21792 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt
@@ -14,7 +14,7 @@
package com.android.systemui.statusbar.phone
-import android.support.test.filters.SmallTest
+import androidx.test.filters.SmallTest
import android.testing.AndroidTestingRunner
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index 532019fe09c6..f6f4eb489603 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -16,11 +16,21 @@
package com.android.systemui.statusbar.phone;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
import android.content.Context;
import android.os.PowerManager;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.doze.DozeScreenState;
import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher;
@@ -29,18 +39,6 @@ import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.fail;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DozeParametersTest extends SysuiTestCase {
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 fe36b6d14748..20c739ff579e 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
@@ -20,10 +20,11 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.doze.DozeHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
index 38d9ae7cfab4..44df237d70c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java
@@ -22,13 +22,14 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.widget.TextView;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.HeadsUpStatusBarView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index 9ceb325204fe..7797cb37b397 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -21,11 +21,12 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.AlertingNotificationManagerTest;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
index 96f1976f2b20..301099667eea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaTest.kt
@@ -1,6 +1,6 @@
package com.android.systemui.statusbar.phone
-import android.support.test.filters.SmallTest
+import androidx.test.filters.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index f7a95c50fee8..e84dd68e30ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -30,13 +30,14 @@ import static org.mockito.Mockito.when;
import android.content.res.ColorStateList;
import android.graphics.Color;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardHostView;
import com.android.keyguard.KeyguardSecurityModel;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
index cd52e8792cfd..fcf4c71c2913 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java
@@ -18,10 +18,11 @@ package com.android.systemui.statusbar.phone;
import static com.google.common.truth.Truth.assertThat;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java
index c5875554b073..eec836fde7f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardPresentationTest.java
@@ -16,11 +16,12 @@
package com.android.systemui.statusbar.phone;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.LayoutInflater;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
index 0031c32a9846..93fdce173f12 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
@@ -22,10 +22,11 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.LightBarTransitionsController.DarkIntensityApplier;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarButtonTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarButtonTest.java
index 5c8071885c0d..81e8abf5a058 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarButtonTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarButtonTest.java
@@ -25,13 +25,14 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.ImageReader;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.Log;
import android.view.Display;
import android.view.DisplayInfo;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestableContext;
import com.android.systemui.statusbar.CommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java
index c792459418f3..6293b06caa26 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java
@@ -17,26 +17,28 @@
package com.android.systemui.statusbar.phone;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.doReturn;
import android.graphics.drawable.Drawable;
-import android.support.test.filters.SmallTest;
import android.view.View;
-import com.android.systemui.statusbar.policy.KeyButtonDrawable;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.KeyButtonDrawable;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import android.support.test.runner.AndroidJUnit4;
-
/** atest NavigationBarContextTest */
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index babd452475d4..6a0d61dc13c9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -22,7 +22,6 @@ import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.LeakCheck.Tracker;
import android.testing.TestableLooper.RunWithLooper;
@@ -30,6 +29,8 @@ import android.view.Display;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiBaseFragmentTest;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarInflaterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarInflaterViewTest.java
index 093749adf1c3..cec7feb23752 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarInflaterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarInflaterViewTest.java
@@ -22,13 +22,14 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.SparseArray;
import android.view.View;
import android.widget.FrameLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarRotationContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarRotationContextTest.java
index be26d9101c69..28e91eaadd49 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarRotationContextTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarRotationContextTest.java
@@ -22,13 +22,14 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.View;
-import com.android.systemui.SysuiTestableContext;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.SysuiTestableContext;
import com.android.systemui.TestableDependency;
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
import com.android.systemui.statusbar.policy.RotationLockController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
index 40d5415a9a47..bb109bd931de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarTransitionsTest.java
@@ -21,11 +21,12 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.IWindowManager;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
index 4dee43857c65..a04bcc0b29c5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
@@ -23,12 +23,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.res.Configuration;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.MotionEvent;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
index cefd4acbfb5a..337c35c39ca1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
@@ -26,10 +26,11 @@ import static org.mockito.Mockito.when;
import android.app.Notification;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
index ecb3e4d8067c..43685f0513e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java
@@ -23,10 +23,11 @@ import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -40,7 +41,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
index 120d0b093e0e..7f7a3e7e7cd6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java
@@ -22,10 +22,11 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.provider.Settings;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationListener;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
index a97fa1ff1629..db8357a5a9db 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java
@@ -21,15 +21,20 @@ import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.PulseExpansionHandler;
+import com.android.systemui.statusbar.StatusBarStateControllerImpl;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -65,7 +70,12 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
mDependency.injectMockDependency(ConfigurationController.class);
mDependency.injectMockDependency(ZenModeController.class);
- mNotificationPanelView = new TestableNotificationPanelView();
+ NotificationWakeUpCoordinator coordinator =
+ new NotificationWakeUpCoordinator(
+ new AmbientPulseManager(mContext),
+ new StatusBarStateControllerImpl());
+ PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator);
+ mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler);
}
@Test
@@ -92,8 +102,9 @@ public class NotificationPanelViewTest extends SysuiTestCase {
}
private class TestableNotificationPanelView extends NotificationPanelView {
- TestableNotificationPanelView() {
- super(NotificationPanelViewTest.this.mContext, null);
+ TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator,
+ PulseExpansionHandler expansionHandler) {
+ super(NotificationPanelViewTest.this.mContext, null, coordinator, expansionHandler);
mNotificationStackScroller = mNotificationStackScrollLayout;
mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView;
mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
index dbf00a379c5f..782983032923 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/QuickStepControllerTest.java
@@ -40,12 +40,13 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.res.Resources;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.MotionEvent;
import android.view.View;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.recents.OverviewProxyService;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index f72d4119b50c..f88b64a65e28 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -38,12 +38,13 @@ import android.app.AlarmManager;
import android.graphics.Color;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.util.function.TriConsumer;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index 4f95bc515d0a..a27ed1eba726 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -22,12 +22,13 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.mock;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
import android.widget.LinearLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.StatusBarIconView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 93dedfbe9656..1a27765cbcda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -25,11 +25,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.ViewGroup;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index d2b0f7f95967..e811e1d955ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -26,13 +26,14 @@ import android.content.Context;
import android.metrics.LogMaker;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.logging.testing.FakeMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
index f28757f516da..a88a59540161 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
@@ -23,14 +23,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.internal.verification.VerificationModeFactory.times;
-import android.content.BroadcastReceiver;
-import android.content.Context;
import android.content.Intent;
import android.os.UserManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index a95361f9e046..f8bfc54512f1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -52,7 +52,6 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.service.dreams.IDreamManager;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -60,6 +59,8 @@ import android.testing.TestableLooper.RunWithLooper;
import android.util.SparseArray;
import android.view.ViewGroup.LayoutParams;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.logging.testing.FakeMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java
index 9996a9eddc02..fea41a441065 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java
@@ -25,12 +25,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
index 11284d6ce261..ca0e1c64a7a9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
@@ -22,10 +22,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.MotionEvent;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
index 090963be7ac7..ca648234a24e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
@@ -23,10 +23,11 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
@@ -34,7 +35,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index b65b0f7afa0b..7f3c34e5eb1b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -15,8 +15,8 @@
package com.android.systemui.statusbar.policy;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -25,11 +25,11 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
-import android.util.Log;
+
+import androidx.test.filters.SmallTest;
import com.android.settingslib.bluetooth.BluetoothEventManager;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java
index 93c97ec14a42..fa711f1cf9a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java
@@ -20,7 +20,6 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -28,6 +27,7 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Lifecycle.Event;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index ed0f9ab224eb..85f60338b6e8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -15,29 +15,33 @@
*/
package com.android.systemui.statusbar.policy;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Matchers.eq;
+
import android.os.HandlerThread;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.SubscriptionInfo;
import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
-import java.util.ArrayList;
-import java.util.List;
+
import org.junit.Before;
-import org.junit.runner.RunWith;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertEquals;
-
-import static org.mockito.Matchers.eq;
+import java.util.ArrayList;
+import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java
index 1ee70940af38..016e402c69f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java
@@ -1,28 +1,29 @@
package com.android.systemui.statusbar.policy;
+import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.junit.Assert.fail;
import android.media.MediaRouter;
import android.media.projection.MediaProjectionInfo;
import android.media.projection.MediaProjectionManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.CastController.Callback;
import org.junit.Before;
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.junit.Test;
import java.util.ConcurrentModificationException;
import java.util.concurrent.CountDownLatch;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
index 2553ac1e8fcb..1240a4815b98 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java
@@ -23,11 +23,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.res.Configuration;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.Plugin;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java
index 3382a906d057..de1072d450f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java
@@ -11,28 +11,36 @@
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT 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.systemui.statusbar.policy;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.when;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
import android.graphics.drawable.Icon;
import android.service.notification.StatusBarNotification;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
+import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions;
@@ -49,19 +57,19 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
public class InflatedSmartRepliesTest extends SysuiTestCase {
- private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION";
+ private static final Intent TEST_INTENT = new Intent("com.android.SMART_REPLY_VIEW_ACTION");
+ private static final Intent WHITELISTED_TEST_INTENT =
+ new Intent("com.android.WHITELISTED_TEST_ACTION");
- @Mock
- SmartReplyConstants mSmartReplyConstants;
- @Mock
- StatusBarNotification mStatusBarNotification;
- @Mock
- Notification mNotification;
+ @Mock SmartReplyConstants mSmartReplyConstants;
+ @Mock StatusBarNotification mStatusBarNotification;
+ @Mock Notification mNotification;
NotificationEntry mEntry;
- @Mock
- RemoteInput mRemoteInput;
- @Mock
- RemoteInput mFreeFormRemoteInput;
+ @Mock RemoteInput mRemoteInput;
+ @Mock RemoteInput mFreeFormRemoteInput;
+ @Mock ActivityManagerWrapper mActivityManagerWrapper;
+ @Mock PackageManagerWrapper mPackageManagerWrapper;
+ @Mock DevicePolicyManagerWrapper mDevicePolicyManagerWrapper;
private Icon mActionIcon;
@@ -70,11 +78,18 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mDependency.injectTestDependency(ActivityManagerWrapper.class, mActivityManagerWrapper);
+ mDependency.injectTestDependency(
+ DevicePolicyManagerWrapper.class, mDevicePolicyManagerWrapper);
+ mDependency.injectTestDependency(PackageManagerWrapper.class, mPackageManagerWrapper);
+
when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true);
when(mStatusBarNotification.getNotification()).thenReturn(mNotification);
mEntry = new NotificationEntry(mStatusBarNotification);
when(mSmartReplyConstants.isEnabled()).thenReturn(true);
mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person);
+
+ when(mActivityManagerWrapper.isLockTaskKioskModeActive()).thenReturn(false);
}
@Test
@@ -226,6 +241,87 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
assertThat(repliesAndActions.smartReplies).isNull();
}
+ @Test
+ public void chooseSmartRepliesAndActions_lockTaskKioskModeEnabled_smartRepliesUnaffected() {
+ when(mActivityManagerWrapper.isLockTaskKioskModeActive()).thenReturn(true);
+ // No apps are white-listed
+ when(mDevicePolicyManagerWrapper.isLockTaskPermitted(anyString())).thenReturn(false);
+
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // suggestions.
+ setupAppGeneratedReplies(null /* smartReplies */);
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
+ mEntry.systemGeneratedSmartReplies);
+ // Since no apps are whitelisted no actions should be shown.
+ assertThat(repliesAndActions.smartActions.actions).isEmpty();
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_lockTaskKioskModeEnabled_smartActionsAffected() {
+ when(mActivityManagerWrapper.isLockTaskKioskModeActive()).thenReturn(true);
+ String allowedPackage = "allowedPackage";
+ ResolveInfo allowedResolveInfo = new ResolveInfo();
+ allowedResolveInfo.activityInfo = new ActivityInfo();
+ allowedResolveInfo.activityInfo.packageName = allowedPackage;
+ when(mPackageManagerWrapper
+ .resolveActivity(
+ argThat(intent -> WHITELISTED_TEST_INTENT.getAction().equals(
+ intent.getAction())),
+ anyInt() /* flags */))
+ .thenReturn(allowedResolveInfo);
+ when(mDevicePolicyManagerWrapper.isLockTaskPermitted(allowedPackage)).thenReturn(true);
+
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // suggestions.
+ setupAppGeneratedReplies(null /* smartReplies */);
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ List<Notification.Action> actions = new ArrayList<>();
+ actions.add(createAction("allowed action", WHITELISTED_TEST_INTENT));
+ actions.add(createAction("non-allowed action", TEST_INTENT));
+ mEntry.systemGeneratedSmartActions = actions;
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ // Only the action for the whitelisted package should be allowed.
+ assertThat(repliesAndActions.smartActions.actions.size()).isEqualTo(1);
+ assertThat(repliesAndActions.smartActions.actions.get(0)).isEqualTo(
+ mEntry.systemGeneratedSmartActions.get(0));
+ }
+
+ @Test
+ public void chooseSmartRepliesAndActions_screenPinningModeEnabled_suggestionsUnaffected() {
+ when(mActivityManagerWrapper.isLockToAppActive()).thenReturn(true);
+ // No apps are white-listed
+ when(mDevicePolicyManagerWrapper.isLockTaskPermitted(anyString())).thenReturn(false);
+
+ // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart
+ // suggestions.
+ setupAppGeneratedReplies(null /* smartReplies */);
+ mEntry.systemGeneratedSmartReplies =
+ new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"};
+ mEntry.systemGeneratedSmartActions =
+ createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"});
+
+ SmartRepliesAndActions repliesAndActions =
+ InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry);
+
+ // We don't restrict replies or actions in screen pinning mode.
+ assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
+ mEntry.systemGeneratedSmartReplies);
+ assertThat(repliesAndActions.smartActions.actions).isEqualTo(
+ mEntry.systemGeneratedSmartActions);
+ }
+
private void setupAppGeneratedReplies(CharSequence[] smartReplies) {
setupAppGeneratedReplies(smartReplies, true /* allowSystemGeneratedReplies */);
}
@@ -233,7 +329,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
private void setupAppGeneratedReplies(
CharSequence[] smartReplies, boolean allowSystemGeneratedReplies) {
PendingIntent pendingIntent =
- PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0);
+ PendingIntent.getBroadcast(mContext, 0, TEST_INTENT, 0);
Notification.Action action =
new Notification.Action.Builder(null, "Test Action", pendingIntent).build();
when(mRemoteInput.getChoices()).thenReturn(smartReplies);
@@ -260,8 +356,11 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
}
private Notification.Action.Builder createActionBuilder(String actionTitle) {
- PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
- new Intent(TEST_ACTION), 0);
+ return createActionBuilder(actionTitle, TEST_INTENT);
+ }
+
+ private Notification.Action.Builder createActionBuilder(String actionTitle, Intent intent) {
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
return new Notification.Action.Builder(mActionIcon, actionTitle, pendingIntent);
}
@@ -269,6 +368,10 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
return createActionBuilder(actionTitle).build();
}
+ private Notification.Action createAction(String actionTitle, Intent intent) {
+ return createActionBuilder(actionTitle, intent).build();
+ }
+
private List<Notification.Action> createActions(String[] actionTitles) {
List<Notification.Action> actions = new ArrayList<>();
for (String title : actionTitles) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
index f85923522b34..39bdf204cd65 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
@@ -21,12 +21,13 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_
import static org.mockito.ArgumentMatchers.argThat;
import android.metrics.LogMaker;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.KeyEvent;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
index a0fb33014928..3dcb34aac814 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java
@@ -20,11 +20,12 @@ import static org.mockito.Mockito.when;
import android.content.Intent;
import android.location.LocationManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
index eefdeee1001e..93cf3e8317ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
@@ -1,7 +1,8 @@
package com.android.systemui.statusbar.policy;
+import static junit.framework.Assert.assertEquals;
+
import android.net.NetworkCapabilities;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -13,8 +14,6 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
-import static junit.framework.Assert.assertEquals;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index c24336d3cbff..bcbba8b163af 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -15,11 +15,16 @@
*/
package com.android.systemui.statusbar.policy;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.mock;
+
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.os.Looper;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo;
@@ -42,11 +47,6 @@ import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertFalse;
-import static org.mockito.Mockito.mock;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
index 8b8e3f195d40..fea3a08663e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputQuickSettingsDisablerTest.java
@@ -24,9 +24,10 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.content.res.Configuration;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.ConfigurationController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index 568ff55f6d34..8bf1606d5b7b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -26,7 +26,6 @@ import android.content.pm.ShortcutManager;
import android.os.Handler;
import android.os.Process;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
@@ -35,6 +34,8 @@ import android.view.inputmethod.InputConnection;
import android.widget.EditText;
import android.widget.ImageButton;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
index 3ac42de911a9..854cc2fad8e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java
@@ -23,11 +23,9 @@ import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -37,30 +35,28 @@ import android.content.pm.StringParceledListSlice;
import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
-import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Handler;
import android.os.Looper;
import android.os.UserManager;
import android.security.IKeyChainService;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.systemui.statusbar.policy.SecurityController.SecurityControllerCallback;
-import com.android.systemui.SysuiTestCase;
+import androidx.test.runner.AndroidJUnit4;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.List;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.SecurityController.SecurityControllerCallback;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index 60b0d61558e8..0ce1df3d19f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -37,7 +37,6 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
@@ -45,6 +44,8 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
index 8f5f0729c3b3..47e449212fa5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
@@ -27,10 +27,11 @@ import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.service.notification.ZenModeConfig;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.ZenModeController.Callback;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java b/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
index 1e27915c1bb2..683397e4190e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
@@ -20,14 +20,14 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
-import android.support.test.filters.SmallTest;
import android.testing.LeakCheck.Tracker;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java
index 77df7919ed29..4a9b1b3c4006 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java
@@ -25,9 +25,10 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.shared.plugins.PluginManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
index 0d398bef4233..f1c9980f12c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
@@ -15,22 +15,19 @@
package com.android.systemui.util;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
-import android.net.Uri;
import android.provider.Settings;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.ArraySet;
+
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.NotificationChannels;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/LifecycleFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/LifecycleFragmentTest.java
index d4e38d8ea2f3..0e1c560c918b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/LifecycleFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/LifecycleFragmentTest.java
@@ -27,12 +27,12 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import androidx.lifecycle.LifecycleEventObserver;
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiBaseFragmentTest;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java
index d63bbe6326f3..ce8085aa4862 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/SysuiLifecycleTest.java
@@ -29,7 +29,6 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -38,6 +37,7 @@ import android.view.View;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
index c095472e0c62..bcc20c2d1b37 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
@@ -24,11 +24,12 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
index 11bb398501de..c68c9206a2d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
@@ -17,8 +17,8 @@
package com.android.systemui.util.leak;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
@@ -28,8 +28,6 @@ import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.io.FileDescriptor;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
index 6711ce8afa35..abec80eef3f9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
@@ -24,8 +24,9 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.app.NotificationManager;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
index b8a3e39f665c..726187d12e3c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
@@ -18,8 +18,8 @@ package com.android.systemui.util.leak;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
index ce6212ef5aae..2b28e2f590ec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
@@ -20,8 +20,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/KeepAwakeAnimationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/KeepAwakeAnimationListenerTest.java
index 0792a05ce6bc..20dcbb73c212 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/KeepAwakeAnimationListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/KeepAwakeAnimationListenerTest.java
@@ -22,10 +22,11 @@ import static org.mockito.Mockito.verify;
import android.animation.Animator;
import android.os.Looper;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.Assert;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
index f739fe61508a..d0eaaf5cfc7a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
@@ -21,8 +21,8 @@ import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
index 4425def5c21e..66eb29964116 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.PowerManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java
index 6b20a1e0b937..fb82b8fed76c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java
@@ -16,7 +16,8 @@
package com.android.systemui.volume;
import android.media.MediaMetadata;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
index a4ed45997d2a..f4d0854b2c9f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java
@@ -25,7 +25,9 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.media.AudioManager;
import android.media.session.MediaSession;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.StatusBar;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
index 5f02fad06b50..617c17e48452 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java
@@ -16,37 +16,26 @@
package com.android.systemui.volume;
-import static android.media.AudioManager.RINGER_MODE_NORMAL;
-import static android.media.AudioManager.RINGER_MODE_SILENT;
-import static android.media.AudioManager.RINGER_MODE_VIBRATE;
-import static android.media.AudioManager.STREAM_RING;
-
-import static com.android.systemui.volume.Events.DISMISS_REASON_UNKNOWN;
-import static com.android.systemui.volume.Events.SHOW_REASON_UNKNOWN;
import static com.android.systemui.volume.VolumeDialogControllerImpl.STREAMS;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import android.app.KeyguardManager;
import android.media.AudioManager;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import android.text.TextUtils;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
-import android.widget.ImageView;
-import com.android.systemui.R;
+import androidx.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.VolumeDialogController.State;
diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto
index 365c6b4d16ee..0a6e92371d6a 100644
--- a/proto/src/metrics_constants/metrics_constants.proto
+++ b/proto/src/metrics_constants/metrics_constants.proto
@@ -253,6 +253,13 @@ message MetricsEvent {
MANAGED_PROFILE = 2;
}
+ // Subtypes for showing direct sharing targets
+ enum DirectShareTargetPreviousState {
+ PREVIOUSLY_UNKNOWN = 0;
+ PREVIOUSLY_HIDDEN = 1;
+ PREVIOUSLY_VISIBLE = 2;
+ }
+
// Known visual elements: views or controls.
enum View {
// Unknown view
@@ -7065,6 +7072,12 @@ message MetricsEvent {
ACTION_ATCHNUC = 1681;
+ // OPEN: Accessibility detail settings (android.settings.ACCESSIBILITY_DETAILS_SETTINGS intent)
+ ACCESSIBILITY_DETAILS_SETTINGS = 1682;
+
+ // Open: Settings will show the conditional when Grayscale mode is on
+ SETTINGS_CONDITION_GRAYSCALE_MODE = 1683;
+
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index 2214ac54c3e4..f106ced8e484 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -660,6 +660,26 @@ message ConnectionEvent {
HLF_UNWANTED = 4;
}
+ // Level 2 failure reason.
+ enum Level2FailureReason {
+
+ // Unknown default
+ FAILURE_REASON_UNKNOWN = 0;
+
+ // The reason code if there is no error during authentication. It could
+ // also imply that there no authentication in progress.
+ AUTH_FAILURE_NONE = 1;
+
+ // The reason code if there was a timeout authenticating.
+ AUTH_FAILURE_TIMEOUT = 2;
+
+ // The reason code if there was a wrong password while authenticating.
+ AUTH_FAILURE_WRONG_PSWD = 3;
+
+ // The reason code if there was EAP failure while authenticating.
+ AUTH_FAILURE_EAP_FAILURE = 4;
+ }
+
// Entity that recommended connecting to this network.
enum ConnectionNominator {
// Unknown nominator
@@ -728,6 +748,10 @@ message ConnectionEvent {
// The currently running network selector when this connection event occurred.
optional int32 network_selector_experiment_id = 12;
+
+ // Breakdown of level_2_failure_code with more detailed reason.
+ optional Level2FailureReason level_2_failure_reason = 13
+ [default = FAILURE_REASON_UNKNOWN];
}
// Number of occurrences of a specific RSSI poll rssi value
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 9dc673b848e5..d2c39eaeafb7 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -5631,6 +5631,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
public void handleUpdateLinkProperties(NetworkAgentInfo nai, LinkProperties newLp) {
+ ensureRunningOnConnectivityServiceThread();
+
if (getNetworkAgentInfoForNetId(nai.network.netId) != nai) {
// Ignore updates for disconnected networks
return;
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index d7cc19b6dbd4..18e990676fbc 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -22,6 +22,7 @@ import static android.location.LocationManager.GPS_PROVIDER;
import static android.location.LocationManager.NETWORK_PROVIDER;
import static android.location.LocationManager.PASSIVE_PROVIDER;
import static android.location.LocationProvider.AVAILABLE;
+import static android.os.PowerManager.locationPowerSaveModeToString;
import static android.provider.Settings.Global.LOCATION_DISABLE_STATUS_CALLBACKS;
import static com.android.internal.util.Preconditions.checkNotNull;
@@ -69,6 +70,8 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.os.PowerManager;
+import android.os.PowerManager.ServiceType;
+import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -254,6 +257,10 @@ public class LocationManagerService extends ILocationManager.Stub {
@GuardedBy("mLock")
private boolean mGnssBatchingInProgress = false;
+ @GuardedBy("mLock")
+ @PowerManager.LocationPowerSaveMode
+ private int mBatterySaverMode;
+
public LocationManagerService(Context context) {
super();
mContext = context;
@@ -376,6 +383,14 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
}, UserHandle.USER_ALL);
+ PowerManagerInternal localPowerManager =
+ LocalServices.getService(PowerManagerInternal.class);
+ localPowerManager.registerLowPowerModeObserver(ServiceType.LOCATION,
+ state -> {
+ synchronized (mLock) {
+ onBatterySaverModeChangedLocked(state.locationMode);
+ }
+ });
new PackageMonitor() {
@Override
@@ -390,17 +405,29 @@ public class LocationManagerService extends ILocationManager.Stub {
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
intentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
+ intentFilter.addAction(Intent.ACTION_SCREEN_ON);
mContext.registerReceiverAsUser(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
synchronized (mLock) {
- String action = intent.getAction();
- if (Intent.ACTION_USER_SWITCHED.equals(action)) {
- onUserChangedLocked(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
- } else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
- || Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
- onUserProfilesChangedLocked();
+ switch (action) {
+ case Intent.ACTION_USER_SWITCHED:
+ onUserChangedLocked(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
+ break;
+ case Intent.ACTION_MANAGED_PROFILE_ADDED:
+ case Intent.ACTION_MANAGED_PROFILE_REMOVED:
+ onUserProfilesChangedLocked();
+ break;
+ case Intent.ACTION_SCREEN_ON:
+ case Intent.ACTION_SCREEN_OFF:
+ onScreenStateChangedLocked();
+ break;
}
}
}
@@ -415,6 +442,7 @@ public class LocationManagerService extends ILocationManager.Stub {
// initialize in-memory settings values
onBackgroundThrottleWhitelistChangedLocked();
onIgnoreSettingsWhitelistChangedLocked();
+ onBatterySaverModeChangedLocked(mPowerManager.getLocationPowerSaveMode());
}
@GuardedBy("mLock")
@@ -435,6 +463,34 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@GuardedBy("mLock")
+ private void onBatterySaverModeChangedLocked(int newLocationMode) {
+ if (D) {
+ Slog.d(TAG,
+ "Battery Saver location mode changed from "
+ + locationPowerSaveModeToString(mBatterySaverMode) + " to "
+ + locationPowerSaveModeToString(newLocationMode));
+ }
+
+ if (mBatterySaverMode == newLocationMode) {
+ return;
+ }
+
+ mBatterySaverMode = newLocationMode;
+ for (LocationProvider p : mProviders) {
+ applyRequirementsLocked(p);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void onScreenStateChangedLocked() {
+ if (mBatterySaverMode == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF) {
+ for (LocationProvider p : mProviders) {
+ applyRequirementsLocked(p);
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
private void onLocationModeChangedLocked(boolean broadcast) {
if (D) {
Log.d(TAG, "location enabled is now " + isLocationEnabled());
@@ -1194,6 +1250,8 @@ public class LocationManagerService extends ILocationManager.Stub {
private class MockLocationProvider extends LocationProvider {
+ private ProviderRequest mCurrentRequest;
+
private MockLocationProvider(String name) {
super(name);
}
@@ -1232,6 +1290,13 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
+ @Override
+ @GuardedBy("mLock")
+ public void setRequestLocked(ProviderRequest request, WorkSource workSource) {
+ super.setRequestLocked(request, workSource);
+ mCurrentRequest = request;
+ }
+
@GuardedBy("mLock")
public void setStatusLocked(int status, Bundle extras, long updateTime) {
if (mProvider != null) {
@@ -2044,8 +2109,11 @@ public class LocationManagerService extends ILocationManager.Stub {
}
final boolean isForegroundOnlyMode =
- mPowerManager.getLocationPowerSaveMode()
- == PowerManager.LOCATION_MODE_FOREGROUND_ONLY;
+ mBatterySaverMode == PowerManager.LOCATION_MODE_FOREGROUND_ONLY;
+ final boolean shouldThrottleRequests =
+ mBatterySaverMode
+ == PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF
+ && !mPowerManager.isInteractive();
// initialize the low power mode to true and set to false if any of the records requires
providerRequest.lowPowerMode = true;
for (UpdateRecord record : records) {
@@ -2060,8 +2128,8 @@ public class LocationManagerService extends ILocationManager.Stub {
record.mReceiver.mAllowedResolutionLevel)) {
continue;
}
- final boolean isBatterySaverDisablingLocation =
- isForegroundOnlyMode && !record.mIsForegroundUid;
+ final boolean isBatterySaverDisablingLocation = shouldThrottleRequests
+ || (isForegroundOnlyMode && !record.mIsForegroundUid);
if (!provider.isUseableLocked() || isBatterySaverDisablingLocation) {
if (isSettingsExemptLocked(record)) {
providerRequest.locationSettingsIgnored = true;
@@ -3415,6 +3483,32 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
+ @NonNull
+ public List<LocationRequest> getTestProviderCurrentRequests(String providerName,
+ String opPackageName) {
+ if (!canCallerAccessMockLocation(opPackageName)) {
+ return Collections.emptyList();
+ }
+
+ synchronized (mLock) {
+ LocationProvider testProvider = getLocationProviderLocked(providerName);
+ if (testProvider == null || !testProvider.isMock()) {
+ throw new IllegalArgumentException("Provider \"" + providerName + "\" unknown");
+ }
+
+ MockLocationProvider provider = (MockLocationProvider) testProvider;
+ if (provider.mCurrentRequest == null) {
+ return Collections.emptyList();
+ }
+ List<LocationRequest> requests = new ArrayList<>();
+ for (LocationRequest request : provider.mCurrentRequest.locationRequests) {
+ requests.add(new LocationRequest(request));
+ }
+ return requests;
+ }
+ }
+
+ @Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
@@ -3429,6 +3523,8 @@ public class LocationManagerService extends ILocationManager.Stub {
pw.println(" Current user: " + mCurrentUserId + " " + Arrays.toString(
mCurrentUserProfiles));
pw.println(" Location mode: " + isLocationEnabled());
+ pw.println(" Battery Saver Location Mode: "
+ + locationPowerSaveModeToString(mBatterySaverMode));
pw.println(" Location Listeners:");
for (Receiver receiver : mReceivers.values()) {
pw.println(" " + receiver);
diff --git a/services/core/java/com/android/server/LooperStatsService.java b/services/core/java/com/android/server/LooperStatsService.java
index b423f62e9b6c..965b64bd9853 100644
--- a/services/core/java/com/android/server/LooperStatsService.java
+++ b/services/core/java/com/android/server/LooperStatsService.java
@@ -55,7 +55,7 @@ public class LooperStatsService extends Binder {
private static final String DEBUG_SYS_LOOPER_STATS_ENABLED =
"debug.sys.looper_stats_enabled";
private static final int DEFAULT_SAMPLING_INTERVAL = 1000;
- private static final int DEFAULT_ENTRIES_SIZE_CAP = 2000;
+ private static final int DEFAULT_ENTRIES_SIZE_CAP = 1500;
private static final boolean DEFAULT_ENABLED = true;
private static final boolean DEFAULT_TRACK_SCREEN_INTERACTIVE = false;
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index c8e8ef862f84..e28d484eebc7 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1727,7 +1727,8 @@ class StorageManagerService extends IStorageManager.Stub
final List<AppOpsManager.PackageOps> pkgs = manager.getOpsForPackage(uid, packageName, ops);
for (AppOpsManager.PackageOps pkg : CollectionUtils.emptyIfNull(pkgs)) {
for (AppOpsManager.OpEntry op : CollectionUtils.emptyIfNull(pkg.getOps())) {
- maxTime = Math.max(maxTime, op.getLastAccessTime());
+ maxTime = Math.max(maxTime, op.getLastAccessTime(
+ AppOpsManager.OP_FLAGS_ALL_TRUSTED));
}
}
return maxTime;
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 545baa02150c..5cca159192e6 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -594,8 +594,9 @@ public class VibratorService extends IVibratorService.Stub
if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
> ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
&& !vib.isNotification() && !vib.isRingtone()) {
- Slog.e(TAG, "Ignoring incoming vibration as process with uid = "
- + uid + " is background");
+ Slog.e(TAG, "Ignoring incoming vibration as process with"
+ + " uid = " + uid + " is background,"
+ + " usage = " + AudioAttributes.usageToString(vib.usageHint));
return;
}
linkVibration(vib);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 346492fccc21..85ec2dd55e89 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2211,7 +2211,7 @@ public final class ActiveServices {
return new ServiceLookupResult(null, r.permission);
} else if (r.permission != null && callingPackage != null) {
final int opCode = AppOpsManager.permissionToOpCode(r.permission);
- if (opCode != AppOpsManager.OP_NONE && mAm.mAppOpsService.noteOperation(
+ if (opCode != AppOpsManager.OP_NONE && mAm.mAppOpsService.checkOperation(
opCode, callingUid, callingPackage) != AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: Accessing service " + r.shortInstanceName
+ " from pid=" + callingPid
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 30798a87a060..399b818659a4 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -1783,7 +1783,7 @@ public final class ProcessList {
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, app.info.packageName,
- packageNames, sandboxId, /*useBlastulaPool=*/ false,
+ packageNames, sandboxId, /*useUnspecializedAppProcessPool=*/ false,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else {
startResult = Process.start(entryPoint,
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 894a704c5bba..5da1ce610079 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -78,11 +78,11 @@ public class SettingsToPropertiesMapper {
// permission in the corresponding .te file your feature belongs to.
@VisibleForTesting
static final String[] sDeviceConfigScopes = new String[] {
- DeviceConfig.ActivityManagerNativeBoot.NAMESPACE,
- DeviceConfig.MediaNative.NAMESPACE,
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT,
DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
+ DeviceConfig.NAMESPACE_MEDIA_NATIVE,
DeviceConfig.NAMESPACE_NETD_NATIVE,
- DeviceConfig.RuntimeNativeBoot.NAMESPACE,
+ DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT,
DeviceConfig.RuntimeNative.NAMESPACE,
};
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 70c28a854512..ba7288e6d15f 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -16,6 +16,9 @@
package com.android.server.appop;
+import static android.app.AppOpsManager.MAX_PRIORITY_UID_STATE;
+import static android.app.AppOpsManager.MIN_PRIORITY_UID_STATE;
+import static android.app.AppOpsManager.OP_FLAGS_ALL;
import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.OP_PLAY_AUDIO;
import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
@@ -23,12 +26,12 @@ import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION;
-import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED;
+import static android.app.AppOpsManager.UID_STATE_MAX_LAST_NON_RESTRICTED;
import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
import static android.app.AppOpsManager.UID_STATE_TOP;
-import static android.app.AppOpsManager._NUM_UID_STATE;
import static android.app.AppOpsManager.modeToName;
import static android.app.AppOpsManager.opToName;
+import static android.app.AppOpsManager.resolveFirstUnrestrictedUidState;
import android.Manifest;
import android.annotation.NonNull;
@@ -39,6 +42,9 @@ import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.AppOpsManager.HistoricalOps;
import android.app.AppOpsManager.HistoricalOpsRequest;
+import android.app.AppOpsManager.Mode;
+import android.app.AppOpsManager.OpEntry;
+import android.app.AppOpsManager.OpFlags;
import android.app.AppOpsManagerInternal;
import android.app.AppOpsManagerInternal.CheckOpsDelegate;
import android.content.BroadcastReceiver;
@@ -76,6 +82,8 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.KeyValueListParser;
+import android.util.LongSparseArray;
+import android.util.LongSparseLongArray;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -164,36 +172,6 @@ public class AppOpsService extends IAppOpsService.Stub {
UID_STATE_CACHED, // ActivityManager.PROCESS_STATE_NONEXISTENT
};
- static final String[] UID_STATE_NAMES = new String[] {
- "pers ", // UID_STATE_PERSISTENT
- "top ", // UID_STATE_TOP
- "fgsvcl", // UID_STATE_FOREGROUND_SERVICE_LOCATION
- "fgsvc", // UID_STATE_FOREGROUND_SERVICE
- "fg ", // UID_STATE_FOREGROUND
- "bg ", // UID_STATE_BACKGROUND
- "cch ", // UID_STATE_CACHED
- };
-
- static final String[] UID_STATE_TIME_ATTRS = new String[] {
- "tp", // UID_STATE_PERSISTENT
- "tt", // UID_STATE_TOP
- "tfsl", // UID_STATE_FOREGROUND_SERVICE_LOCATION
- "tfs", // UID_STATE_FOREGROUND_SERVICE
- "tf", // UID_STATE_FOREGROUND
- "tb", // UID_STATE_BACKGROUND
- "tc", // UID_STATE_CACHED
- };
-
- static final String[] UID_STATE_REJECT_ATTRS = new String[] {
- "rp", // UID_STATE_PERSISTENT
- "rt", // UID_STATE_TOP
- "rfsl", // UID_STATE_FOREGROUND_SERVICE_LOCATION
- "rfs", // UID_STATE_FOREGROUND_SERVICE
- "rf", // UID_STATE_FOREGROUND
- "rb", // UID_STATE_BACKGROUND
- "rc", // UID_STATE_CACHED
- };
-
Context mContext;
final AtomicFile mFile;
final Handler mHandler;
@@ -355,12 +333,14 @@ public class AppOpsService extends IAppOpsService.Stub {
public boolean isDefault() {
return (pkgOps == null || pkgOps.isEmpty())
- && (opModes == null || opModes.size() <= 0);
+ && (opModes == null || opModes.size() <= 0)
+ && (state == UID_STATE_CACHED
+ && (pendingState == UID_STATE_CACHED));
}
- int evalMode(int mode) {
+ int evalMode(int op, int mode) {
if (mode == AppOpsManager.MODE_FOREGROUND) {
- return state <= UID_STATE_LAST_NON_RESTRICTED
+ return state <= AppOpsManager.resolveLastRestrictedUidState(op)
? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED;
}
return mode;
@@ -425,41 +405,121 @@ public class AppOpsService extends IAppOpsService.Stub {
}
final static class Op {
+ int op;
+ boolean running;
final UidState uidState;
- final int uid;
- final String packageName;
- final int op;
- int proxyUid = -1;
- String proxyPackageName;
- int mode;
- int duration;
- long time[] = new long[_NUM_UID_STATE];
- long rejectTime[] = new long[_NUM_UID_STATE];
+ final @NonNull String packageName;
+
+ private @Mode int mode;
+ private @Nullable LongSparseLongArray mAccessTimes;
+ private @Nullable LongSparseLongArray mRejectTimes;
+ private @Nullable LongSparseLongArray mDurations;
+ private @Nullable LongSparseLongArray mProxyUids;
+ private @Nullable LongSparseArray<String> mProxyPackageNames;
+
int startNesting;
long startRealtime;
- Op(UidState _uidState, String _packageName, int _op) {
- uidState = _uidState;
- uid = _uidState.uid;
- packageName = _packageName;
- op = _op;
- mode = AppOpsManager.opToDefaultMode(op);
+ Op(UidState uidState, String packageName, int op) {
+ this.op = op;
+ this.uidState = uidState;
+ this.packageName = packageName;
+ this.mode = AppOpsManager.opToDefaultMode(op);
}
- boolean hasAnyTime() {
- for (int i = 0; i < AppOpsManager._NUM_UID_STATE; i++) {
- if (time[i] != 0) {
- return true;
- }
- if (rejectTime[i] != 0) {
- return true;
- }
+ int getMode() {
+ return mode;
+ }
+
+ int evalMode() {
+ return uidState.evalMode(op, mode);
+ }
+
+ /** @hide */
+ public void accessed(long time, int proxyUid, @Nullable String proxyPackageName,
+ @AppOpsManager.UidState int uidState, @OpFlags int flags) {
+ final long key = AppOpsManager.makeKey(uidState, flags);
+ if (mAccessTimes == null) {
+ mAccessTimes = new LongSparseLongArray();
+ }
+ mAccessTimes.put(key, time);
+ updateProxyState(key, proxyUid, proxyPackageName);
+ if (mDurations != null) {
+ mDurations.delete(key);
}
- return false;
}
- int getMode() {
- return uidState.evalMode(mode);
+ /** @hide */
+ public void rejected(long time, int proxyUid, @Nullable String proxyPackageName,
+ @AppOpsManager.UidState int uidState, @OpFlags int flags) {
+ final long key = AppOpsManager.makeKey(uidState, flags);
+ if (mRejectTimes == null) {
+ mRejectTimes = new LongSparseLongArray();
+ }
+ mRejectTimes.put(key, time);
+ updateProxyState(key, proxyUid, proxyPackageName);
+ if (mDurations != null) {
+ mDurations.delete(key);
+ }
+ }
+
+ /** @hide */
+ public void started(long time, @AppOpsManager.UidState int uidState, @OpFlags int flags) {
+ updateAccessTimeAndDuration(time, -1 /*duration*/, uidState, flags);
+ running = true;
+ }
+
+ /** @hide */
+ public void finished(long time, long duration, @AppOpsManager.UidState int uidState,
+ @OpFlags int flags) {
+ updateAccessTimeAndDuration(time, duration, uidState, flags);
+ running = false;
+ }
+
+ /** @hide */
+ public void running(long time, long duration, @AppOpsManager.UidState int uidState,
+ @OpFlags int flags) {
+ updateAccessTimeAndDuration(time, duration, uidState, flags);
+ }
+
+ /** @hide */
+ public void continuing(long duration, @AppOpsManager.UidState int uidState,
+ @OpFlags int flags) {
+ final long key = AppOpsManager.makeKey(uidState, flags);
+ if (mDurations == null) {
+ mDurations = new LongSparseLongArray();
+ }
+ mDurations.put(key, duration);
+ }
+
+ private void updateAccessTimeAndDuration(long time, long duration,
+ @AppOpsManager.UidState int uidState, @OpFlags int flags) {
+ final long key = AppOpsManager.makeKey(uidState, flags);
+ if (mAccessTimes == null) {
+ mAccessTimes = new LongSparseLongArray();
+ }
+ mAccessTimes.put(key, time);
+ if (mDurations == null) {
+ mDurations = new LongSparseLongArray();
+ }
+ mDurations.put(key, duration);
+ }
+
+ private void updateProxyState(long key, int proxyUid,
+ @Nullable String proxyPackageName) {
+ if (mProxyUids == null) {
+ mProxyUids = new LongSparseLongArray();
+ }
+ mProxyUids.put(key, proxyUid);
+ if (mProxyPackageNames == null) {
+ mProxyPackageNames = new LongSparseArray<>();
+ }
+ mProxyPackageNames.put(key, proxyPackageName);
+ }
+
+ boolean hasAnyTime() {
+ return (mAccessTimes != null && mAccessTimes.size() > 0)
+ || (mRejectTimes != null && mRejectTimes.size() > 0);
}
}
@@ -812,7 +872,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final int opCount = client.mStartedOps.size();
for (int j = opCount - 1; j >= 0; j--) {
final Op op = client.mStartedOps.get(j);
- if (uid == op.uid && packageName.equals(op.packageName)) {
+ if (uid == op.uidState.uid && packageName.equals(op.packageName)) {
finishOperationLocked(op, /*finishNested*/ true);
client.mStartedOps.remove(j);
if (op.startNesting <= 0) {
@@ -829,9 +889,9 @@ public class AppOpsService extends IAppOpsService.Stub {
final int opCount = ops.size();
for (int i = 0; i < opCount; i++) {
final Op op = ops.valueAt(i);
- if (op.duration == -1) {
+ if (op.running) {
scheduleOpActiveChangedIfNeededLocked(
- op.op, op.uid, op.packageName, false);
+ op.op, op.uidState.uid, op.packageName, false);
}
}
}
@@ -854,7 +914,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (uidState != null && uidState.pendingState != newState) {
final int oldPendingState = uidState.pendingState;
uidState.pendingState = newState;
- if (newState < uidState.state || newState <= UID_STATE_LAST_NON_RESTRICTED) {
+ if (newState < uidState.state || newState <= UID_STATE_MAX_LAST_NON_RESTRICTED) {
// We are moving to a more important state, or the new state is in the
// foreground, then always do it immediately.
commitUidPendingStateLocked(uidState);
@@ -880,8 +940,18 @@ public class AppOpsService extends IAppOpsService.Stub {
for (int j = ops.size() - 1; j >= 0; j--) {
final Op op = ops.valueAt(j);
if (op.startNesting > 0) {
- op.time[oldPendingState] = now;
- op.time[newState] = now;
+ final long duration = SystemClock.elapsedRealtime()
+ - op.startRealtime;
+ // We don't support proxy long running ops (start/stop)
+ mHistoricalRegistry.increaseOpAccessDuration(op.op,
+ op.uidState.uid, op.packageName, oldPendingState,
+ AppOpsManager.OP_FLAG_SELF, duration);
+ // Finish the op in the old state
+ op.finished(now, duration, oldPendingState,
+ AppOpsManager.OP_FLAG_SELF);
+ // Start the op in the new state
+ op.startRealtime = now;
+ op.started(now, newState, AppOpsManager.OP_FLAG_SELF);
}
}
}
@@ -911,13 +981,7 @@ public class AppOpsService extends IAppOpsService.Stub {
resOps = new ArrayList<>();
for (int j=0; j<pkgOps.size(); j++) {
Op curOp = pkgOps.valueAt(j);
- final boolean running = curOp.duration == -1;
- long duration = running
- ? (elapsedNow - curOp.startRealtime)
- : curOp.duration;
- resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time,
- curOp.rejectTime, (int) duration, running, curOp.proxyUid,
- curOp.proxyPackageName));
+ resOps.add(getOpEntryForResult(curOp, elapsedNow));
}
} else {
for (int j=0; j<ops.length; j++) {
@@ -926,13 +990,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (resOps == null) {
resOps = new ArrayList<>();
}
- final boolean running = curOp.duration == -1;
- final long duration = running
- ? (elapsedNow - curOp.startRealtime)
- : curOp.duration;
- resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time,
- curOp.rejectTime, (int) duration, running, curOp.proxyUid,
- curOp.proxyPackageName));
+ resOps.add(getOpEntryForResult(curOp, elapsedNow));
}
}
}
@@ -947,8 +1005,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (ops == null) {
resOps = new ArrayList<>();
for (int j=0; j<uidOps.size(); j++) {
- resOps.add(new AppOpsManager.OpEntry(uidOps.keyAt(j), uidOps.valueAt(j),
- 0, 0, 0, -1, null));
+ resOps.add(new OpEntry(uidOps.keyAt(j), uidOps.valueAt(j)));
}
} else {
for (int j=0; j<ops.length; j++) {
@@ -957,14 +1014,27 @@ public class AppOpsService extends IAppOpsService.Stub {
if (resOps == null) {
resOps = new ArrayList<>();
}
- resOps.add(new AppOpsManager.OpEntry(uidOps.keyAt(index), uidOps.valueAt(index),
- 0, 0, 0, -1, null));
+ resOps.add(new OpEntry(uidOps.keyAt(j), uidOps.valueAt(j)));
}
}
}
return resOps;
}
+ private static @NonNull OpEntry getOpEntryForResult(@NonNull Op op, long elapsedNow) {
+ if (op.running) {
+ op.continuing(elapsedNow - op.startRealtime,
+ op.uidState.state, AppOpsManager.OP_FLAG_SELF);
+ }
+ final OpEntry entry = new OpEntry(op.op, op.running, op.mode,
+ op.mAccessTimes != null ? op.mAccessTimes.clone() : null,
+ op.mRejectTimes != null ? op.mRejectTimes.clone() : null,
+ op.mDurations != null ? op.mDurations.clone() : null,
+ op.mProxyUids != null ? op.mProxyUids.clone() : null,
+ op.mProxyPackageNames != null ? op.mProxyPackageNames.clone() : null);
+ return entry;
+ }
+
@Override
public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
@@ -1026,13 +1096,14 @@ public class AppOpsService extends IAppOpsService.Stub {
@Override
public void getHistoricalOps(int uid, @NonNull String packageName,
@Nullable List<String> opNames, long beginTimeMillis, long endTimeMillis,
- @NonNull RemoteCallback callback) {
+ @OpFlags int flags, @NonNull RemoteCallback callback) {
// Use the builder to validate arguments.
- final HistoricalOpsRequest request = new HistoricalOpsRequest.Builder(
+ new HistoricalOpsRequest.Builder(
beginTimeMillis, endTimeMillis)
.setUid(uid)
.setPackageName(packageName)
.setOpNames(opNames)
+ .setFlags(flags)
.build();
Preconditions.checkNotNull(callback, "callback cannot be null");
@@ -1041,79 +1112,23 @@ public class AppOpsService extends IAppOpsService.Stub {
final String[] opNamesArray = (opNames != null)
? opNames.toArray(new String[opNames.size()]) : null;
- if (mHistoricalRegistry.getMode() == AppOpsManager.HISTORICAL_MODE_DISABLED) {
- // TODO (bug:122218838): Remove once the feature fully enabled.
- getHistoricalPackagesOpsCompat(uid, packageName, opNamesArray, beginTimeMillis,
- endTimeMillis, callback);
- } else {
- // Must not hold the appops lock
- mHistoricalRegistry.getHistoricalOps(uid, packageName, opNamesArray,
- beginTimeMillis, endTimeMillis, callback);
- }
- }
- private void getHistoricalPackagesOpsCompat(int uid, @NonNull String packageName,
- @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
- @NonNull RemoteCallback callback) {
- synchronized (AppOpsService.this) {
- final HistoricalOps ops = new HistoricalOps(beginTimeMillis, endTimeMillis);
- if (opNames == null) {
- opNames = AppOpsManager.getOpStrs();
- }
- final int uidStateCount = mUidStates.size();
- for (int uidIdx = 0; uidIdx < uidStateCount; uidIdx++) {
- final UidState uidState = mUidStates.valueAt(uidIdx);
- if (uidState.pkgOps == null || uidState.pkgOps.isEmpty()
- || (uid != Process.INVALID_UID && uid != uidState.uid)) {
- continue;
- }
- final ArrayMap<String, Ops> packages = uidState.pkgOps;
- final int packageCount = packages.size();
- for (int pkgIdx = 0; pkgIdx < packageCount; pkgIdx++) {
- final Ops pkgOps = packages.valueAt(pkgIdx);
- if (packageName != null && !packageName.equals(pkgOps.packageName)) {
- continue;
- }
- final int opCount = opNames.length;
- for (int opIdx = 0; opIdx < opCount; opIdx++) {
- final String opName = opNames[opIdx];
- if (!ArrayUtils.contains(opNames, opName)) {
- continue;
- }
- final int opCode = AppOpsManager.strOpToOp(opName);
- final Op op = pkgOps.get(opCode);
- if (op == null) {
- continue;
- }
- final int stateCount = AppOpsManager._NUM_UID_STATE;
- for (int stateIdx = 0; stateIdx < stateCount; stateIdx++) {
- if (op.rejectTime[stateIdx] != 0) {
- ops.increaseRejectCount(opCode, uidState.uid,
- pkgOps.packageName, stateIdx, 1);
- } else if (op.time[stateIdx] != 0) {
- ops.increaseAccessCount(opCode, uidState.uid,
- pkgOps.packageName, stateIdx, 1);
- }
- }
- }
- }
- }
- final Bundle payload = new Bundle();
- payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, ops);
- callback.sendResult(payload);
- }
+ // Must not hold the appops lock
+ mHistoricalRegistry.getHistoricalOps(uid, packageName, opNamesArray,
+ beginTimeMillis, endTimeMillis, flags, callback);
}
@Override
public void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName,
@Nullable List<String> opNames, long beginTimeMillis, long endTimeMillis,
- @NonNull RemoteCallback callback) {
+ @OpFlags int flags, @NonNull RemoteCallback callback) {
// Use the builder to validate arguments.
- final HistoricalOpsRequest request = new HistoricalOpsRequest.Builder(
+ new HistoricalOpsRequest.Builder(
beginTimeMillis, endTimeMillis)
.setUid(uid)
.setPackageName(packageName)
.setOpNames(opNames)
+ .setFlags(flags)
.build();
Preconditions.checkNotNull(callback, "callback cannot be null");
@@ -1125,7 +1140,7 @@ public class AppOpsService extends IAppOpsService.Stub {
// Must not hold the appops lock
mHistoricalRegistry.getHistoricalOpsFromDiskRaw(uid, packageName, opNamesArray,
- beginTimeMillis, endTimeMillis, callback);
+ beginTimeMillis, endTimeMillis, flags, callback);
}
@Override
@@ -1172,7 +1187,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
- void enforceManageAppOpsModes(int callingPid, int callingUid, int targetUid) {
+ private void enforceManageAppOpsModes(int callingPid, int callingUid, int targetUid) {
if (callingPid == Process.myPid()) {
return;
}
@@ -1316,6 +1331,8 @@ public class AppOpsService extends IAppOpsService.Stub {
return;
}
+ boolean scheduleWrite = false;
+
int numPkgs = pkgOps.size();
for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
Ops ops = pkgOps.valueAt(pkgNum);
@@ -1327,14 +1344,14 @@ public class AppOpsService extends IAppOpsService.Stub {
int defaultMode = AppOpsManager.opToDefaultMode(code);
if (op.mode != defaultMode) {
- Slog.w(TAG, "resetting app-op mode for " + AppOpsManager.opToName(code) + " of "
- + pkgOps.keyAt(pkgNum));
-
op.mode = defaultMode;
-
- scheduleWriteLocked();
+ scheduleWrite = true;
}
}
+
+ if (scheduleWrite) {
+ scheduleWriteLocked();
+ }
}
}
@@ -1544,9 +1561,10 @@ public class AppOpsService extends IAppOpsService.Stub {
curOp.mode = AppOpsManager.opToDefaultMode(curOp.op);
changed = true;
uidChanged = true;
- callbacks = addCallbacks(callbacks, curOp.op, curOp.uid, packageName,
+ final int uid = curOp.uidState.uid;
+ callbacks = addCallbacks(callbacks, curOp.op, uid, packageName,
mOpModeWatchers.get(curOp.op));
- callbacks = addCallbacks(callbacks, curOp.op, curOp.uid, packageName,
+ callbacks = addCallbacks(callbacks, curOp.op, uid, packageName,
mPackageModeWatchers.get(packageName));
if (!curOp.hasAnyTime()) {
pkgOps.removeAt(j);
@@ -1727,6 +1745,7 @@ public class AppOpsService extends IAppOpsService.Stub {
private int checkOperationUnchecked(int code, int uid, String packageName,
boolean raw) {
synchronized (this) {
+ checkPackage(uid, packageName);
if (isOpRestrictedLocked(uid, code, packageName)) {
return AppOpsManager.MODE_IGNORED;
}
@@ -1735,13 +1754,13 @@ public class AppOpsService extends IAppOpsService.Stub {
if (uidState != null && uidState.opModes != null
&& uidState.opModes.indexOfKey(code) >= 0) {
final int rawMode = uidState.opModes.get(code);
- return raw ? rawMode : uidState.evalMode(rawMode);
+ return raw ? rawMode : uidState.evalMode(code, rawMode);
}
Op op = getOpLocked(code, uid, packageName, false, true, false);
if (op == null) {
return AppOpsManager.opToDefaultMode(code);
}
- return op.mode;
+ return raw ? op.mode : op.evalMode();
}
}
@@ -1855,21 +1874,32 @@ public class AppOpsService extends IAppOpsService.Stub {
String proxyPackageName, int proxiedUid, String proxiedPackageName) {
verifyIncomingUid(proxyUid);
verifyIncomingOp(code);
+
String resolveProxyPackageName = resolvePackageName(proxyUid, proxyPackageName);
if (resolveProxyPackageName == null) {
return AppOpsManager.MODE_IGNORED;
}
+
+ final boolean isProxyTrusted = mContext.checkPermission(
+ Manifest.permission.UPDATE_APP_OPS_STATS, -1, proxyUid)
+ == PackageManager.PERMISSION_GRANTED;
+
+ final int proxyFlags = isProxyTrusted ? AppOpsManager.OP_FLAG_TRUSTED_PROXY
+ : AppOpsManager.OP_FLAG_UNTRUSTED_PROXY;
final int proxyMode = noteOperationUnchecked(code, proxyUid,
- resolveProxyPackageName, -1, null);
+ resolveProxyPackageName, Process.INVALID_UID, null, proxyFlags);
if (proxyMode != AppOpsManager.MODE_ALLOWED || Binder.getCallingUid() == proxiedUid) {
return proxyMode;
}
+
String resolveProxiedPackageName = resolvePackageName(proxiedUid, proxiedPackageName);
if (resolveProxiedPackageName == null) {
return AppOpsManager.MODE_IGNORED;
}
+ final int proxiedFlags = isProxyTrusted ? AppOpsManager.OP_FLAG_TRUSTED_PROXIED
+ : AppOpsManager.OP_FLAG_UNTRUSTED_PROXIED;
return noteOperationUnchecked(code, proxiedUid, resolveProxiedPackageName,
- proxyMode, resolveProxyPackageName);
+ proxyUid, resolveProxyPackageName, proxiedFlags);
}
@Override
@@ -1892,11 +1922,12 @@ public class AppOpsService extends IAppOpsService.Stub {
if (resolvedPackageName == null) {
return AppOpsManager.MODE_IGNORED;
}
- return noteOperationUnchecked(code, uid, resolvedPackageName, 0, null);
+ return noteOperationUnchecked(code, uid, resolvedPackageName, Process.INVALID_UID, null,
+ AppOpsManager.OP_FLAG_SELF);
}
private int noteOperationUnchecked(int code, int uid, String packageName,
- int proxyUid, String proxyPackageName) {
+ int proxyUid, String proxyPackageName, @OpFlags int flags) {
synchronized (this) {
final Ops ops = getOpsRawLocked(uid, packageName, true /* edit */,
false /* uidMismatchExpected */);
@@ -1914,49 +1945,52 @@ public class AppOpsService extends IAppOpsService.Stub {
return AppOpsManager.MODE_IGNORED;
}
final UidState uidState = ops.uidState;
- if (op.duration == -1) {
+ if (op.running) {
+ final OpEntry entry = new OpEntry(op.op, op.running, op.mode, op.mAccessTimes,
+ op.mRejectTimes, op.mDurations, op.mProxyUids, op.mProxyPackageNames);
Slog.w(TAG, "Noting op not finished: uid " + uid + " pkg " + packageName
- + " code " + code + " time=" + op.time[uidState.state]
- + " duration=" + op.duration);
+ + " code " + code + " time=" + entry.getLastAccessTime(uidState.state,
+ uidState.state, flags) + " duration=" + entry.getLastDuration(
+ uidState.state, uidState.state, flags));
}
- op.duration = 0;
+
final int switchCode = AppOpsManager.opToSwitch(code);
// If there is a non-default per UID policy (we set UID op mode only if
// non-default) it takes over, otherwise use the per package policy.
if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) {
- final int uidMode = uidState.evalMode(uidState.opModes.get(switchCode));
+ final int uidMode = uidState.evalMode(code, uidState.opModes.get(switchCode));
if (uidMode != AppOpsManager.MODE_ALLOWED) {
if (DEBUG) Slog.d(TAG, "noteOperation: uid reject #" + uidMode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
- op.rejectTime[uidState.state] = System.currentTimeMillis();
+ op.rejected(System.currentTimeMillis(), proxyUid, proxyPackageName,
+ uidState.state, flags);
+ mHistoricalRegistry.incrementOpRejected(code, uid, packageName,
+ uidState.state, flags);
scheduleOpNotedIfNeededLocked(code, uid, packageName, uidMode);
- mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
- uidState.state);
return uidMode;
}
} else {
final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op;
- final int mode = switchOp.getMode();
- if (mode != AppOpsManager.MODE_ALLOWED) {
+ final int mode = switchOp.evalMode();
+ if (switchOp.mode != AppOpsManager.MODE_ALLOWED) {
if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + mode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
- op.rejectTime[uidState.state] = System.currentTimeMillis();
- scheduleOpNotedIfNeededLocked(op.op, uid, packageName, mode);
- mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
- uidState.state);
+ op.rejected(System.currentTimeMillis(), proxyUid, proxyPackageName,
+ uidState.state, flags);
+ mHistoricalRegistry.incrementOpRejected(code, uid, packageName,
+ uidState.state, flags);
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, mode);
return mode;
}
}
if (DEBUG) Slog.d(TAG, "noteOperation: allowing code " + code + " uid " + uid
+ " package " + packageName);
- op.time[uidState.state] = System.currentTimeMillis();
+ op.accessed(System.currentTimeMillis(), proxyUid, proxyPackageName,
+ uidState.state, flags);
mHistoricalRegistry.incrementOpAccessedCount(op.op, uid, packageName,
- uidState.state);
- op.rejectTime[uidState.state] = 0;
- op.proxyUid = proxyUid;
- op.proxyPackageName = proxyPackageName;
+ uidState.state, flags);
scheduleOpNotedIfNeededLocked(code, uid, packageName,
AppOpsManager.MODE_ALLOWED);
return AppOpsManager.MODE_ALLOWED;
@@ -2080,29 +2114,34 @@ public class AppOpsService extends IAppOpsService.Stub {
final UidState uidState = ops.uidState;
// If there is a non-default per UID policy (we set UID op mode only if
// non-default) it takes over, otherwise use the per package policy.
+ final int opCode = op.op;
if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) {
- final int uidMode = uidState.evalMode(uidState.opModes.get(switchCode));
+ final int uidMode = uidState.evalMode(code, uidState.opModes.get(switchCode));
if (uidMode != AppOpsManager.MODE_ALLOWED
&& (!startIfModeDefault || uidMode != AppOpsManager.MODE_DEFAULT)) {
if (DEBUG) Slog.d(TAG, "noteOperation: uid reject #" + uidMode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ resolvedPackageName);
- op.rejectTime[uidState.state] = System.currentTimeMillis();
- mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
- uidState.state);
+ // We don't support proxy long running ops (start/stop)
+ op.rejected(System.currentTimeMillis(), -1 /*proxyUid*/,
+ null /*proxyPackage*/, uidState.state, AppOpsManager.OP_FLAG_SELF);
+ mHistoricalRegistry.incrementOpRejected(opCode, uid, packageName,
+ uidState.state, AppOpsManager.OP_FLAG_SELF);
return uidMode;
}
} else {
final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op;
- final int mode = switchOp.getMode();
+ final int mode = switchOp.evalMode();
if (mode != AppOpsManager.MODE_ALLOWED
&& (!startIfModeDefault || mode != AppOpsManager.MODE_DEFAULT)) {
if (DEBUG) Slog.d(TAG, "startOperation: reject #" + mode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ resolvedPackageName);
- op.rejectTime[uidState.state] = System.currentTimeMillis();
- mHistoricalRegistry.incrementOpRejected(op.op, uid, packageName,
- uidState.state);
+ // We don't support proxy long running ops (start/stop)
+ op.rejected(System.currentTimeMillis(), -1 /*proxyUid*/,
+ null /*proxyPackage*/, uidState.state, AppOpsManager.OP_FLAG_SELF);
+ mHistoricalRegistry.incrementOpRejected(opCode, uid, packageName,
+ uidState.state, AppOpsManager.OP_FLAG_SELF);
return mode;
}
}
@@ -2110,11 +2149,12 @@ public class AppOpsService extends IAppOpsService.Stub {
+ " package " + resolvedPackageName);
if (op.startNesting == 0) {
op.startRealtime = SystemClock.elapsedRealtime();
- op.time[uidState.state] = System.currentTimeMillis();
- mHistoricalRegistry.incrementOpAccessedCount(op.op, uid, packageName,
- uidState.state);
- op.rejectTime[uidState.state] = 0;
- op.duration = -1;
+ // We don't support proxy long running ops (start/stop)
+ op.started(System.currentTimeMillis(), uidState.state,
+ AppOpsManager.OP_FLAG_SELF);
+ mHistoricalRegistry.incrementOpAccessedCount(opCode, uid, packageName,
+ uidState.state, AppOpsManager.OP_FLAG_SELF);
+
scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, true);
}
op.startNesting++;
@@ -2161,7 +2201,7 @@ public class AppOpsService extends IAppOpsService.Stub {
} finally {
Binder.restoreCallingIdentity(identity);
}
- Slog.wtf(TAG, "Operation not started: uid=" + op.uid + " pkg="
+ Slog.wtf(TAG, "Operation not started: uid=" + op.uidState.uid + " pkg="
+ op.packageName + " op=" + AppOpsManager.opToName(op.op));
return;
}
@@ -2272,16 +2312,24 @@ public class AppOpsService extends IAppOpsService.Stub {
}
void finishOperationLocked(Op op, boolean finishNested) {
+ final int opCode = op.op;
+ final int uid = op.uidState.uid;
if (op.startNesting <= 1 || finishNested) {
if (op.startNesting == 1 || finishNested) {
- op.duration = (int)(SystemClock.elapsedRealtime() - op.startRealtime);
- mHistoricalRegistry.increaseOpAccessDuration(op.op, op.uid, op.packageName,
- op.uidState.state, op.duration);
- op.time[op.uidState.state] = System.currentTimeMillis();
+ // We don't support proxy long running ops (start/stop)
+ final long duration = SystemClock.elapsedRealtime() - op.startRealtime;
+ op.finished(System.currentTimeMillis(), duration, op.uidState.state,
+ AppOpsManager.OP_FLAG_SELF);
+ mHistoricalRegistry.increaseOpAccessDuration(opCode, uid, op.packageName,
+ op.uidState.state, AppOpsManager.OP_FLAG_SELF, duration);
} else {
- Slog.w(TAG, "Finishing op nesting under-run: uid " + op.uid + " pkg "
- + op.packageName + " code " + op.op + " time=" + op.time
- + " duration=" + op.duration + " nesting=" + op.startNesting);
+ final OpEntry entry = new OpEntry(op.op, op.running, op.mode, op.mAccessTimes,
+ op.mRejectTimes, op.mDurations, op.mProxyUids, op.mProxyPackageNames);
+ Slog.w(TAG, "Finishing op nesting under-run: uid " + uid + " pkg "
+ + op.packageName + " code " + opCode + " time="
+ + entry.getLastAccessTime(OP_FLAGS_ALL)
+ + " duration=" + entry.getLastDuration(MAX_PRIORITY_UID_STATE,
+ MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL) + " nesting=" + op.startNesting);
}
if (op.startNesting >= 1) {
op.uidState.startNesting -= op.startNesting;
@@ -2311,7 +2359,7 @@ public class AppOpsService extends IAppOpsService.Stub {
throw new IllegalArgumentException("Bad operation #" + op);
}
- private UidState getUidStateLocked(int uid, boolean edit) {
+ private @NonNull UidState getUidStateLocked(int uid, boolean edit) {
UidState uidState = mUidStates.get(uid);
if (uidState == null) {
if (!edit) {
@@ -2335,8 +2383,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
private void commitUidPendingStateLocked(UidState uidState) {
- final boolean lastForeground = uidState.state <= UID_STATE_LAST_NON_RESTRICTED;
- final boolean nowForeground = uidState.pendingState <= UID_STATE_LAST_NON_RESTRICTED;
+ final boolean lastForeground = uidState.state <= UID_STATE_MAX_LAST_NON_RESTRICTED;
+ final boolean nowForeground = uidState.pendingState <= UID_STATE_MAX_LAST_NON_RESTRICTED;
uidState.state = uidState.pendingState;
uidState.pendingStateCommitTime = 0;
if (uidState.hasForegroundWatchers && lastForeground != nowForeground) {
@@ -2345,7 +2393,15 @@ public class AppOpsService extends IAppOpsService.Stub {
continue;
}
final int code = uidState.foregroundOps.keyAt(fgi);
-
+ // For location ops we consider fg state only if the fg service
+ // is of location type, for all other ops any fg service will do.
+ final long resolvedLastRestrictedUidState = resolveFirstUnrestrictedUidState(code);
+ final boolean resolvedLastFg = uidState.state <= resolvedLastRestrictedUidState;
+ final boolean resolvedNowBg = uidState.pendingState
+ <= resolvedLastRestrictedUidState;
+ if (resolvedLastFg == resolvedNowBg) {
+ continue;
+ }
final ArraySet<ModeCallback> callbacks = mOpModeWatchers.get(code);
if (callbacks != null) {
for (int cbi = callbacks.size() - 1; cbi >= 0; cbi--) {
@@ -2360,8 +2416,10 @@ public class AppOpsService extends IAppOpsService.Stub {
if (uidState.pkgOps != null) {
for (int pkgi = uidState.pkgOps.size() - 1; pkgi >= 0; pkgi--) {
final Op op = uidState.pkgOps.valueAt(pkgi).get(code);
- if (doAllPackages || (op != null
- && op.mode == AppOpsManager.MODE_FOREGROUND)) {
+ if (op == null) {
+ continue;
+ }
+ if (doAllPackages || op.mode == AppOpsManager.MODE_FOREGROUND) {
mHandler.sendMessage(PooledLambda.obtainMessage(
AppOpsService::notifyOpChanged,
this, callback, code, uidState.uid,
@@ -2651,7 +2709,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final int idx = uidState.opModes.indexOfKey(AppOpsManager.OP_RUN_IN_BACKGROUND);
if (idx >= 0) {
uidState.opModes.put(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
- uidState.opModes.valueAt(idx));
+ uidState.opModes.valueAt(idx));
}
}
if (uidState.pkgOps == null) {
@@ -2664,7 +2722,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final Op op = ops.get(AppOpsManager.OP_RUN_IN_BACKGROUND);
if (op != null && op.mode != AppOpsManager.opToDefaultMode(op.op)) {
final Op copy = new Op(op.uidState, op.packageName,
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND);
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND);
copy.mode = op.mode;
ops.put(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, copy);
changed = true;
@@ -2692,7 +2750,7 @@ public class AppOpsService extends IAppOpsService.Stub {
scheduleFastWriteLocked();
}
- void readUidOps(XmlPullParser parser) throws NumberFormatException,
+ private void readUidOps(XmlPullParser parser) throws NumberFormatException,
XmlPullParserException, IOException {
final int uid = Integer.parseInt(parser.getAttributeValue(null, "n"));
int outerDepth = parser.getDepth();
@@ -2720,8 +2778,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
- void readPackage(XmlPullParser parser) throws NumberFormatException,
- XmlPullParserException, IOException {
+ private void readPackage(XmlPullParser parser)
+ throws NumberFormatException, XmlPullParserException, IOException {
String pkgName = parser.getAttributeValue(null, "n");
int outerDepth = parser.getDepth();
int type;
@@ -2742,9 +2800,10 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
- void readUid(XmlPullParser parser, String pkgName) throws NumberFormatException,
- XmlPullParserException, IOException {
+ private void readUid(XmlPullParser parser, String pkgName)
+ throws NumberFormatException, XmlPullParserException, IOException {
int uid = Integer.parseInt(parser.getAttributeValue(null, "n"));
+ final UidState uidState = getUidStateLocked(uid, true);
String isPrivilegedString = parser.getAttributeValue(null, "p");
boolean isPrivileged = false;
if (isPrivilegedString == null) {
@@ -2774,113 +2833,73 @@ public class AppOpsService extends IAppOpsService.Stub {
if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
-
String tagName = parser.getName();
if (tagName.equals("op")) {
- UidState uidState = getUidStateLocked(uid, true);
- if (uidState.pkgOps == null) {
- uidState.pkgOps = new ArrayMap<>();
- }
+ readOp(parser, uidState, pkgName, isPrivileged);
+ } else {
+ Slog.w(TAG, "Unknown element under <pkg>: "
+ + parser.getName());
+ XmlUtils.skipCurrentTag(parser);
+ }
+ }
+ uidState.evalForegroundOps(mOpModeWatchers);
+ }
- Op op = new Op(uidState, pkgName,
- Integer.parseInt(parser.getAttributeValue(null, "n")));
-
- for (int i = parser.getAttributeCount()-1; i >= 0; i--) {
- final String name = parser.getAttributeName(i);
- final String value = parser.getAttributeValue(i);
- switch (name) {
- case "m":
- op.mode = Integer.parseInt(value);
- break;
- case "d":
- op.duration = Integer.parseInt(value);
- break;
- case "pu":
- op.proxyUid = Integer.parseInt(value);
- break;
- case "pp":
- op.proxyPackageName = value;
- break;
- case "tp":
- op.time[AppOpsManager.UID_STATE_PERSISTENT] = Long.parseLong(value);
- break;
- case "tt":
- op.time[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
- break;
- case "tfsl":
- op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION] =
- Long.parseLong(value);
- break;
- case "tfs":
- op.time[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] =
- Long.parseLong(value);
- break;
- case "tf":
- op.time[AppOpsManager.UID_STATE_FOREGROUND] = Long.parseLong(value);
- break;
- case "tb":
- op.time[AppOpsManager.UID_STATE_BACKGROUND] = Long.parseLong(value);
- break;
- case "tc":
- op.time[AppOpsManager.UID_STATE_CACHED] = Long.parseLong(value);
- break;
- case "rp":
- op.rejectTime[AppOpsManager.UID_STATE_PERSISTENT] =
- Long.parseLong(value);
- break;
- case "rt":
- op.rejectTime[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
- break;
- case "rfsl":
- op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE_LOCATION] =
- Long.parseLong(value);
- break;
- case "rfs":
- op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND_SERVICE] =
- Long.parseLong(value);
- break;
- case "rf":
- op.rejectTime[AppOpsManager.UID_STATE_FOREGROUND] =
- Long.parseLong(value);
- break;
- case "rb":
- op.rejectTime[AppOpsManager.UID_STATE_BACKGROUND] =
- Long.parseLong(value);
- break;
- case "rc":
- op.rejectTime[AppOpsManager.UID_STATE_CACHED] =
- Long.parseLong(value);
- break;
- case "t":
- // Backwards compat.
- op.time[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
- break;
- case "r":
- // Backwards compat.
- op.rejectTime[AppOpsManager.UID_STATE_TOP] = Long.parseLong(value);
- break;
- default:
- Slog.w(TAG, "Unknown attribute in 'op' tag: " + name);
- break;
- }
- }
+ private void readOp(XmlPullParser parser, @NonNull UidState uidState,
+ @NonNull String pkgName, boolean isPrivileged) throws NumberFormatException,
+ XmlPullParserException, IOException {
+ Op op = new Op(uidState, pkgName,
+ Integer.parseInt(parser.getAttributeValue(null, "n")));
+
+ final int mode = XmlUtils.readIntAttribute(parser, "m",
+ AppOpsManager.opToDefaultMode(op.op));
+ op.mode = mode;
+
+ int outerDepth = parser.getDepth();
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+ String tagName = parser.getName();
+ if (tagName.equals("st")) {
+ final long key = XmlUtils.readLongAttribute(parser, "n");
+
+ final int flags = AppOpsManager.extractFlagsFromKey(key);
+ final int state = AppOpsManager.extractUidStateFromKey(key);
- Ops ops = uidState.pkgOps.get(pkgName);
- if (ops == null) {
- ops = new Ops(pkgName, uidState, isPrivileged);
- uidState.pkgOps.put(pkgName, ops);
+ final long accessTime = XmlUtils.readLongAttribute(parser, "t", 0);
+ final long rejectTime = XmlUtils.readLongAttribute(parser, "r", 0);
+ final long accessDuration = XmlUtils.readLongAttribute(parser, "d", 0);
+ final String proxyPkg = XmlUtils.readStringAttribute(parser, "pp");
+ final int proxyUid = XmlUtils.readIntAttribute(parser, "pu", 0);
+
+ if (accessTime > 0) {
+ op.accessed(accessTime, proxyUid, proxyPkg, state, flags);
+ }
+ if (rejectTime > 0) {
+ op.rejected(rejectTime, proxyUid, proxyPkg, state, flags);
+ }
+ if (accessDuration > 0) {
+ op.running(accessTime, accessDuration, state, flags);
}
- ops.put(op.op, op);
} else {
- Slog.w(TAG, "Unknown element under <pkg>: "
+ Slog.w(TAG, "Unknown element under <op>: "
+ parser.getName());
XmlUtils.skipCurrentTag(parser);
}
}
- UidState uidState = getUidStateLocked(uid, false);
- if (uidState != null) {
- uidState.evalForegroundOps(mOpModeWatchers);
+
+ if (uidState.pkgOps == null) {
+ uidState.pkgOps = new ArrayMap<>();
+ }
+ Ops ops = uidState.pkgOps.get(pkgName);
+ if (ops == null) {
+ ops = new Ops(pkgName, uidState, isPrivileged);
+ uidState.pkgOps.put(pkgName, ops);
}
+ ops.put(op.op, op);
}
void writeState() {
@@ -2955,30 +2974,53 @@ public class AppOpsService extends IAppOpsService.Stub {
if (op.getMode() != AppOpsManager.opToDefaultMode(op.getOp())) {
out.attribute(null, "m", Integer.toString(op.getMode()));
}
- for (int k = 0; k < _NUM_UID_STATE; k++) {
- final long time = op.getLastTimeFor(k);
- if (time != 0) {
- out.attribute(null, UID_STATE_TIME_ATTRS[k],
- Long.toString(time));
+
+ final LongSparseArray keys = op.collectKeys();
+ if (keys == null || keys.size() <= 0) {
+ continue;
+ }
+
+ final int keyCount = keys.size();
+ for (int k = 0; k < keyCount; k++) {
+ final long key = keys.keyAt(k);
+
+ final int uidState = AppOpsManager.extractUidStateFromKey(key);
+ final int flags = AppOpsManager.extractFlagsFromKey(key);
+
+ final long accessTime = op.getLastAccessTime(
+ uidState, uidState, flags);
+ final long rejectTime = op.getLastRejectTime(
+ uidState, uidState, flags);
+ final long accessDuration = op.getLastDuration(
+ uidState, uidState, flags);
+ final String proxyPkg = op.getProxyPackageName(uidState, flags);
+ final int proxyUid = op.getProxyUid(uidState, flags);
+
+ if (accessTime <= 0 && rejectTime <= 0 && accessDuration <= 0
+ && proxyPkg == null && proxyUid < 0) {
+ continue;
}
- final long rejectTime = op.getLastRejectTimeFor(k);
- if (rejectTime != 0) {
- out.attribute(null, UID_STATE_REJECT_ATTRS[k],
- Long.toString(rejectTime));
+
+ out.startTag(null, "st");
+ out.attribute(null, "n", Long.toString(key));
+ if (accessTime > 0) {
+ out.attribute(null, "t", Long.toString(accessTime));
}
+ if (rejectTime > 0) {
+ out.attribute(null, "r", Long.toString(rejectTime));
+ }
+ if (accessDuration > 0) {
+ out.attribute(null, "d", Long.toString(accessDuration));
+ }
+ if (proxyPkg != null) {
+ out.attribute(null, "pp", proxyPkg);
+ }
+ if (proxyUid >= 0) {
+ out.attribute(null, "pu", Integer.toString(proxyUid));
+ }
+ out.endTag(null, "st");
}
- int dur = op.getDuration();
- if (dur != 0) {
- out.attribute(null, "d", Integer.toString(dur));
- }
- int proxyUid = op.getProxyUid();
- if (proxyUid != -1) {
- out.attribute(null, "pu", Integer.toString(proxyUid));
- }
- String proxyPackageName = op.getProxyPackageName();
- if (proxyPackageName != null) {
- out.attribute(null, "pp", proxyPackageName);
- }
+
out.endTag(null, "op");
}
out.endTag(null, "uid");
@@ -3462,32 +3504,80 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.println(" Limit output to data associated with the given package name.");
pw.println(" --watchers");
pw.println(" Only output the watcher sections.");
+ pw.println(" --history");
+ pw.println(" Output the historical data.");
}
- private void dumpTimesLocked(PrintWriter pw, String firstPrefix, String prefix, long[] times,
- long now, SimpleDateFormat sdf, Date date) {
- boolean hasTime = false;
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- if (times[i] != 0) {
- hasTime = true;
- break;
- }
- }
- if (!hasTime) {
+ private void dumpStatesLocked(@NonNull PrintWriter pw, @NonNull Op op,
+ long now, @NonNull SimpleDateFormat sdf, @NonNull Date date, @NonNull String prefix) {
+
+ final OpEntry entry = new OpEntry(op.op, op.running, op.mode, op.mAccessTimes,
+ op.mRejectTimes, op.mDurations, op.mProxyUids, op.mProxyPackageNames);
+
+ final LongSparseArray keys = entry.collectKeys();
+ if (keys == null || keys.size() <= 0) {
return;
}
- boolean first = true;
- for (int i = 0; i < _NUM_UID_STATE; i++) {
- if (times[i] != 0) {
- pw.print(first ? firstPrefix : prefix);
- first = false;
- pw.print(UID_STATE_NAMES[i]);
- pw.print(" = ");
- date.setTime(times[i]);
+
+ final int keyCount = keys.size();
+ for (int k = 0; k < keyCount; k++) {
+ final long key = keys.keyAt(k);
+
+ final int uidState = AppOpsManager.extractUidStateFromKey(key);
+ final int flags = AppOpsManager.extractFlagsFromKey(key);
+
+ final long accessTime = entry.getLastAccessTime(
+ uidState, uidState, flags);
+ final long rejectTime = entry.getLastRejectTime(
+ uidState, uidState, flags);
+ final long accessDuration = entry.getLastDuration(
+ uidState, uidState, flags);
+ final String proxyPkg = entry.getProxyPackageName(uidState, flags);
+ final int proxyUid = entry.getProxyUid(uidState, flags);
+
+ if (accessTime > 0) {
+ pw.print(prefix);
+ pw.print("Access: ");
+ pw.print(AppOpsManager.keyToString(key));
+ pw.print(" ");
+ date.setTime(accessTime);
pw.print(sdf.format(date));
pw.print(" (");
- TimeUtils.formatDuration(times[i]-now, pw);
- pw.println(")");
+ TimeUtils.formatDuration(accessTime - now, pw);
+ pw.print(")");
+ if (accessDuration > 0) {
+ pw.print(" duration=");
+ TimeUtils.formatDuration(accessDuration, pw);
+ }
+ if (proxyUid >= 0) {
+ pw.print(" proxy[");
+ pw.print("uid=");
+ pw.print(proxyUid);
+ pw.print(", pkg=");
+ pw.print(proxyPkg);
+ pw.print("]");
+ }
+ pw.println();
+ }
+
+ if (rejectTime > 0) {
+ pw.print(prefix);
+ pw.print("Reject: ");
+ pw.print(AppOpsManager.keyToString(key));
+ date.setTime(rejectTime);
+ pw.print(sdf.format(date));
+ pw.print(" (");
+ TimeUtils.formatDuration(rejectTime - now, pw);
+ pw.print(")");
+ if (proxyUid >= 0) {
+ pw.print(" proxy[");
+ pw.print("uid=");
+ pw.print(proxyUid);
+ pw.print(", pkg=");
+ pw.print(proxyPkg);
+ pw.print("]");
+ }
+ pw.println();
}
}
}
@@ -3501,6 +3591,7 @@ public class AppOpsService extends IAppOpsService.Stub {
int dumpUid = Process.INVALID_UID;
int dumpMode = -1;
boolean dumpWatchers = false;
+ boolean dumpHistory = false;
if (args != null) {
for (int i=0; i<args.length; i++) {
@@ -3550,6 +3641,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
} else if ("--watchers".equals(arg)) {
dumpWatchers = true;
+ } else if ("--history".equals(arg)) {
+ dumpHistory = true;
} else if (arg.length() > 0 && arg.charAt(0) == '-'){
pw.println("Unknown option: " + arg);
return;
@@ -3562,7 +3655,9 @@ public class AppOpsService extends IAppOpsService.Stub {
synchronized (this) {
pw.println("Current AppOps Service state:");
- mConstants.dump(pw);
+ if (!dumpHistory && !dumpWatchers) {
+ mConstants.dump(pw);
+ }
pw.println();
final long now = System.currentTimeMillis();
final long nowElapsed = SystemClock.elapsedRealtime();
@@ -3571,7 +3666,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final Date date = new Date();
boolean needSep = false;
if (dumpOp < 0 && dumpMode < 0 && dumpPackage == null && mProfileOwners != null
- && !dumpWatchers) {
+ && !dumpWatchers && !dumpHistory) {
pw.println(" Profile owners:");
for (int poi = 0; poi < mProfileOwners.size(); poi++) {
pw.print(" User #");
@@ -3582,7 +3677,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
pw.println();
}
- if (mOpModeWatchers.size() > 0) {
+ if (mOpModeWatchers.size() > 0 && !dumpHistory) {
boolean printedHeader = false;
for (int i=0; i<mOpModeWatchers.size(); i++) {
if (dumpOp >= 0 && dumpOp != mOpModeWatchers.keyAt(i)) {
@@ -3612,7 +3707,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
}
- if (mPackageModeWatchers.size() > 0 && dumpOp < 0) {
+ if (mPackageModeWatchers.size() > 0 && dumpOp < 0 && !dumpHistory) {
boolean printedHeader = false;
for (int i=0; i<mPackageModeWatchers.size(); i++) {
if (dumpPackage != null && !dumpPackage.equals(mPackageModeWatchers.keyAt(i))) {
@@ -3632,7 +3727,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
}
- if (mModeWatchers.size() > 0 && dumpOp < 0) {
+ if (mModeWatchers.size() > 0 && dumpOp < 0 && !dumpHistory) {
boolean printedHeader = false;
for (int i=0; i<mModeWatchers.size(); i++) {
final ModeCallback cb = mModeWatchers.valueAt(i);
@@ -3730,7 +3825,7 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.println(cb);
}
}
- if (mClients.size() > 0 && dumpMode < 0 && !dumpWatchers) {
+ if (mClients.size() > 0 && dumpMode < 0 && !dumpWatchers && !dumpHistory) {
needSep = true;
boolean printedHeader = false;
for (int i=0; i<mClients.size(); i++) {
@@ -3759,7 +3854,7 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.println(" Started ops:");
printedStarted = true;
}
- pw.print(" "); pw.print("uid="); pw.print(op.uid);
+ pw.print(" "); pw.print("uid="); pw.print(op.uidState.uid);
pw.print(" pkg="); pw.print(op.packageName);
pw.print(" op="); pw.println(AppOpsManager.opToName(op.op));
}
@@ -3767,7 +3862,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
if (mAudioRestrictions.size() > 0 && dumpOp < 0 && dumpPackage != null
- && dumpMode < 0 && !dumpWatchers) {
+ && dumpMode < 0 && !dumpWatchers && !dumpWatchers) {
boolean printedHeader = false;
for (int o=0; o<mAudioRestrictions.size(); o++) {
final String op = AppOpsManager.opToName(mAudioRestrictions.keyAt(o));
@@ -3800,7 +3895,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final SparseIntArray opModes = uidState.opModes;
final ArrayMap<String, Ops> pkgOps = uidState.pkgOps;
- if (dumpWatchers) {
+ if (dumpWatchers || dumpHistory) {
continue;
}
if (dumpOp >= 0 || dumpPackage != null || dumpMode >= 0) {
@@ -3847,10 +3942,10 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.print(" Uid "); UserHandle.formatUid(pw, uidState.uid); pw.println(":");
pw.print(" state=");
- pw.println(UID_STATE_NAMES[uidState.state]);
+ pw.println(AppOpsManager.getUidStateName(uidState.state));
if (uidState.state != uidState.pendingState) {
pw.print(" pendingState=");
- pw.println(UID_STATE_NAMES[uidState.pendingState]);
+ pw.println(AppOpsManager.getUidStateName(uidState.pendingState));
}
if (uidState.pendingStateCommitTime != 0) {
pw.print(" pendingStateCommitTime=");
@@ -3906,7 +4001,8 @@ public class AppOpsService extends IAppOpsService.Stub {
boolean printedPackage = false;
for (int j=0; j<ops.size(); j++) {
final Op op = ops.valueAt(j);
- if (dumpOp >= 0 && dumpOp != op.op) {
+ final int opCode = op.op;
+ if (dumpOp >= 0 && dumpOp != opCode) {
continue;
}
if (dumpMode >= 0 && dumpMode != op.mode) {
@@ -3916,32 +4012,23 @@ public class AppOpsService extends IAppOpsService.Stub {
pw.print(" Package "); pw.print(ops.packageName); pw.println(":");
printedPackage = true;
}
- pw.print(" "); pw.print(AppOpsManager.opToName(op.op));
+ pw.print(" "); pw.print(AppOpsManager.opToName(opCode));
pw.print(" ("); pw.print(AppOpsManager.modeToName(op.mode));
- final int switchOp = AppOpsManager.opToSwitch(op.op);
- if (switchOp != op.op) {
+ final int switchOp = AppOpsManager.opToSwitch(opCode);
+ if (switchOp != opCode) {
pw.print(" / switch ");
pw.print(AppOpsManager.opToName(switchOp));
final Op switchObj = ops.get(switchOp);
- int mode = switchObj != null
- ? switchObj.mode : AppOpsManager.opToDefaultMode(switchOp);
+ int mode = switchObj != null ? switchObj.mode
+ : AppOpsManager.opToDefaultMode(switchOp);
pw.print("="); pw.print(AppOpsManager.modeToName(mode));
}
pw.println("): ");
- dumpTimesLocked(pw,
- " Access: ",
- " ", op.time, now, sdf, date);
- dumpTimesLocked(pw,
- " Reject: ",
- " ", op.rejectTime, now, sdf, date);
- if (op.duration == -1) {
+ dumpStatesLocked(pw, op, now, sdf, date, " ");
+ if (op.running) {
pw.print(" Running start at: ");
TimeUtils.formatDuration(nowElapsed-op.startRealtime, pw);
pw.println();
- } else if (op.duration != 0) {
- pw.print(" duration=");
- TimeUtils.formatDuration(op.duration, pw);
- pw.println();
}
if (op.startNesting != 0) {
pw.print(" startNesting=");
@@ -3960,7 +4047,7 @@ public class AppOpsService extends IAppOpsService.Stub {
ClientRestrictionState restrictionState = mOpUserRestrictions.valueAt(i);
boolean printedTokenHeader = false;
- if (dumpMode >= 0 || dumpWatchers) {
+ if (dumpMode >= 0 || dumpWatchers || dumpHistory) {
continue;
}
@@ -4044,7 +4131,9 @@ public class AppOpsService extends IAppOpsService.Stub {
}
// Must not hold the appops lock
- mHistoricalRegistry.dump(" ", pw, dumpUid, dumpPackage, dumpOp);
+ if (dumpHistory && !dumpWatchers) {
+ mHistoricalRegistry.dump(" ", pw, dumpUid, dumpPackage, dumpOp);
+ }
}
private static final class Restriction {
@@ -4158,7 +4247,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final ClientState client = mClients.valueAt(i);
for (int j = client.mStartedOps.size() - 1; j >= 0; j--) {
final Op op = client.mStartedOps.get(j);
- if (op.op == code && op.uid == uid) return true;
+ if (op.op == code && op.uidState.uid == uid) return true;
}
}
}
diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java
index 4485a54b5cdf..280bc026a76e 100644
--- a/services/core/java/com/android/server/appop/HistoricalRegistry.java
+++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java
@@ -23,6 +23,7 @@ import android.app.AppOpsManager.HistoricalOp;
import android.app.AppOpsManager.HistoricalOps;
import android.app.AppOpsManager.HistoricalPackageOps;
import android.app.AppOpsManager.HistoricalUidOps;
+import android.app.AppOpsManager.OpFlags;
import android.app.AppOpsManager.UidState;
import android.content.ContentResolver;
import android.database.ContentObserver;
@@ -37,6 +38,7 @@ import android.os.RemoteCallback;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArraySet;
+import android.util.LongSparseArray;
import android.util.Slog;
import android.util.TimeUtils;
import android.util.Xml;
@@ -297,20 +299,20 @@ final class HistoricalRegistry {
}
}
- @Nullable void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName,
+ void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName,
@Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
- @NonNull RemoteCallback callback) {
+ @OpFlags int flags, @NonNull RemoteCallback callback) {
final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis);
mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames,
- beginTimeMillis, endTimeMillis);
+ beginTimeMillis, endTimeMillis, flags);
final Bundle payload = new Bundle();
payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result);
callback.sendResult(payload);
}
- @Nullable void getHistoricalOps(int uid, @NonNull String packageName,
+ void getHistoricalOps(int uid, @NonNull String packageName,
@Nullable String[] opNames, long beginTimeMillis, long endTimeMillis,
- @NonNull RemoteCallback callback) {
+ @OpFlags int flags, @NonNull RemoteCallback callback) {
final long currentTimeMillis = System.currentTimeMillis();
if (endTimeMillis == Long.MAX_VALUE) {
endTimeMillis = currentTimeMillis;
@@ -326,6 +328,8 @@ final class HistoricalRegistry {
synchronized (mOnDiskLock) {
final List<HistoricalOps> pendingWrites;
final HistoricalOps currentOps;
+ boolean collectOpsFromDisk;
+
synchronized (mInMemoryLock) {
currentOps = getUpdatedPendingHistoricalOpsMLocked(currentTimeMillis);
if (!(inMemoryAdjBeginTimeMillis >= currentOps.getEndTimeMillis()
@@ -338,10 +342,11 @@ final class HistoricalRegistry {
}
pendingWrites = new ArrayList<>(mPendingWrites);
mPendingWrites.clear();
+ collectOpsFromDisk = inMemoryAdjEndTimeMillis > currentOps.getEndTimeMillis();
}
// If the query was only for in-memory state - done.
- if (inMemoryAdjEndTimeMillis > currentOps.getEndTimeMillis()) {
+ if (collectOpsFromDisk) {
// If there is a write in flight we need to force it now
persistPendingHistory(pendingWrites);
// Collect persisted state.
@@ -352,7 +357,7 @@ final class HistoricalRegistry {
final long onDiskAdjEndTimeMillis = Math.max(inMemoryAdjEndTimeMillis
- onDiskAndInMemoryOffsetMillis, 0);
mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames,
- onDiskAdjBeginTimeMillis, onDiskAdjEndTimeMillis);
+ onDiskAdjBeginTimeMillis, onDiskAdjEndTimeMillis, flags);
}
// Rebase the result time to be since epoch.
@@ -366,32 +371,31 @@ final class HistoricalRegistry {
}
void incrementOpAccessedCount(int op, int uid, @NonNull String packageName,
- @UidState int uidState) {
+ @UidState int uidState, @OpFlags int flags) {
synchronized (mInMemoryLock) {
if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
- .increaseAccessCount(op, uid, packageName, uidState, 1);
-
+ .increaseAccessCount(op, uid, packageName, uidState, flags, 1);
}
}
}
void incrementOpRejected(int op, int uid, @NonNull String packageName,
- @UidState int uidState) {
+ @UidState int uidState, @OpFlags int flags) {
synchronized (mInMemoryLock) {
if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
- .increaseRejectCount(op, uid, packageName, uidState, 1);
+ .increaseRejectCount(op, uid, packageName, uidState, flags, 1);
}
}
}
void increaseOpAccessDuration(int op, int uid, @NonNull String packageName,
- @UidState int uidState, long increment) {
+ @UidState int uidState, @OpFlags int flags, long increment) {
synchronized (mInMemoryLock) {
if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) {
getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis())
- .increaseAccessDuration(op, uid, packageName, uidState, increment);
+ .increaseAccessDuration(op, uid, packageName, uidState, flags, increment);
}
}
}
@@ -593,20 +597,20 @@ final class HistoricalRegistry {
private static final String TAG_HISTORY = "history";
private static final String TAG_OPS = "ops";
private static final String TAG_UID = "uid";
- private static final String TAG_PACKAGE = "package";
+ private static final String TAG_PACKAGE = "pkg";
private static final String TAG_OP = "op";
- private static final String TAG_STATE = "state";
+ private static final String TAG_STATE = "st";
- private static final String ATTR_VERSION = "version";
- private static final String ATTR_NAME = "name";
- private static final String ATTR_ACCESS_COUNT = "accessCount";
- private static final String ATTR_REJECT_COUNT = "rejectCount";
- private static final String ATTR_ACCESS_DURATION = "accessDuration";
- private static final String ATTR_BEGIN_TIME = "beginTime";
- private static final String ATTR_END_TIME = "endTime";
- private static final String ATTR_OVERFLOW = "overflow";
+ private static final String ATTR_VERSION = "ver";
+ private static final String ATTR_NAME = "na";
+ private static final String ATTR_ACCESS_COUNT = "ac";
+ private static final String ATTR_REJECT_COUNT = "rc";
+ private static final String ATTR_ACCESS_DURATION = "du";
+ private static final String ATTR_BEGIN_TIME = "beg";
+ private static final String ATTR_END_TIME = "end";
+ private static final String ATTR_OVERFLOW = "ov";
- private static final int CURRENT_VERSION = 1;
+ private static final int CURRENT_VERSION = 2;
private final long mBaseSnapshotInterval;
private final long mIntervalCompressionMultiplier;
@@ -657,7 +661,8 @@ final class HistoricalRegistry {
@Nullable List<HistoricalOps> readHistoryRawDLocked() {
return collectHistoricalOpsBaseDLocked(Process.INVALID_UID /*filterUid*/,
null /*filterPackageName*/, null /*filterOpNames*/,
- 0 /*filterBeginTimeMills*/, Long.MAX_VALUE /*filterEndTimeMills*/);
+ 0 /*filterBeginTimeMills*/, Long.MAX_VALUE /*filterEndTimeMills*/,
+ AppOpsManager.OP_FLAGS_ALL);
}
@Nullable List<HistoricalOps> readHistoryDLocked() {
@@ -697,9 +702,10 @@ final class HistoricalRegistry {
private void collectHistoricalOpsDLocked(@NonNull HistoricalOps currentOps,
int filterUid, @NonNull String filterPackageName, @Nullable String[] filterOpNames,
- long filterBeingMillis, long filterEndMillis) {
+ long filterBeingMillis, long filterEndMillis, @OpFlags int filterFlags) {
final List<HistoricalOps> readOps = collectHistoricalOpsBaseDLocked(filterUid,
- filterPackageName, filterOpNames, filterBeingMillis, filterEndMillis);
+ filterPackageName, filterOpNames, filterBeingMillis, filterEndMillis,
+ filterFlags);
if (readOps != null) {
final int readCount = readOps.size();
for (int i = 0; i < readCount; i++) {
@@ -711,7 +717,7 @@ final class HistoricalRegistry {
private @Nullable LinkedList<HistoricalOps> collectHistoricalOpsBaseDLocked(
int filterUid, @NonNull String filterPackageName, @Nullable String[] filterOpNames,
- long filterBeginTimeMillis, long filterEndTimeMillis) {
+ long filterBeginTimeMillis, long filterEndTimeMillis, @OpFlags int filterFlags) {
File baseDir = null;
try {
baseDir = mHistoricalAppOpsDir.startRead();
@@ -724,8 +730,8 @@ final class HistoricalRegistry {
final long[] globalContentOffsetMillis = {0};
final LinkedList<HistoricalOps> ops = collectHistoricalOpsRecursiveDLocked(
baseDir, filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
- filterEndTimeMillis, globalContentOffsetMillis, null /*outOps*/,
- 0 /*depth*/, historyFiles);
+ filterEndTimeMillis, filterFlags, globalContentOffsetMillis,
+ null /*outOps*/, 0 /*depth*/, historyFiles);
if (DEBUG) {
filesInvariant.stopTracking(baseDir);
}
@@ -741,7 +747,8 @@ final class HistoricalRegistry {
private @Nullable LinkedList<HistoricalOps> collectHistoricalOpsRecursiveDLocked(
@NonNull File baseDir, int filterUid, @NonNull String filterPackageName,
@Nullable String[] filterOpNames, long filterBeginTimeMillis,
- long filterEndTimeMillis, @NonNull long[] globalContentOffsetMillis,
+ long filterEndTimeMillis, @OpFlags int filterFlags,
+ @NonNull long[] globalContentOffsetMillis,
@Nullable LinkedList<HistoricalOps> outOps, int depth,
@NonNull Set<String> historyFiles)
throws IOException, XmlPullParserException {
@@ -757,7 +764,7 @@ final class HistoricalRegistry {
final List<HistoricalOps> readOps = readHistoricalOpsLocked(baseDir,
previousIntervalEndMillis, currentIntervalEndMillis, filterUid,
filterPackageName, filterOpNames, filterBeginTimeMillis, filterEndTimeMillis,
- globalContentOffsetMillis, depth, historyFiles);
+ filterFlags, globalContentOffsetMillis, depth, historyFiles);
// Empty is a special signal to stop diving
if (readOps != null && readOps.isEmpty()) {
@@ -767,7 +774,7 @@ final class HistoricalRegistry {
// Collect older historical data from subsequent levels
outOps = collectHistoricalOpsRecursiveDLocked(
baseDir, filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
- filterEndTimeMillis, globalContentOffsetMillis, outOps, depth + 1,
+ filterEndTimeMillis, filterFlags, globalContentOffsetMillis, outOps, depth + 1,
historyFiles);
// Make older historical data relative to the current historical level
@@ -836,22 +843,24 @@ final class HistoricalRegistry {
previousIntervalEndMillis, currentIntervalEndMillis,
Process.INVALID_UID /*filterUid*/, null /*filterPackageName*/,
null /*filterOpNames*/, Long.MIN_VALUE /*filterBeginTimeMillis*/,
- Long.MAX_VALUE /*filterEndTimeMillis*/, null, depth,
- null /*historyFiles*/);
+ Long.MAX_VALUE /*filterEndTimeMillis*/, AppOpsManager.OP_FLAGS_ALL,
+ null, depth, null /*historyFiles*/);
if (DEBUG) {
enforceOpsWellFormed(existingOps);
}
// Offset existing ops to account for elapsed time
- final int existingOpCount = existingOps.size();
- if (existingOpCount > 0) {
- // Compute elapsed time
- final long elapsedTimeMillis = passedOps.get(passedOps.size() - 1)
+ if (existingOps != null) {
+ final int existingOpCount = existingOps.size();
+ if (existingOpCount > 0) {
+ // Compute elapsed time
+ final long elapsedTimeMillis = passedOps.get(passedOps.size() - 1)
.getEndTimeMillis();
- for (int i = 0; i < existingOpCount; i++) {
- final HistoricalOps existingOp = existingOps.get(i);
- existingOp.offsetBeginAndEndTime(elapsedTimeMillis);
+ for (int i = 0; i < existingOpCount; i++) {
+ final HistoricalOps existingOp = existingOps.get(i);
+ existingOp.offsetBeginAndEndTime(elapsedTimeMillis);
+ }
}
}
@@ -864,9 +873,10 @@ final class HistoricalRegistry {
// Consolidate passed ops at the current slot duration ensuring each snapshot is
// full. To achieve this we put all passed and existing ops in a list and will
// merge them to ensure each represents a snapshot at the current granularity.
- final List<HistoricalOps> allOps = new LinkedList<>();
- allOps.addAll(passedOps);
- allOps.addAll(existingOps);
+ final List<HistoricalOps> allOps = new LinkedList<>(passedOps);
+ if (existingOps != null) {
+ allOps.addAll(existingOps);
+ }
if (DEBUG) {
enforceOpsWellFormed(allOps);
@@ -944,10 +954,10 @@ final class HistoricalRegistry {
overflowedOps, oldFileNames, depth + 1);
}
- private @NonNull List<HistoricalOps> readHistoricalOpsLocked(File baseDir,
- long intervalBeginMillis, long intervalEndMillis, int filterUid,
- @Nullable String filterPackageName, @Nullable String[] filterOpNames,
- long filterBeginTimeMillis, long filterEndTimeMillis,
+ private @Nullable List<HistoricalOps> readHistoricalOpsLocked(File baseDir,
+ long intervalBeginMillis, long intervalEndMillis,
+ int filterUid, @Nullable String filterPackageName, @Nullable String[] filterOpNames,
+ long filterBeginTimeMillis, long filterEndTimeMillis, @OpFlags int filterFlags,
@Nullable long[] cumulativeOverflowMillis, int depth,
@NonNull Set<String> historyFiles)
throws IOException, XmlPullParserException {
@@ -973,12 +983,13 @@ final class HistoricalRegistry {
}
}
return readHistoricalOpsLocked(file, filterUid, filterPackageName, filterOpNames,
- filterBeginTimeMillis, filterEndTimeMillis, cumulativeOverflowMillis);
+ filterBeginTimeMillis, filterEndTimeMillis, filterFlags,
+ cumulativeOverflowMillis);
}
private @Nullable List<HistoricalOps> readHistoricalOpsLocked(@NonNull File file,
int filterUid, @Nullable String filterPackageName, @Nullable String[] filterOpNames,
- long filterBeginTimeMillis, long filterEndTimeMillis,
+ long filterBeginTimeMillis, long filterEndTimeMillis, @OpFlags int filterFlags,
@Nullable long[] cumulativeOverflowMillis)
throws IOException, XmlPullParserException {
if (DEBUG) {
@@ -989,13 +1000,22 @@ final class HistoricalRegistry {
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, StandardCharsets.UTF_8.name());
XmlUtils.beginDocument(parser, TAG_HISTORY);
+
+ // We haven't released version 1 and have more detailed
+ // accounting - just nuke the current state
+ final int version = XmlUtils.readIntAttribute(parser, ATTR_VERSION);
+ if (CURRENT_VERSION == 2 && version < CURRENT_VERSION) {
+ throw new IllegalStateException("Dropping unsupported history "
+ + "version 1 for file:" + file);
+ }
+
final long overflowMillis = XmlUtils.readLongAttribute(parser, ATTR_OVERFLOW, 0);
final int depth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, depth)) {
if (TAG_OPS.equals(parser.getName())) {
final HistoricalOps ops = readeHistoricalOpsDLocked(parser,
filterUid, filterPackageName, filterOpNames, filterBeginTimeMillis,
- filterEndTimeMillis, cumulativeOverflowMillis);
+ filterEndTimeMillis, filterFlags, cumulativeOverflowMillis);
if (ops == null) {
continue;
}
@@ -1029,7 +1049,8 @@ final class HistoricalRegistry {
private @Nullable HistoricalOps readeHistoricalOpsDLocked(
@NonNull XmlPullParser parser, int filterUid, @Nullable String filterPackageName,
@Nullable String[] filterOpNames, long filterBeginTimeMillis,
- long filterEndTimeMillis, @Nullable long[] cumulativeOverflowMillis)
+ long filterEndTimeMillis, @OpFlags int filterFlags,
+ @Nullable long[] cumulativeOverflowMillis)
throws IOException, XmlPullParserException {
final long beginTimeMillis = XmlUtils.readLongAttribute(parser, ATTR_BEGIN_TIME, 0)
+ (cumulativeOverflowMillis != null ? cumulativeOverflowMillis[0] : 0);
@@ -1045,6 +1066,10 @@ final class HistoricalRegistry {
}
final long filteredBeginTimeMillis = Math.max(beginTimeMillis, filterBeginTimeMillis);
final long filteredEndTimeMillis = Math.min(endTimeMillis, filterEndTimeMillis);
+ // // Keep reading as subsequent records may start matching
+ // if (filteredEndTimeMillis - filterBeginTimeMillis <= 0) {
+ // return null;
+ // }
final double filterScale = (double) (filteredEndTimeMillis - filteredBeginTimeMillis)
/ (double) (endTimeMillis - beginTimeMillis);
HistoricalOps ops = null;
@@ -1052,7 +1077,7 @@ final class HistoricalRegistry {
while (XmlUtils.nextElementWithin(parser, depth)) {
if (TAG_UID.equals(parser.getName())) {
final HistoricalOps returnedOps = readHistoricalUidOpsDLocked(ops, parser,
- filterUid, filterPackageName, filterOpNames, filterScale);
+ filterUid, filterPackageName, filterOpNames, filterFlags, filterScale);
if (ops == null) {
ops = returnedOps;
}
@@ -1067,7 +1092,8 @@ final class HistoricalRegistry {
private @Nullable HistoricalOps readHistoricalUidOpsDLocked(
@Nullable HistoricalOps ops, @NonNull XmlPullParser parser, int filterUid,
@Nullable String filterPackageName, @Nullable String[] filterOpNames,
- double filterScale) throws IOException, XmlPullParserException {
+ @OpFlags int filterFlags, double filterScale)
+ throws IOException, XmlPullParserException {
final int uid = XmlUtils.readIntAttribute(parser, ATTR_NAME);
if (filterUid != Process.INVALID_UID && filterUid != uid) {
XmlUtils.skipCurrentTag(parser);
@@ -1077,7 +1103,8 @@ final class HistoricalRegistry {
while (XmlUtils.nextElementWithin(parser, depth)) {
if (TAG_PACKAGE.equals(parser.getName())) {
final HistoricalOps returnedOps = readHistoricalPackageOpsDLocked(ops,
- uid, parser, filterPackageName, filterOpNames, filterScale);
+ uid, parser, filterPackageName, filterOpNames, filterFlags,
+ filterScale);
if (ops == null) {
ops = returnedOps;
}
@@ -1089,7 +1116,8 @@ final class HistoricalRegistry {
private @Nullable HistoricalOps readHistoricalPackageOpsDLocked(
@Nullable HistoricalOps ops, int uid, @NonNull XmlPullParser parser,
@Nullable String filterPackageName, @Nullable String[] filterOpNames,
- double filterScale) throws IOException, XmlPullParserException {
+ @OpFlags int filterFlags, double filterScale)
+ throws IOException, XmlPullParserException {
final String packageName = XmlUtils.readStringAttribute(parser, ATTR_NAME);
if (filterPackageName != null && !filterPackageName.equals(packageName)) {
XmlUtils.skipCurrentTag(parser);
@@ -1099,7 +1127,7 @@ final class HistoricalRegistry {
while (XmlUtils.nextElementWithin(parser, depth)) {
if (TAG_OP.equals(parser.getName())) {
final HistoricalOps returnedOps = readHistoricalOpDLocked(ops, uid,
- packageName, parser, filterOpNames, filterScale);
+ packageName, parser, filterOpNames, filterFlags, filterScale);
if (ops == null) {
ops = returnedOps;
}
@@ -1110,7 +1138,7 @@ final class HistoricalRegistry {
private @Nullable HistoricalOps readHistoricalOpDLocked(@Nullable HistoricalOps ops,
int uid, String packageName, @NonNull XmlPullParser parser,
- @Nullable String[] filterOpNames, double filterScale)
+ @Nullable String[] filterOpNames, @OpFlags int filterFlags, double filterScale)
throws IOException, XmlPullParserException {
final int op = XmlUtils.readIntAttribute(parser, ATTR_NAME);
if (filterOpNames != null && !ArrayUtils.contains(filterOpNames,
@@ -1121,8 +1149,8 @@ final class HistoricalRegistry {
final int depth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, depth)) {
if (TAG_STATE.equals(parser.getName())) {
- final HistoricalOps returnedOps = readUidStateDLocked(ops, uid,
- packageName, op, parser, filterScale);
+ final HistoricalOps returnedOps = readStateDLocked(ops, uid,
+ packageName, op, parser, filterFlags, filterScale);
if (ops == null) {
ops = returnedOps;
}
@@ -1131,10 +1159,15 @@ final class HistoricalRegistry {
return ops;
}
- private @Nullable HistoricalOps readUidStateDLocked(@Nullable HistoricalOps ops,
+ private @Nullable HistoricalOps readStateDLocked(@Nullable HistoricalOps ops,
int uid, String packageName, int op, @NonNull XmlPullParser parser,
- double filterScale) throws IOException {
- final int uidState = XmlUtils.readIntAttribute(parser, ATTR_NAME);
+ @OpFlags int filterFlags, double filterScale) throws IOException {
+ final long key = XmlUtils.readLongAttribute(parser, ATTR_NAME);
+ final int flags = AppOpsManager.extractFlagsFromKey(key) & filterFlags;
+ if (flags == 0) {
+ return null;
+ }
+ final int uidState = AppOpsManager.extractUidStateFromKey(key);
long accessCount = XmlUtils.readLongAttribute(parser, ATTR_ACCESS_COUNT, 0);
if (accessCount > 0) {
if (!Double.isNaN(filterScale)) {
@@ -1144,7 +1177,7 @@ final class HistoricalRegistry {
if (ops == null) {
ops = new HistoricalOps(0, 0);
}
- ops.increaseAccessCount(op, uid, packageName, uidState, accessCount);
+ ops.increaseAccessCount(op, uid, packageName, uidState, flags, accessCount);
}
long rejectCount = XmlUtils.readLongAttribute(parser, ATTR_REJECT_COUNT, 0);
if (rejectCount > 0) {
@@ -1155,7 +1188,7 @@ final class HistoricalRegistry {
if (ops == null) {
ops = new HistoricalOps(0, 0);
}
- ops.increaseRejectCount(op, uid, packageName, uidState, rejectCount);
+ ops.increaseRejectCount(op, uid, packageName, uidState, flags, rejectCount);
}
long accessDuration = XmlUtils.readLongAttribute(parser, ATTR_ACCESS_DURATION, 0);
if (accessDuration > 0) {
@@ -1166,7 +1199,7 @@ final class HistoricalRegistry {
if (ops == null) {
ops = new HistoricalOps(0, 0);
}
- ops.increaseAccessDuration(op, uid, packageName, uidState, accessDuration);
+ ops.increaseAccessDuration(op, uid, packageName, uidState, flags, accessDuration);
}
return ops;
}
@@ -1241,24 +1274,34 @@ final class HistoricalRegistry {
private void writeHistoricalOpDLocked(@NonNull HistoricalOp op,
@NonNull XmlSerializer serializer) throws IOException {
+ final LongSparseArray keys = op.collectKeys();
+ if (keys == null || keys.size() <= 0) {
+ return;
+ }
serializer.startTag(null, TAG_OP);
serializer.attribute(null, ATTR_NAME, Integer.toString(op.getOpCode()));
- for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
- writeUidStateOnLocked(op, uidState, serializer);
+ final int keyCount = keys.size();
+ for (int i = 0; i < keyCount; i++) {
+ writeStateOnLocked(op, keys.keyAt(i), serializer);
}
serializer.endTag(null, TAG_OP);
}
- private void writeUidStateOnLocked(@NonNull HistoricalOp op, @UidState int uidState,
+ private void writeStateOnLocked(@NonNull HistoricalOp op, long key,
@NonNull XmlSerializer serializer) throws IOException {
- final long accessCount = op.getAccessCount(uidState);
- final long rejectCount = op.getRejectCount(uidState);
- final long accessDuration = op.getAccessDuration(uidState);
- if (accessCount == 0 && rejectCount == 0 && accessDuration == 0) {
+ final int uidState = AppOpsManager.extractUidStateFromKey(key);
+ final int flags = AppOpsManager.extractFlagsFromKey(key);
+
+ final long accessCount = op.getAccessCount(uidState, uidState, flags);
+ final long rejectCount = op.getRejectCount(uidState, uidState, flags);
+ final long accessDuration = op.getAccessDuration(uidState, uidState, flags);
+
+ if (accessCount <= 0 && rejectCount <= 0 && accessDuration <= 0) {
return;
}
+
serializer.startTag(null, TAG_STATE);
- serializer.attribute(null, ATTR_NAME, Integer.toString(uidState));
+ serializer.attribute(null, ATTR_NAME, Long.toString(key));
if (accessCount > 0) {
serializer.attribute(null, ATTR_ACCESS_COUNT, Long.toString(accessCount));
}
@@ -1532,24 +1575,29 @@ final class HistoricalRegistry {
mWriter.print(mEntryPrefix);
mWriter.print(AppOpsManager.opToName(ops.getOpCode()));
mWriter.println(":");
- for (int uidState = 0; uidState < AppOpsManager._NUM_UID_STATE; uidState++) {
+ final LongSparseArray keys = ops.collectKeys();
+ final int keyCount = keys.size();
+ for (int i = 0; i < keyCount; i++) {
+ final long key = keys.keyAt(i);
+ final int uidState = AppOpsManager.extractUidStateFromKey(key);
+ final int flags = AppOpsManager.extractFlagsFromKey(key);
boolean printedUidState = false;
- final long accessCount = ops.getAccessCount(uidState);
+ final long accessCount = ops.getAccessCount(uidState, uidState, flags);
if (accessCount > 0) {
if (!printedUidState) {
mWriter.print(mUidStatePrefix);
- mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(AppOpsManager.keyToString(key));
mWriter.print(" = ");
printedUidState = true;
}
mWriter.print("access=");
mWriter.print(accessCount);
}
- final long rejectCount = ops.getRejectCount(uidState);
+ final long rejectCount = ops.getRejectCount(uidState, uidState, flags);
if (rejectCount > 0) {
if (!printedUidState) {
mWriter.print(mUidStatePrefix);
- mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(AppOpsManager.keyToString(key));
mWriter.print(" = ");
printedUidState = true;
} else {
@@ -1558,11 +1606,11 @@ final class HistoricalRegistry {
mWriter.print("reject=");
mWriter.print(rejectCount);
}
- final long accessDuration = ops.getAccessDuration(uidState);
+ final long accessDuration = ops.getAccessDuration(uidState, uidState, flags);
if (accessDuration > 0) {
if (!printedUidState) {
mWriter.print(mUidStatePrefix);
- mWriter.print(AppOpsService.UID_STATE_NAMES[uidState]);
+ mWriter.print(AppOpsManager.keyToString(key));
mWriter.print(" = ");
printedUidState = true;
} else {
diff --git a/services/core/java/com/android/server/appop/TEST_MAPPING b/services/core/java/com/android/server/appop/TEST_MAPPING
new file mode 100644
index 000000000000..f2e2782e8eea
--- /dev/null
+++ b/services/core/java/com/android/server/appop/TEST_MAPPING
@@ -0,0 +1,21 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsAppOpsTestCases"
+ },
+ {
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.appop.AppOpsUpgradeTest"
+ },
+ {
+ "include-filter": "com.android.server.appop.AppOpsServiceTest"
+ },
+ {
+ "include-filter": "com.android.server.appop.AppOpsActiveWatcherTest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 9af57daa259b..451fd66d4327 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -201,51 +201,72 @@ import java.util.ArrayList;
}
}
- /*package*/ int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
+ private static final class BtDeviceConnectionInfo {
+ final @NonNull BluetoothDevice mDevice;
+ final @AudioService.BtProfileConnectionState int mState;
+ final int mProfile;
+ final boolean mSupprNoisy;
+ final int mVolume;
+
+ BtDeviceConnectionInfo(@NonNull BluetoothDevice device,
+ @AudioService.BtProfileConnectionState int state,
+ int profile, boolean suppressNoisyIntent, int vol) {
+ mDevice = device;
+ mState = state;
+ mProfile = profile;
+ mSupprNoisy = suppressNoisyIntent;
+ mVolume = vol;
+ }
+ }
+
+ /*package*/ void postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int a2dpVolume) {
- AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
- "setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent state=" + state
- // only querying address as this is the only readily available field
- // on the device
- + " addr=" + device.getAddress()
- + " prof=" + profile + " supprNoisy=" + suppressNoisyIntent
- + " vol=" + a2dpVolume)).printLog(TAG));
- synchronized (mDeviceStateLock) {
- if (mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE,
- new BtHelper.BluetoothA2dpDeviceInfo(device))) {
- AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
- "A2DP connection state ignored"));
- return 0;
- }
- return mDeviceInventory.setBluetoothA2dpDeviceConnectionState(
- device, state, profile, suppressNoisyIntent,
- AudioSystem.DEVICE_NONE, a2dpVolume);
- }
+ final BtDeviceConnectionInfo info = new BtDeviceConnectionInfo(device, state, profile,
+ suppressNoisyIntent, a2dpVolume);
+
+ // TODO add a check to try to remove unprocessed messages for the same device (the old
+ // check didn't work), and make sure it doesn't conflict with config change message
+ sendLMsgNoDelay(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT, SENDMSG_QUEUE, info);
}
/*package*/ int handleBluetoothA2dpActiveDeviceChange(
@NonNull BluetoothDevice device,
@AudioService.BtProfileConnectionState int state, int profile,
boolean suppressNoisyIntent, int a2dpVolume) {
+ // FIXME method was added by @a8439e2 but never used, and now conflicts with async behavior
+ // of handleBluetoothA2dpDeviceConfigChange and
+ // setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent
synchronized (mDeviceStateLock) {
return mDeviceInventory.handleBluetoothA2dpActiveDeviceChange(device, state, profile,
suppressNoisyIntent, a2dpVolume);
}
}
- /*package*/ int setBluetoothHearingAidDeviceConnectionState(
+ private static final class HearingAidDeviceConnectionInfo {
+ final @NonNull BluetoothDevice mDevice;
+ final @AudioService.BtProfileConnectionState int mState;
+ final boolean mSupprNoisy;
+ final int mMusicDevice;
+ final @NonNull String mEventSource;
+
+ HearingAidDeviceConnectionInfo(@NonNull BluetoothDevice device,
+ @AudioService.BtProfileConnectionState int state,
+ boolean suppressNoisyIntent, int musicDevice, @NonNull String eventSource) {
+ mDevice = device;
+ mState = state;
+ mSupprNoisy = suppressNoisyIntent;
+ mMusicDevice = musicDevice;
+ mEventSource = eventSource;
+ }
+ }
+
+ /*package*/ void postBluetoothHearingAidDeviceConnectionState(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
boolean suppressNoisyIntent, int musicDevice, @NonNull String eventSource) {
- AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
- "setHearingAidDeviceConnectionState state=" + state
- + " addr=" + device.getAddress()
- + " supprNoisy=" + suppressNoisyIntent
- + " src=" + eventSource)).printLog(TAG));
- synchronized (mDeviceStateLock) {
- return mDeviceInventory.setBluetoothHearingAidDeviceConnectionState(
- device, state, suppressNoisyIntent, musicDevice);
- }
+ final HearingAidDeviceConnectionInfo info = new HearingAidDeviceConnectionInfo(
+ device, state, suppressNoisyIntent, musicDevice, eventSource);
+ sendLMsgNoDelay(MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT, SENDMSG_QUEUE, info);
}
// never called by system components
@@ -766,6 +787,35 @@ import java.util.ArrayList;
mBtHelper.onHeadsetProfileConnected((BluetoothHeadset) msg.obj);
}
break;
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: {
+ final BtDeviceConnectionInfo info = (BtDeviceConnectionInfo) msg.obj;
+ AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
+ "setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent "
+ + " state=" + info.mState
+ // only querying address as this is the only readily available
+ // field on the device
+ + " addr=" + info.mDevice.getAddress()
+ + " prof=" + info.mProfile + " supprNoisy=" + info.mSupprNoisy
+ + " vol=" + info.mVolume)).printLog(TAG));
+ synchronized (mDeviceStateLock) {
+ mDeviceInventory.setBluetoothA2dpDeviceConnectionState(
+ info.mDevice, info.mState, info.mProfile, info.mSupprNoisy,
+ AudioSystem.DEVICE_NONE, info.mVolume);
+ }
+ } break;
+ case MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT: {
+ final HearingAidDeviceConnectionInfo info =
+ (HearingAidDeviceConnectionInfo) msg.obj;
+ AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
+ "setHearingAidDeviceConnectionState state=" + info.mState
+ + " addr=" + info.mDevice.getAddress()
+ + " supprNoisy=" + info.mSupprNoisy
+ + " src=" + info.mEventSource)).printLog(TAG));
+ synchronized (mDeviceStateLock) {
+ mDeviceInventory.setBluetoothHearingAidDeviceConnectionState(
+ info.mDevice, info.mState, info.mSupprNoisy, info.mMusicDevice);
+ }
+ } break;
default:
Log.wtf(TAG, "Invalid message " + msg.what);
}
@@ -809,6 +859,10 @@ import java.util.ArrayList;
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_A2DP_SINK = 24;
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEARING_AID = 25;
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEADSET = 26;
+ // process external command to (dis)connect an A2DP device
+ private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT = 27;
+ // process external command to (dis)connect a hearing aid device
+ private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 28;
private static boolean isMessageHandledUnderWakelock(int msgId) {
@@ -821,6 +875,8 @@ import java.util.ArrayList;
case MSG_L_A2DP_DEVICE_CONFIG_CHANGE:
case MSG_TOGGLE_HDMI:
case MSG_L_A2DP_ACTIVE_DEVICE_CHANGE:
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT:
+ case MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT:
return true;
default:
return false;
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 37f0496c0db3..41a3c9859f23 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -578,7 +578,7 @@ public final class AudioDeviceInventory {
return mCurAudioRoutes;
}
- /*package*/ int setBluetoothA2dpDeviceConnectionState(
+ /*package*/ void setBluetoothA2dpDeviceConnectionState(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int musicDevice, int a2dpVolume) {
int delay;
@@ -614,46 +614,50 @@ public final class AudioDeviceInventory {
delay);
}
}
- return delay;
}
/*package*/ int handleBluetoothA2dpActiveDeviceChange(
@NonNull BluetoothDevice device,
@AudioService.BtProfileConnectionState int state, int profile,
boolean suppressNoisyIntent, int a2dpVolume) {
- if (state == BluetoothProfile.STATE_DISCONNECTED) {
- return setBluetoothA2dpDeviceConnectionState(device, state, profile,
- suppressNoisyIntent, AudioSystem.DEVICE_NONE, a2dpVolume);
- }
- // state == BluetoothProfile.STATE_CONNECTED
- synchronized (mConnectedDevices) {
- for (int i = 0; i < mConnectedDevices.size(); i++) {
- final DeviceInfo deviceInfo = mConnectedDevices.valueAt(i);
- if (deviceInfo.mDeviceType != AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
- continue;
- }
- // If A2DP device exists, this is either an active device change or
- // device config change
- final String existingDevicekey = mConnectedDevices.keyAt(i);
- final String deviceName = device.getName();
- final String address = device.getAddress();
- final String newDeviceKey = DeviceInfo.makeDeviceListKey(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
- int a2dpCodec = mDeviceBroker.getA2dpCodec(device);
- // Device not equal to existing device, active device change
- if (!TextUtils.equals(existingDevicekey, newDeviceKey)) {
- mConnectedDevices.remove(existingDevicekey);
- mConnectedDevices.put(newDeviceKey, new DeviceInfo(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, deviceName,
- address, a2dpCodec));
- mDeviceBroker.postA2dpActiveDeviceChange(
- new BtHelper.BluetoothA2dpDeviceInfo(
- device, a2dpVolume, a2dpCodec));
- return 0;
- } else {
- // Device config change for existing device
- mDeviceBroker.postBluetoothA2dpDeviceConfigChange(device);
- return 0;
+ // method was added by QC but never used, and now conflicts with async behavior of
+ // handleBluetoothA2dpDeviceConfigChange and
+ // setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent
+ if (false) {
+ if (state == BluetoothProfile.STATE_DISCONNECTED) {
+ setBluetoothA2dpDeviceConnectionState(device, state, profile,
+ suppressNoisyIntent, AudioSystem.DEVICE_NONE, a2dpVolume);
+ }
+ // state == BluetoothProfile.STATE_CONNECTED
+ synchronized (mConnectedDevices) {
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ final DeviceInfo deviceInfo = mConnectedDevices.valueAt(i);
+ if (deviceInfo.mDeviceType != AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
+ continue;
+ }
+ // If A2DP device exists, this is either an active device change or
+ // device config change
+ final String existingDevicekey = mConnectedDevices.keyAt(i);
+ final String deviceName = device.getName();
+ final String address = device.getAddress();
+ final String newDeviceKey = DeviceInfo.makeDeviceListKey(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
+ int a2dpCodec = mDeviceBroker.getA2dpCodec(device);
+ // Device not equal to existing device, active device change
+ if (!TextUtils.equals(existingDevicekey, newDeviceKey)) {
+ mConnectedDevices.remove(existingDevicekey);
+ mConnectedDevices.put(newDeviceKey, new DeviceInfo(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, deviceName,
+ address, a2dpCodec));
+ mDeviceBroker.postA2dpActiveDeviceChange(
+ new BtHelper.BluetoothA2dpDeviceInfo(
+ device, a2dpVolume, a2dpCodec));
+ return 0;
+ } else {
+ // Device config change for existing device
+ mDeviceBroker.postBluetoothA2dpDeviceConfigChange(device);
+ return 0;
+ }
}
}
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 6bd412bcd536..91d19def1766 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -4041,7 +4041,10 @@ public class AudioService extends IAudioService.Stub
@Retention(RetentionPolicy.SOURCE)
public @interface BtProfileConnectionState {}
- public int setBluetoothHearingAidDeviceConnectionState(
+ /**
+ * See AudioManager.setBluetoothHearingAidDeviceConnectionState()
+ */
+ public void setBluetoothHearingAidDeviceConnectionState(
@NonNull BluetoothDevice device, @BtProfileConnectionState int state,
boolean suppressNoisyIntent, int musicDevice)
{
@@ -4053,14 +4056,14 @@ public class AudioService extends IAudioService.Stub
throw new IllegalArgumentException("Illegal BluetoothProfile state for device "
+ " (dis)connection, got " + state);
}
- return mDeviceBroker.setBluetoothHearingAidDeviceConnectionState(
+ mDeviceBroker.postBluetoothHearingAidDeviceConnectionState(
device, state, suppressNoisyIntent, musicDevice, "AudioService");
}
/**
* See AudioManager.setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent()
*/
- public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
+ public void setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int a2dpVolume) {
if (device == null) {
@@ -4071,7 +4074,7 @@ public class AudioService extends IAudioService.Stub
throw new IllegalArgumentException("Illegal BluetoothProfile state for device "
+ " (dis)connection, got " + state);
}
- return mDeviceBroker.setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(device, state,
+ mDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(device, state,
profile, suppressNoisyIntent, a2dpVolume);
}
@@ -4094,6 +4097,9 @@ public class AudioService extends IAudioService.Stub
public int handleBluetoothA2dpActiveDeviceChange(
BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent,
int a2dpVolume) {
+ // FIXME method was added by @a8439e2 but never used, and now conflicts with async behavior
+ // of handleBluetoothA2dpDeviceConfigChange and
+ // setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent
if (device == null) {
throw new IllegalArgumentException("Illegal null device");
}
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 58c1882abf6f..04073cb5f45c 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -426,7 +426,7 @@ public class BtHelper {
final BluetoothDevice btDevice = deviceList.get(0);
final @BluetoothProfile.BtProfileState int state =
mHearingAid.getConnectionState(btDevice);
- mDeviceBroker.setBluetoothHearingAidDeviceConnectionState(
+ mDeviceBroker.postBluetoothHearingAidDeviceConnectionState(
btDevice, state,
/*suppressNoisyIntent*/ false,
/*musicDevice*/ android.media.AudioSystem.DEVICE_NONE,
diff --git a/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
index 8a9ac23cf06a..65de83b2045c 100644
--- a/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
+++ b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
@@ -16,10 +16,12 @@
package com.android.server.connectivity;
import static android.net.SocketKeepalive.DATA_RECEIVED;
+import static android.net.SocketKeepalive.ERROR_HARDWARE_UNSUPPORTED;
import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET;
import static android.net.SocketKeepalive.ERROR_SOCKET_NOT_IDLE;
import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_ERROR;
import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT;
+import static android.system.OsConstants.ENOPROTOOPT;
import static android.system.OsConstants.FIONREAD;
import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.TIOCOUTQ;
@@ -179,12 +181,13 @@ public class TcpKeepaliveController {
trw = NetworkUtils.getTcpRepairWindow(fd);
} catch (ErrnoException e) {
Log.e(TAG, "Exception reading TCP state from socket", e);
- try {
- Os.setsockoptInt(fd, IPPROTO_TCP, TCP_REPAIR, TCP_REPAIR_OFF);
- } catch (ErrnoException ex) {
- Log.e(TAG, "Exception while turning off repair mode due to exception", ex);
+ if (e.errno == ENOPROTOOPT) {
+ // ENOPROTOOPT may happen in kernel version lower than 4.8.
+ // Treat it as ERROR_HARDWARE_UNSUPPORTED.
+ throw new InvalidSocketException(ERROR_HARDWARE_UNSUPPORTED, e);
+ } else {
+ throw new InvalidSocketException(ERROR_INVALID_SOCKET, e);
}
- throw new InvalidSocketException(ERROR_INVALID_SOCKET, e);
} finally {
dropAllIncomingPackets(fd, false);
}
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index c91e1a12078e..13ff30d6ad3e 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -289,8 +289,8 @@ public class Tethering extends BaseNetworkObserver {
}
private void maybeUpdateConfiguration() {
- final int dunCheck = TetheringConfiguration.checkDunRequired(mContext);
- if (dunCheck == mConfig.dunCheck) return;
+ final boolean isDunRequired = TetheringConfiguration.checkDunRequired(mContext);
+ if (isDunRequired == mConfig.isDunRequired) return;
updateConfiguration();
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
index 8a46ff18979f..935b79546d63 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
@@ -67,11 +67,6 @@ public class TetheringConfiguration {
private static final String[] EMPTY_STRING_ARRAY = new String[0];
- @VisibleForTesting
- public static final int DUN_NOT_REQUIRED = 0;
- public static final int DUN_REQUIRED = 1;
- public static final int DUN_UNSPECIFIED = 2;
-
// Default ranges used for the legacy DHCP server.
// USB is 192.168.42.1 and 255.255.255.0
// Wifi is 192.168.43.1 and 255.255.255.0
@@ -90,7 +85,6 @@ public class TetheringConfiguration {
public final String[] tetherableUsbRegexs;
public final String[] tetherableWifiRegexs;
public final String[] tetherableBluetoothRegexs;
- public final int dunCheck;
public final boolean isDunRequired;
public final boolean chooseUpstreamAutomatically;
public final Collection<Integer> preferredUpstreamIfaceTypes;
@@ -116,12 +110,10 @@ public class TetheringConfiguration {
tetherableWifiRegexs = getResourceStringArray(res, config_tether_wifi_regexs);
tetherableBluetoothRegexs = getResourceStringArray(res, config_tether_bluetooth_regexs);
- dunCheck = checkDunRequired(ctx);
- configLog.log("DUN check returned: " + dunCheckString(dunCheck));
+ isDunRequired = checkDunRequired(ctx);
chooseUpstreamAutomatically = getResourceBoolean(res, config_tether_upstream_automatic);
- preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, dunCheck);
- isDunRequired = preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN);
+ preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, isDunRequired);
legacyDhcpRanges = getLegacyDhcpRanges(res);
defaultIPv4DNS = copy(DEFAULT_IPV4_DNS);
@@ -230,53 +222,43 @@ public class TetheringConfiguration {
return upstreamNames;
}
- public static int checkDunRequired(Context ctx) {
+ /** Check whether dun is required. */
+ public static boolean checkDunRequired(Context ctx) {
final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE);
- return (tm != null) ? tm.getTetherApnRequired() : DUN_UNSPECIFIED;
- }
-
- private static String dunCheckString(int dunCheck) {
- switch (dunCheck) {
- case DUN_NOT_REQUIRED: return "DUN_NOT_REQUIRED";
- case DUN_REQUIRED: return "DUN_REQUIRED";
- case DUN_UNSPECIFIED: return "DUN_UNSPECIFIED";
- default:
- return String.format("UNKNOWN (%s)", dunCheck);
- }
+ return (tm != null) ? tm.getTetherApnRequired() : false;
}
- private static Collection<Integer> getUpstreamIfaceTypes(Resources res, int dunCheck) {
+ private static Collection<Integer> getUpstreamIfaceTypes(Resources res, boolean dunRequired) {
final int[] ifaceTypes = res.getIntArray(config_tether_upstream_types);
final ArrayList<Integer> upstreamIfaceTypes = new ArrayList<>(ifaceTypes.length);
for (int i : ifaceTypes) {
switch (i) {
case TYPE_MOBILE:
case TYPE_MOBILE_HIPRI:
- if (dunCheck == DUN_REQUIRED) continue;
+ if (dunRequired) continue;
break;
case TYPE_MOBILE_DUN:
- if (dunCheck == DUN_NOT_REQUIRED) continue;
+ if (!dunRequired) continue;
break;
}
upstreamIfaceTypes.add(i);
}
// Fix up upstream interface types for DUN or mobile. NOTE: independent
- // of the value of |dunCheck|, cell data of one form or another is
+ // of the value of |dunRequired|, cell data of one form or another is
// *always* an upstream, regardless of the upstream interface types
// specified by configuration resources.
- if (dunCheck == DUN_REQUIRED) {
+ if (dunRequired) {
appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE_DUN);
- } else if (dunCheck == DUN_NOT_REQUIRED) {
- appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE);
- appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE_HIPRI);
} else {
- // Fix upstream interface types for case DUN_UNSPECIFIED.
// Do not modify if a cellular interface type is already present in the
// upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no
// cellular interface types are found in the upstream interface types.
- if (!(containsOneOf(upstreamIfaceTypes,
- TYPE_MOBILE_DUN, TYPE_MOBILE, TYPE_MOBILE_HIPRI))) {
+ // This preserves backwards compatibility and prevents the DUN and default
+ // mobile types incorrectly appearing together, which could happen on
+ // previous releases in the common case where checkDunRequired returned
+ // DUN_UNSPECIFIED.
+ if (!containsOneOf(upstreamIfaceTypes, TYPE_MOBILE, TYPE_MOBILE_HIPRI)) {
upstreamIfaceTypes.add(TYPE_MOBILE);
upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
}
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index e9ae516cc8d0..9882f6c0d4c1 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -138,9 +138,19 @@ abstract class DisplayDevice {
}
/**
- * Sets the mode, if supported.
+ * Sets the display modes the system is allowed to switch between, roughly ordered by
+ * preference.
+ *
+ * Not all display devices will automatically switch between modes, so it's important that the
+ * most-desired modes are at the beginning of the allowed array.
+ */
+ public void setAllowedDisplayModesLocked(int[] modes) {
+ }
+
+ /**
+ * Sets the requested color mode.
*/
- public void requestDisplayModesLocked(int colorMode, int modeId) {
+ public void setRequestedColorModeLocked(int colorMode) {
}
public void onOverlayChangedLocked() {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 1aaaf41679f7..32f34b8378ce 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -167,13 +167,13 @@ public final class DisplayManagerService extends SystemService {
private static final int MSG_DELIVER_DISPLAY_EVENT = 3;
private static final int MSG_REQUEST_TRAVERSAL = 4;
private static final int MSG_UPDATE_VIEWPORT = 5;
- private static final int MSG_REGISTER_BRIGHTNESS_TRACKER = 6;
- private static final int MSG_LOAD_BRIGHTNESS_CONFIGURATION = 7;
+ private static final int MSG_LOAD_BRIGHTNESS_CONFIGURATION = 6;
private final Context mContext;
private final DisplayManagerHandler mHandler;
private final Handler mUiHandler;
private final DisplayAdapterListener mDisplayAdapterListener;
+ private final DisplayModeDirector mDisplayModeDirector;
private WindowManagerInternal mWindowManagerInternal;
private InputManagerInternal mInputManagerInternal;
private IMediaProjectionManager mProjectionService;
@@ -310,6 +310,7 @@ public final class DisplayManagerService extends SystemService {
mHandler = new DisplayManagerHandler(DisplayThread.get().getLooper());
mUiHandler = UiThread.getHandler();
mDisplayAdapterListener = new DisplayAdapterListener();
+ mDisplayModeDirector = new DisplayModeDirector(context, mHandler);
mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
Resources resources = mContext.getResources();
mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger(
@@ -322,7 +323,7 @@ public final class DisplayManagerService extends SystemService {
mMinimumBrightnessCurve = new Curve(lux, nits);
mMinimumBrightnessSpline = Spline.createSpline(lux, nits);
- PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ PowerManager pm = mContext.getSystemService(PowerManager.class);
mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting();
mCurrentUserId = UserHandle.USER_SYSTEM;
ColorSpace[] colorSpaces = SurfaceControl.getCompositionColorSpaces();
@@ -347,9 +348,9 @@ public final class DisplayManagerService extends SystemService {
// adapter is up so that we have it's configuration. We could load it lazily, but since
// we're going to have to read it in eventually we may as well do it here rather than after
// we've waited for the display to register itself with us.
- synchronized(mSyncRoot) {
- mPersistentDataStore.loadIfNeeded();
- loadStableDisplayValuesLocked();
+ synchronized (mSyncRoot) {
+ mPersistentDataStore.loadIfNeeded();
+ loadStableDisplayValuesLocked();
}
mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTERS);
@@ -417,8 +418,10 @@ public final class DisplayManagerService extends SystemService {
mOnlyCore = onlyCore;
}
+ mDisplayModeDirector.setListener(new AllowedDisplayModeObserver());
+ mDisplayModeDirector.start();
+
mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
- mHandler.sendEmptyMessage(MSG_REGISTER_BRIGHTNESS_TRACKER);
}
@VisibleForTesting
@@ -1194,13 +1197,8 @@ public final class DisplayManagerService extends SystemService {
requestedModeId = display.getDisplayInfoLocked().findDefaultModeByRefreshRate(
requestedRefreshRate);
}
- if (display.getRequestedModeIdLocked() != requestedModeId) {
- if (DEBUG) {
- Slog.d(TAG, "Display " + displayId + " switching to mode " + requestedModeId);
- }
- display.setRequestedModeIdLocked(requestedModeId);
- scheduleTraversalLocked(inTraversal);
- }
+ mDisplayModeDirector.getAppRequestObserver().setAppRequestedMode(
+ displayId, requestedModeId);
}
}
@@ -1319,6 +1317,28 @@ public final class DisplayManagerService extends SystemService {
return SurfaceControl.getDisplayedContentSample(token, maxFrames, timestamp);
}
+ private void onAllowedDisplayModesChangedInternal() {
+ boolean changed = false;
+ synchronized (mSyncRoot) {
+ final int count = mLogicalDisplays.size();
+ for (int i = 0; i < count; i++) {
+ LogicalDisplay display = mLogicalDisplays.valueAt(i);
+ int displayId = mLogicalDisplays.keyAt(i);
+ int[] allowedModes = mDisplayModeDirector.getAllowedModes(displayId);
+ // Note that order is important here since not all display devices are capable of
+ // automatically switching, so we do actually want to check for equality and not
+ // just equivalent contents (regardless of order).
+ if (!Arrays.equals(allowedModes, display.getAllowedDisplayModesLocked())) {
+ display.setAllowedDisplayModesLocked(allowedModes);
+ changed = true;
+ }
+ }
+ if (changed) {
+ scheduleTraversalLocked(false);
+ }
+ }
+ }
+
private void clearViewportsLocked() {
mViewports.clear();
}
@@ -1518,6 +1538,9 @@ public final class DisplayManagerService extends SystemService {
display.dumpLocked(ipw);
}
+ pw.println();
+ mDisplayModeDirector.dump(pw);
+
final int callbackCount = mCallbacks.size();
pw.println();
pw.println("Callbacks: size=" + callbackCount);
@@ -1689,8 +1712,9 @@ public final class DisplayManagerService extends SystemService {
* Returns information about the specified logical display.
*
* @param displayId The logical display id.
- * @return The logical display info, or null if the display does not exist. The
- * returned object must be treated as immutable.
+ * @return The logical display info, return {@code null} if the display does not exist or
+ * the calling UID isn't present on the display. The returned object must be treated as
+ * immutable.
*/
@Override // Binder call
public DisplayInfo getDisplayInfo(int displayId) {
@@ -1717,6 +1741,16 @@ public final class DisplayManagerService extends SystemService {
}
}
+ @Override // Binder call
+ public boolean isUidPresentOnDisplay(int uid, int displayId) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return isUidPresentOnDisplayInternal(uid, displayId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
/**
* Returns the stable device display size, in pixels.
*/
@@ -2385,11 +2419,6 @@ public final class DisplayManagerService extends SystemService {
}
@Override
- public boolean isUidPresentOnDisplay(int uid, int displayId) {
- return isUidPresentOnDisplayInternal(uid, displayId);
- }
-
- @Override
public void persistBrightnessTrackerState() {
synchronized (mSyncRoot) {
mDisplayPowerController.persistBrightnessTrackerState();
@@ -2425,4 +2454,10 @@ public final class DisplayManagerService extends SystemService {
}
}
+
+ class AllowedDisplayModeObserver implements DisplayModeDirector.Listener {
+ public void onAllowedDisplayModesChanged() {
+ onAllowedDisplayModesChangedInternal();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
new file mode 100644
index 000000000000..af4db0730071
--- /dev/null
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -0,0 +1,685 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.hardware.display.DisplayManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.Display;
+import android.view.DisplayInfo;
+
+import com.android.internal.R;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * The DisplayModeDirector is responsible for determining what modes are allowed to be
+ * automatically picked by the system based on system-wide and display-specific configuration.
+ */
+public class DisplayModeDirector {
+ private static final String TAG = "DisplayModeDirector";
+ private static final boolean DEBUG = false;
+
+ private static final int MSG_ALLOWED_MODES_CHANGED = 1;
+
+ // Special ID used to indicate that given vote is to be applied globally, rather than to a
+ // specific display.
+ private static final int GLOBAL_ID = -1;
+
+ // What we consider to be the system's "default" refresh rate.
+ private static final float DEFAULT_REFRESH_RATE = 60f;
+
+ // The tolerance within which we consider something approximately equals.
+ private static final float EPSILON = 0.001f;
+
+ private final Object mLock = new Object();
+ private final Context mContext;
+
+ private final DisplayModeDirectorHandler mHandler;
+
+ // A map from the display ID to the collection of votes and their priority. The latter takes
+ // the form of another map from the priority to the vote itself so that each priority is
+ // guaranteed to have exactly one vote, which is also easily and efficiently replaceable.
+ private final SparseArray<SparseArray<Vote>> mVotesByDisplay;
+ // A map from the display ID to the supported modes on that display.
+ private final SparseArray<Display.Mode[]> mSupportedModesByDisplay;
+ // A map from the display ID to the default mode of that display.
+ private final SparseArray<Display.Mode> mDefaultModeByDisplay;
+
+ private final AppRequestObserver mAppRequestObserver;
+ private final SettingsObserver mSettingsObserver;
+ private final DisplayObserver mDisplayObserver;
+
+
+ private Listener mListener;
+
+ public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler) {
+ mContext = context;
+ mHandler = new DisplayModeDirectorHandler(handler.getLooper());
+ mVotesByDisplay = new SparseArray<>();
+ mSupportedModesByDisplay = new SparseArray<>();
+ mDefaultModeByDisplay = new SparseArray<>();
+ mAppRequestObserver = new AppRequestObserver();
+ mSettingsObserver = new SettingsObserver(context, handler);
+ mDisplayObserver = new DisplayObserver(context, handler);
+ }
+
+ /**
+ * Tells the DisplayModeDirector to update allowed votes and begin observing relevant system
+ * state.
+ *
+ * This has to be deferred because the object may be constructed before the rest of the system
+ * is ready.
+ */
+ public void start() {
+ mSettingsObserver.observe();
+ mDisplayObserver.observe();
+ mSettingsObserver.observe();
+ synchronized (mLock) {
+ // We may have a listener already registered before the call to start, so go ahead and
+ // notify them to pick up our newly initialized state.
+ notifyAllowedModesChangedLocked();
+ }
+ }
+
+ /**
+ * Calculates the modes the system is allowed to freely switch between based on global and
+ * display-specific constraints.
+ *
+ * @param displayId The display to query for.
+ * @return The IDs of the modes the system is allowed to freely switch between.
+ */
+ @NonNull
+ public int[] getAllowedModes(int displayId) {
+ synchronized (mLock) {
+ SparseArray<Vote> votes = getVotesLocked(displayId);
+ Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
+ Display.Mode defaultMode = mDefaultModeByDisplay.get(displayId);
+ if (modes == null || defaultMode == null) {
+ Slog.e(TAG, "Asked about unknown display, returning empty allowed set! (id="
+ + displayId + ")");
+ return new int[0];
+ }
+ return getAllowedModesLocked(votes, modes, defaultMode);
+ }
+ }
+
+ @NonNull
+ private SparseArray<Vote> getVotesLocked(int displayId) {
+ SparseArray<Vote> displayVotes = mVotesByDisplay.get(displayId);
+ final SparseArray<Vote> votes;
+ if (displayVotes != null) {
+ votes = displayVotes.clone();
+ } else {
+ votes = new SparseArray<>();
+ }
+
+ SparseArray<Vote> globalVotes = mVotesByDisplay.get(GLOBAL_ID);
+ if (globalVotes != null) {
+ for (int i = 0; i < globalVotes.size(); i++) {
+ int priority = globalVotes.keyAt(i);
+ if (votes.indexOfKey(priority) < 0) {
+ votes.put(priority, globalVotes.valueAt(i));
+ }
+ }
+ }
+ return votes;
+ }
+
+ @NonNull
+ private int[] getAllowedModesLocked(@NonNull SparseArray<Vote> votes,
+ @NonNull Display.Mode[] modes, @NonNull Display.Mode defaultMode) {
+ int lowestConsideredPriority = Vote.MIN_PRIORITY;
+ while (lowestConsideredPriority <= Vote.MAX_PRIORITY) {
+ float minRefreshRate = 0f;
+ float maxRefreshRate = Float.POSITIVE_INFINITY;
+ int height = Vote.INVALID_SIZE;
+ int width = Vote.INVALID_SIZE;
+
+ for (int priority = Vote.MAX_PRIORITY;
+ priority >= lowestConsideredPriority;
+ priority--) {
+ Vote vote = votes.get(priority);
+ if (vote == null) {
+ continue;
+ }
+ // For refresh rates, just use the tightest bounds of all the votes
+ minRefreshRate = Math.max(minRefreshRate, vote.minRefreshRate);
+ maxRefreshRate = Math.min(maxRefreshRate, vote.maxRefreshRate);
+ // For display size, use only the first vote we come across (i.e. the highest
+ // priority vote that includes the width / height).
+ if (height == Vote.INVALID_SIZE && width == Vote.INVALID_SIZE
+ && vote.height > 0 && vote.width > 0) {
+ width = vote.width;
+ height = vote.height;
+ }
+ }
+
+ // If we don't have anything specifying the width / height of the display, just use the
+ // default width and height. We don't want these switching out from underneath us since
+ // it's a pretty disruptive behavior.
+ if (height == Vote.INVALID_SIZE || width == Vote.INVALID_SIZE) {
+ width = defaultMode.getPhysicalWidth();
+ height = defaultMode.getPhysicalHeight();
+ }
+
+ int[] availableModes =
+ filterModes(modes, width, height, minRefreshRate, maxRefreshRate);
+ if (availableModes.length > 0) {
+ if (DEBUG) {
+ Slog.w(TAG, "Found available modes=" + Arrays.toString(availableModes)
+ + " with lowest priority considered "
+ + Vote.priorityToString(lowestConsideredPriority)
+ + " and constraints: "
+ + "width=" + width
+ + ", height=" + height
+ + ", minRefreshRate=" + minRefreshRate
+ + ", maxRefreshRate=" + maxRefreshRate);
+ }
+ return availableModes;
+ }
+
+ if (DEBUG) {
+ Slog.w(TAG, "Couldn't find available modes with lowest priority set to "
+ + Vote.priorityToString(lowestConsideredPriority)
+ + " and with the following constraints: "
+ + "width=" + width
+ + ", height=" + height
+ + ", minRefreshRate=" + minRefreshRate
+ + ", maxRefreshRate=" + maxRefreshRate);
+ }
+ // If we haven't found anything with the current set of votes, drop the current lowest
+ // priority vote.
+ lowestConsideredPriority++;
+ }
+
+ // If we still haven't found anything that matches our current set of votes, just fall back
+ // to the default mode.
+ return new int[] { defaultMode.getModeId() };
+ }
+
+ private int[] filterModes(Display.Mode[] supportedModes,
+ int width, int height, float minRefreshRate, float maxRefreshRate) {
+ ArrayList<Display.Mode> availableModes = new ArrayList<>();
+ for (Display.Mode mode : supportedModes) {
+ if (mode.getPhysicalWidth() != width || mode.getPhysicalHeight() != height) {
+ if (DEBUG) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
+ + ": desiredWidth=" + width
+ + ": desiredHeight=" + height
+ + ": actualWidth=" + mode.getPhysicalWidth()
+ + ": actualHeight=" + mode.getPhysicalHeight());
+ }
+ continue;
+ }
+ final float refreshRate = mode.getRefreshRate();
+ // Some refresh rates are calculated based on frame timings, so they aren't *exactly*
+ // equal to expected refresh rate. Given that, we apply a bit of tolerance to this
+ // comparison.
+ if (refreshRate < (minRefreshRate - EPSILON)
+ || refreshRate > (maxRefreshRate + EPSILON)) {
+ if (DEBUG) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside refresh rate bounds"
+ + ": minRefreshRate=" + minRefreshRate
+ + ", maxRefreshRate=" + maxRefreshRate
+ + ", modeRefreshRate=" + refreshRate);
+ }
+ continue;
+ }
+ availableModes.add(mode);
+ }
+ final int size = availableModes.size();
+ int[] availableModeIds = new int[size];
+ for (int i = 0; i < size; i++) {
+ availableModeIds[i] = availableModes.get(i).getModeId();
+ }
+ return availableModeIds;
+ }
+
+ /**
+ * Gets the observer responsible for application display mode requests.
+ */
+ @NonNull
+ public AppRequestObserver getAppRequestObserver() {
+ // We don't need to lock here because mAppRequestObserver is a final field, which is
+ // guaranteed to be visible on all threads after construction.
+ return mAppRequestObserver;
+ }
+
+ /**
+ * Sets the listener for changes to allowed display modes.
+ */
+ public void setListener(@Nullable Listener listener) {
+ synchronized (mLock) {
+ mListener = listener;
+ }
+ }
+
+ /**
+ * Print the object's state and debug information into the given stream.
+ *
+ * @param pw The stream to dump information to.
+ */
+ public void dump(PrintWriter pw) {
+ pw.println("DisplayModeDirector");
+ synchronized (mLock) {
+ pw.println(" mSupportedModesByDisplay:");
+ for (int i = 0; i < mSupportedModesByDisplay.size(); i++) {
+ final int id = mSupportedModesByDisplay.keyAt(i);
+ final Display.Mode[] modes = mSupportedModesByDisplay.valueAt(i);
+ pw.println(" " + id + " -> " + Arrays.toString(modes));
+ }
+ pw.println(" mDefaultModeByDisplay:");
+ for (int i = 0; i < mDefaultModeByDisplay.size(); i++) {
+ final int id = mDefaultModeByDisplay.keyAt(i);
+ final Display.Mode mode = mDefaultModeByDisplay.valueAt(i);
+ pw.println(" " + id + " -> " + mode);
+ }
+ pw.println(" mVotesByDisplay:");
+ for (int i = 0; i < mVotesByDisplay.size(); i++) {
+ pw.println(" " + mVotesByDisplay.keyAt(i) + ":");
+ SparseArray<Vote> votes = mVotesByDisplay.valueAt(i);
+ for (int p = Vote.MAX_PRIORITY; p >= Vote.MIN_PRIORITY; p--) {
+ Vote vote = votes.get(p);
+ if (vote == null) {
+ continue;
+ }
+ pw.println(" " + Vote.priorityToString(p) + " -> " + vote);
+ }
+ }
+ mSettingsObserver.dumpLocked(pw);
+ mAppRequestObserver.dumpLocked(pw);
+ }
+ }
+
+ private void updateVoteLocked(int priority, Vote vote) {
+ updateVoteLocked(GLOBAL_ID, priority, vote);
+ }
+
+ private void updateVoteLocked(int displayId, int priority, Vote vote) {
+ if (DEBUG) {
+ Slog.i(TAG, "updateVoteLocked(displayId=" + displayId
+ + ", priority=" + Vote.priorityToString(priority)
+ + ", vote=" + vote + ")");
+ }
+ if (priority < Vote.MIN_PRIORITY || priority > Vote.MAX_PRIORITY) {
+ Slog.w(TAG, "Received a vote with an invalid priority, ignoring:"
+ + " priority=" + Vote.priorityToString(priority)
+ + ", vote=" + vote, new Throwable());
+ return;
+ }
+ final SparseArray<Vote> votes = getOrCreateVotesByDisplay(displayId);
+
+ Vote currentVote = votes.get(priority);
+ if (vote != null) {
+ votes.put(priority, vote);
+ } else {
+ votes.remove(priority);
+ }
+
+ if (votes.size() == 0) {
+ if (DEBUG) {
+ Slog.i(TAG, "No votes left for display " + displayId + ", removing.");
+ }
+ mVotesByDisplay.remove(displayId);
+ }
+
+ notifyAllowedModesChangedLocked();
+ }
+
+ private void notifyAllowedModesChangedLocked() {
+ if (mListener != null && !mHandler.hasMessages(MSG_ALLOWED_MODES_CHANGED)) {
+ // We need to post this to a handler to avoid calling out while holding the lock
+ // since we know there are things that both listen for changes as well as provide
+ // information. If we did call out while holding the lock, then there's no guaranteed
+ // lock order and we run the real of risk deadlock.
+ Message msg = mHandler.obtainMessage(MSG_ALLOWED_MODES_CHANGED, mListener);
+ msg.sendToTarget();
+ }
+ }
+
+ private SparseArray<Vote> getOrCreateVotesByDisplay(int displayId) {
+ int index = mVotesByDisplay.indexOfKey(displayId);
+ if (mVotesByDisplay.indexOfKey(displayId) >= 0) {
+ return mVotesByDisplay.get(displayId);
+ } else {
+ SparseArray<Vote> votes = new SparseArray<>();
+ mVotesByDisplay.put(displayId, votes);
+ return votes;
+ }
+ }
+
+ /**
+ * Listens for changes to display mode coordination.
+ */
+ public interface Listener {
+ /**
+ * Called when the allowed display modes may have changed.
+ */
+ void onAllowedDisplayModesChanged();
+ }
+
+ private static final class DisplayModeDirectorHandler extends Handler {
+ DisplayModeDirectorHandler(Looper looper) {
+ super(looper, null, true /*async*/);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ALLOWED_MODES_CHANGED:
+ Listener listener = (Listener) msg.obj;
+ listener.onAllowedDisplayModesChanged();
+ break;
+ }
+ }
+ }
+
+ private static final class Vote {
+ public static final int PRIORITY_USER_SETTING = 0;
+ // We split the app request into two priorities in case we can satisfy one desire without
+ // the other.
+ public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 1;
+ public static final int PRIORITY_APP_REQUEST_SIZE = 2;
+ public static final int PRIORITY_LOW_POWER_MODE = 3;
+
+ // Whenever a new priority is added, remember to update MIN_PRIORITY and/or MAX_PRIORITY as
+ // appropriate, as well as priorityToString.
+
+ public static final int MIN_PRIORITY = PRIORITY_USER_SETTING;
+ public static final int MAX_PRIORITY = PRIORITY_LOW_POWER_MODE;
+
+ /**
+ * A value signifying an invalid width or height in a vote.
+ */
+ public static final int INVALID_SIZE = -1;
+
+ /**
+ * The requested width of the display in pixels, or INVALID_SIZE;
+ */
+ public final int width;
+ /**
+ * The requested height of the display in pixels, or INVALID_SIZE;
+ */
+ public final int height;
+
+ /**
+ * The lowest desired refresh rate.
+ */
+ public final float minRefreshRate;
+ /**
+ * The highest desired refresh rate.
+ */
+ public final float maxRefreshRate;
+
+ public static Vote forRefreshRates(float minRefreshRate, float maxRefreshRate) {
+ return new Vote(INVALID_SIZE, INVALID_SIZE, minRefreshRate, maxRefreshRate);
+ }
+
+ public static Vote forSize(int width, int height) {
+ return new Vote(width, height, 0f, Float.POSITIVE_INFINITY);
+ }
+
+ private Vote(int width, int height,
+ float minRefreshRate, float maxRefreshRate) {
+ this.width = width;
+ this.height = height;
+ this.minRefreshRate = minRefreshRate;
+ this.maxRefreshRate = maxRefreshRate;
+ }
+
+ public static String priorityToString(int priority) {
+ switch (priority) {
+ case PRIORITY_USER_SETTING:
+ return "PRIORITY_USER_SETTING";
+ case PRIORITY_APP_REQUEST_REFRESH_RATE:
+ return "PRIORITY_APP_REQUEST_REFRESH_RATE";
+ case PRIORITY_APP_REQUEST_SIZE:
+ return "PRIORITY_APP_REQUEST_SIZE";
+ case PRIORITY_LOW_POWER_MODE:
+ return "PRIORITY_LOW_POWER_MODE";
+ default:
+ return Integer.toString(priority);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Vote{"
+ + "width=" + width
+ + ", height=" + height
+ + ", minRefreshRate=" + minRefreshRate
+ + ", maxRefreshRate=" + maxRefreshRate
+ + "}";
+ }
+ }
+
+ private final class SettingsObserver extends ContentObserver {
+ private final Uri mRefreshRateSetting =
+ Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE);
+ private final Uri mLowPowerModeSetting =
+ Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE);
+
+ private final Context mContext;
+ private final float mDefaultPeakRefreshRate;
+
+ SettingsObserver(@NonNull Context context, @NonNull Handler handler) {
+ super(handler);
+ mContext = context;
+ mDefaultPeakRefreshRate = (float) context.getResources().getInteger(
+ R.integer.config_defaultPeakRefreshRate);
+ }
+
+ public void observe() {
+ final ContentResolver cr = mContext.getContentResolver();
+ cr.registerContentObserver(mRefreshRateSetting, false /*notifyDescendants*/, this,
+ UserHandle.USER_SYSTEM);
+ cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this,
+ UserHandle.USER_SYSTEM);
+ synchronized (mLock) {
+ updateRefreshRateSettingLocked();
+ updateLowPowerModeSettingLocked();
+ }
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ synchronized (mLock) {
+ if (mRefreshRateSetting.equals(uri)) {
+ updateRefreshRateSettingLocked();
+ } else if (mLowPowerModeSetting.equals(uri)) {
+ updateLowPowerModeSettingLocked();
+ }
+ }
+ }
+
+ private void updateLowPowerModeSettingLocked() {
+ boolean inLowPowerMode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE, 0 /*default*/) != 0;
+ final Vote vote;
+ if (inLowPowerMode) {
+ vote = Vote.forRefreshRates(0f, 60f);
+ } else {
+ vote = null;
+ }
+ updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote);
+ }
+
+ private void updateRefreshRateSettingLocked() {
+ float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(),
+ Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE);
+ Vote vote = Vote.forRefreshRates(0f, peakRefreshRate);
+ updateVoteLocked(Vote.PRIORITY_USER_SETTING, vote);
+ }
+
+ public void dumpLocked(PrintWriter pw) {
+ pw.println(" SettingsObserver");
+ pw.println(" mDefaultPeakRefreshRate: " + mDefaultPeakRefreshRate);
+ }
+ }
+
+ final class AppRequestObserver {
+ private SparseArray<Display.Mode> mAppRequestedModeByDisplay;
+
+ AppRequestObserver() {
+ mAppRequestedModeByDisplay = new SparseArray<>();
+ }
+
+ public void setAppRequestedMode(int displayId, int modeId) {
+ synchronized (mLock) {
+ setAppRequestedModeLocked(displayId, modeId);
+ }
+ }
+
+ private void setAppRequestedModeLocked(int displayId, int modeId) {
+ final Display.Mode requestedMode = findModeByIdLocked(displayId, modeId);
+ if (Objects.equals(requestedMode, mAppRequestedModeByDisplay.get(displayId))) {
+ return;
+ }
+
+ final Vote refreshRateVote;
+ final Vote sizeVote;
+ if (requestedMode != null) {
+ mAppRequestedModeByDisplay.put(displayId, requestedMode);
+ float refreshRate = requestedMode.getRefreshRate();
+ refreshRateVote = Vote.forRefreshRates(refreshRate, refreshRate);
+ sizeVote = Vote.forSize(requestedMode.getPhysicalWidth(),
+ requestedMode.getPhysicalHeight());
+ } else {
+ mAppRequestedModeByDisplay.remove(displayId);
+ refreshRateVote = null;
+ sizeVote = null;
+ }
+ updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, refreshRateVote);
+ updateVoteLocked(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
+ return;
+ }
+
+ private Display.Mode findModeByIdLocked(int displayId, int modeId) {
+ Display.Mode[] modes = mSupportedModesByDisplay.get(displayId);
+ if (modes == null) {
+ return null;
+ }
+ for (Display.Mode mode : modes) {
+ if (mode.getModeId() == modeId) {
+ return mode;
+ }
+ }
+ return null;
+ }
+
+ public void dumpLocked(PrintWriter pw) {
+ pw.println(" AppRequestObserver");
+ pw.println(" mAppRequestedModeByDisplay:");
+ for (int i = 0; i < mAppRequestedModeByDisplay.size(); i++) {
+ final int id = mAppRequestedModeByDisplay.keyAt(i);
+ final Display.Mode mode = mAppRequestedModeByDisplay.valueAt(i);
+ pw.println(" " + id + " -> " + mode);
+ }
+ }
+ }
+
+ private final class DisplayObserver implements DisplayManager.DisplayListener {
+ // Note that we can never call into DisplayManager or any of the non-POD classes it
+ // returns, while holding mLock since it may call into DMS, which might be simultaneously
+ // calling into us already holding its own lock.
+ private final Context mContext;
+ private final Handler mHandler;
+
+ DisplayObserver(Context context, Handler handler) {
+ mContext = context;
+ mHandler = handler;
+ }
+
+ public void observe() {
+ DisplayManager dm = mContext.getSystemService(DisplayManager.class);
+ dm.registerDisplayListener(this, mHandler);
+
+ // Populate existing displays
+ SparseArray<Display.Mode[]> modes = new SparseArray<>();
+ SparseArray<Display.Mode> defaultModes = new SparseArray<>();
+ DisplayInfo info = new DisplayInfo();
+ Display[] displays = dm.getDisplays();
+ for (Display d : displays) {
+ final int displayId = d.getDisplayId();
+ d.getDisplayInfo(info);
+ modes.put(displayId, info.supportedModes);
+ defaultModes.put(displayId, info.getDefaultMode());
+ }
+ synchronized (mLock) {
+ final int size = modes.size();
+ for (int i = 0; i < size; i++) {
+ mSupportedModesByDisplay.put(modes.keyAt(i), modes.valueAt(i));
+ mDefaultModeByDisplay.put(defaultModes.keyAt(i), defaultModes.valueAt(i));
+ }
+ }
+ }
+
+ @Override
+ public void onDisplayAdded(int displayId) {
+ updateDisplayModes(displayId);
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ synchronized (mLock) {
+ mSupportedModesByDisplay.remove(displayId);
+ mDefaultModeByDisplay.remove(displayId);
+ }
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ updateDisplayModes(displayId);
+ }
+
+ private void updateDisplayModes(int displayId) {
+ Display d = mContext.getSystemService(DisplayManager.class).getDisplay(displayId);
+ DisplayInfo info = new DisplayInfo();
+ d.getDisplayInfo(info);
+ boolean changed = false;
+ synchronized (mLock) {
+ if (!Arrays.equals(mSupportedModesByDisplay.get(displayId), info.supportedModes)) {
+ mSupportedModesByDisplay.put(displayId, info.supportedModes);
+ changed = true;
+ }
+ if (!Objects.equals(mDefaultModeByDisplay.get(displayId), info.getDefaultMode())) {
+ changed = true;
+ mDefaultModeByDisplay.put(displayId, info.getDefaultMode());
+ }
+ if (changed) {
+ notifyAllowedModesChangedLocked();
+ }
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 77df10bf536a..5e5ef26f6624 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -112,16 +112,18 @@ final class LocalDisplayAdapter extends DisplayAdapter {
activeColorMode = Display.COLOR_MODE_INVALID;
}
int[] colorModes = SurfaceControl.getDisplayColorModes(displayToken);
+ int[] allowedConfigs = SurfaceControl.getAllowedDisplayConfigs(displayToken);
LocalDisplayDevice device = mDevices.get(physicalDisplayId);
if (device == null) {
// Display was added.
final boolean isInternal = mDevices.size() == 0;
device = new LocalDisplayDevice(displayToken, physicalDisplayId,
- configs, activeConfig, colorModes, activeColorMode, isInternal);
+ configs, activeConfig, allowedConfigs, colorModes, activeColorMode,
+ isInternal);
mDevices.put(physicalDisplayId, device);
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
} else if (device.updatePhysicalDisplayInfoLocked(configs, activeConfig,
- colorModes, activeColorMode)) {
+ allowedConfigs, colorModes, activeColorMode)) {
// Display properties changed.
sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_CHANGED);
}
@@ -167,26 +169,30 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private boolean mHavePendingChanges;
private int mState = Display.STATE_UNKNOWN;
private int mBrightness = PowerManager.BRIGHTNESS_DEFAULT;
- private int mActivePhysIndex;
private int mDefaultModeId;
private int mActiveModeId;
private boolean mActiveModeInvalid;
+ private int[] mAllowedModeIds;
+ private boolean mAllowedModeIdsInvalid;
+ private int mActivePhysIndex;
+ private int[] mAllowedPhysIndexes;
private int mActiveColorMode;
private boolean mActiveColorModeInvalid;
private Display.HdrCapabilities mHdrCapabilities;
private boolean mSidekickActive;
private SidekickInternal mSidekickInternal;
- private SurfaceControl.PhysicalDisplayInfo mDisplayInfos[];
+ private SurfaceControl.PhysicalDisplayInfo[] mDisplayInfos;
LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
SurfaceControl.PhysicalDisplayInfo[] physicalDisplayInfos, int activeDisplayInfo,
- int[] colorModes, int activeColorMode, boolean isInternal) {
+ int[] allowedDisplayInfos, int[] colorModes, int activeColorMode,
+ boolean isInternal) {
super(LocalDisplayAdapter.this, displayToken, UNIQUE_ID_PREFIX + physicalDisplayId);
mPhysicalDisplayId = physicalDisplayId;
mIsInternal = isInternal;
updatePhysicalDisplayInfoLocked(physicalDisplayInfos, activeDisplayInfo,
- colorModes, activeColorMode);
+ allowedDisplayInfos, colorModes, activeColorMode);
updateColorModesLocked(colorModes, activeColorMode);
mSidekickInternal = LocalServices.getService(SidekickInternal.class);
if (mIsInternal) {
@@ -205,9 +211,10 @@ final class LocalDisplayAdapter extends DisplayAdapter {
public boolean updatePhysicalDisplayInfoLocked(
SurfaceControl.PhysicalDisplayInfo[] physicalDisplayInfos, int activeDisplayInfo,
- int[] colorModes, int activeColorMode) {
+ int[] allowedDisplayInfos, int[] colorModes, int activeColorMode) {
mDisplayInfos = Arrays.copyOf(physicalDisplayInfos, physicalDisplayInfos.length);
mActivePhysIndex = activeDisplayInfo;
+ mAllowedPhysIndexes = Arrays.copyOf(allowedDisplayInfos, allowedDisplayInfos.length);
// Build an updated list of all existing modes.
ArrayList<DisplayModeRecord> records = new ArrayList<DisplayModeRecord>();
boolean modesAdded = false;
@@ -246,8 +253,9 @@ final class LocalDisplayAdapter extends DisplayAdapter {
break;
}
}
- // Check whether surface flinger spontaneously changed modes out from under us. Schedule
- // traversals to ensure that the correct state is reapplied if necessary.
+
+ // Check whether surface flinger spontaneously changed modes out from under us.
+ // Schedule traversals to ensure that the correct state is reapplied if necessary.
if (mActiveModeId != 0
&& mActiveModeId != activeRecord.mMode.getModeId()) {
mActiveModeInvalid = true;
@@ -266,6 +274,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
for (DisplayModeRecord record : records) {
mSupportedModes.put(record.mMode.getModeId(), record);
}
+
// Update the default mode, if needed.
if (findDisplayInfoIndexLocked(mDefaultModeId) < 0) {
if (mDefaultModeId != 0) {
@@ -274,6 +283,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
mDefaultModeId = activeRecord.mMode.getModeId();
}
+
// Determine whether the active mode is still there.
if (mSupportedModes.indexOfKey(mActiveModeId) < 0) {
if (mActiveModeId != 0) {
@@ -284,6 +294,21 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mActiveModeInvalid = true;
}
+ // Determine what the currently allowed modes are
+ mAllowedModeIds = new int[] { mActiveModeId };
+ int[] allowedModeIds = new int[mAllowedPhysIndexes.length];
+ int size = 0;
+ for (int physIndex : mAllowedPhysIndexes) {
+ int modeId = findMatchingModeIdLocked(physIndex);
+ if (modeId > 0) {
+ allowedModeIds[size++] = modeId;
+ }
+ }
+
+ // If this is different from our desired allowed modes, then mark our current set as
+ // invalid so we correct this on the next traversal.
+ mAllowedModeIdsInvalid = !Arrays.equals(allowedModeIds, mAllowedModeIds);
+
// Schedule traversals so that we apply pending changes.
sendTraversalRequestLocked();
return true;
@@ -368,11 +393,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
mInfo.height = phys.height;
mInfo.modeId = mActiveModeId;
mInfo.defaultModeId = mDefaultModeId;
- mInfo.supportedModes = new Display.Mode[mSupportedModes.size()];
- for (int i = 0; i < mSupportedModes.size(); i++) {
- DisplayModeRecord record = mSupportedModes.valueAt(i);
- mInfo.supportedModes[i] = record.mMode;
- }
+ mInfo.supportedModes = getDisplayModes(mSupportedModes);
mInfo.colorMode = mActiveColorMode;
mInfo.supportedColorModes =
new int[mSupportedColorModes.size()];
@@ -593,44 +614,104 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
@Override
- public void requestDisplayModesLocked(int colorMode, int modeId) {
- if (requestModeLocked(modeId) ||
- requestColorModeLocked(colorMode)) {
+ public void setRequestedColorModeLocked(int colorMode) {
+ if (requestColorModeLocked(colorMode)) {
updateDeviceInfoLocked();
}
}
@Override
+ public void setAllowedDisplayModesLocked(int[] modes) {
+ updateAllowedModesLocked(modes);
+ }
+
+ @Override
public void onOverlayChangedLocked() {
updateDeviceInfoLocked();
}
- public boolean requestModeLocked(int modeId) {
- if (modeId == 0) {
- modeId = mDefaultModeId;
- } else if (mSupportedModes.indexOfKey(modeId) < 0) {
- Slog.w(TAG, "Requested mode " + modeId + " is not supported by this display,"
- + " reverting to default display mode.");
- modeId = mDefaultModeId;
+ public void onActivePhysicalDisplayModeChangedLocked(int physIndex) {
+ if (updateActiveModeLocked(physIndex)) {
+ updateDeviceInfoLocked();
}
+ }
- int physIndex = findDisplayInfoIndexLocked(modeId);
- if (physIndex < 0) {
- Slog.w(TAG, "Requested mode ID " + modeId + " not available,"
- + " trying with default mode ID");
- modeId = mDefaultModeId;
- physIndex = findDisplayInfoIndexLocked(modeId);
- }
- if (mActivePhysIndex == physIndex) {
+ public boolean updateActiveModeLocked(int activePhysIndex) {
+ if (mActivePhysIndex == activePhysIndex) {
return false;
}
- SurfaceControl.setActiveConfig(getDisplayTokenLocked(), physIndex);
- mActivePhysIndex = physIndex;
- mActiveModeId = modeId;
- mActiveModeInvalid = false;
+ mActivePhysIndex = activePhysIndex;
+ mActiveModeId = findMatchingModeIdLocked(activePhysIndex);
+ mActiveModeInvalid = mActiveModeId == 0;
+ if (mActiveModeInvalid) {
+ Slog.w(TAG, "In unknown mode after setting allowed configs"
+ + ": allowedPhysIndexes=" + mAllowedPhysIndexes
+ + ", activePhysIndex=" + mActivePhysIndex);
+ }
return true;
}
+ public void updateAllowedModesLocked(int[] allowedModes) {
+ if (Arrays.equals(allowedModes, mAllowedModeIds) && !mAllowedModeIdsInvalid) {
+ return;
+ }
+ if (updateAllowedModesInternalLocked(allowedModes)) {
+ updateDeviceInfoLocked();
+ }
+ }
+
+ public boolean updateAllowedModesInternalLocked(int[] allowedModes) {
+ if (DEBUG) {
+ Slog.w(TAG, "updateAllowedModesInternalLocked(allowedModes="
+ + Arrays.toString(allowedModes) + ")");
+ }
+ int[] allowedPhysIndexes = new int[allowedModes.length];
+ int size = 0;
+ for (int modeId : allowedModes) {
+ int physIndex = findDisplayInfoIndexLocked(modeId);
+ if (physIndex < 0) {
+ Slog.w(TAG, "Requested mode ID " + modeId + " not available,"
+ + " dropping from allowed set.");
+ } else {
+ allowedPhysIndexes[size++] = physIndex;
+ }
+ }
+
+ // If we couldn't find one or more of the suggested allowed modes then we need to
+ // shrink the array to its actual size.
+ if (size != allowedModes.length) {
+ allowedPhysIndexes = Arrays.copyOf(allowedPhysIndexes, size);
+ }
+
+ // If we found no suitable modes, then we try again with the default mode which we
+ // assume has a suitable physical config.
+ if (size == 0) {
+ if (DEBUG) {
+ Slog.w(TAG, "No valid modes allowed, falling back to default mode (id="
+ + mDefaultModeId + ")");
+ }
+ allowedModes = new int[] { mDefaultModeId };
+ allowedPhysIndexes = new int[] { findDisplayInfoIndexLocked(mDefaultModeId) };
+ }
+
+ mAllowedModeIds = allowedModes;
+ mAllowedModeIdsInvalid = false;
+
+ if (Arrays.equals(mAllowedPhysIndexes, allowedPhysIndexes)) {
+ return false;
+ }
+ mAllowedPhysIndexes = allowedPhysIndexes;
+
+ if (DEBUG) {
+ Slog.w(TAG, "Setting allowed physical configs: allowedPhysIndexes="
+ + Arrays.toString(allowedPhysIndexes));
+ }
+
+ SurfaceControl.setAllowedDisplayConfigs(getDisplayTokenLocked(), allowedPhysIndexes);
+ int activePhysIndex = SurfaceControl.getActiveConfig(getDisplayTokenLocked());
+ return updateActiveModeLocked(activePhysIndex);
+ }
+
public boolean requestColorModeLocked(int colorMode) {
if (mActiveColorMode == colorMode) {
return false;
@@ -650,9 +731,13 @@ final class LocalDisplayAdapter extends DisplayAdapter {
public void dumpLocked(PrintWriter pw) {
super.dumpLocked(pw);
pw.println("mPhysicalDisplayId=" + mPhysicalDisplayId);
+ pw.println("mAllowedPhysIndexes=" + Arrays.toString(mAllowedPhysIndexes));
+ pw.println("mAllowedModeIds=" + Arrays.toString(mAllowedModeIds));
+ pw.println("mAllowedModeIdsInvalid=" + mAllowedModeIdsInvalid);
pw.println("mActivePhysIndex=" + mActivePhysIndex);
pw.println("mActiveModeId=" + mActiveModeId);
pw.println("mActiveColorMode=" + mActiveColorMode);
+ pw.println("mDefaultModeId=" + mDefaultModeId);
pw.println("mState=" + Display.stateToString(mState));
pw.println("mBrightness=" + mBrightness);
pw.println("mBacklight=" + mBacklight);
@@ -687,10 +772,31 @@ final class LocalDisplayAdapter extends DisplayAdapter {
return -1;
}
+ private int findMatchingModeIdLocked(int physIndex) {
+ SurfaceControl.PhysicalDisplayInfo info = mDisplayInfos[physIndex];
+ for (int i = 0; i < mSupportedModes.size(); i++) {
+ DisplayModeRecord record = mSupportedModes.valueAt(i);
+ if (record.hasMatchingMode(info)) {
+ return record.mMode.getModeId();
+ }
+ }
+ return 0;
+ }
+
private void updateDeviceInfoLocked() {
mInfo = null;
sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED);
}
+
+ private Display.Mode[] getDisplayModes(SparseArray<DisplayModeRecord> records) {
+ final int size = records.size();
+ Display.Mode[] modes = new Display.Mode[size];
+ for (int i = 0; i < size; i++) {
+ DisplayModeRecord record = records.valueAt(i);
+ modes[i] = record.mMode;
+ }
+ return modes;
+ }
}
/** Supplies a context whose Resources apply runtime-overlays */
@@ -745,12 +851,23 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
@Override
- public void onConfigChanged(long timestampNanos, long physicalDisplayId, int configId) {
+ public void onConfigChanged(long timestampNanos, long physicalDisplayId, int physIndex) {
if (DEBUG) {
Slog.d(TAG, "onConfigChanged("
+ "timestampNanos=" + timestampNanos
- + ", builtInDisplayId=" + physicalDisplayId
- + ", configId=" + configId + ")");
+ + ", physicalDisplayId=" + physicalDisplayId
+ + ", physIndex=" + physIndex + ")");
+ }
+ synchronized (getSyncRoot()) {
+ LocalDisplayDevice device = mDevices.get(physicalDisplayId);
+ if (device == null) {
+ if (DEBUG) {
+ Slog.d(TAG, "Received config change for unhandled physical display: "
+ + "physicalDisplayId=" + physicalDisplayId);
+ }
+ return;
+ }
+ device.onActivePhysicalDisplayModeChangedLocked(physIndex);
}
}
}
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 7ee842260d3b..a7b90510e6c8 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -87,7 +87,7 @@ final class LogicalDisplay {
// True if the logical display has unique content.
private boolean mHasContent;
- private int mRequestedModeId;
+ private int[] mAllowedDisplayModes = new int[0];
private int mRequestedColorMode;
// The display offsets to apply to the display projection.
@@ -301,6 +301,7 @@ final class LogicalDisplay {
boolean maskCutout =
(deviceInfo.flags & DisplayDeviceInfo.FLAG_MASK_DISPLAY_CUTOUT) != 0;
mBaseDisplayInfo.displayCutout = maskCutout ? null : deviceInfo.displayCutout;
+ mBaseDisplayInfo.displayId = mDisplayId;
mPrimaryDisplayDeviceInfo = deviceInfo;
mInfo = null;
@@ -353,12 +354,14 @@ final class LogicalDisplay {
// Set the layer stack.
device.setLayerStackLocked(t, isBlanked ? BLANK_LAYER_STACK : mLayerStack);
- // Set the color mode and mode.
+ // Set the color mode and allowed display mode.
if (device == mPrimaryDisplayDevice) {
- device.requestDisplayModesLocked(
- mRequestedColorMode, mRequestedModeId);
+ device.setAllowedDisplayModesLocked(mAllowedDisplayModes);
+ device.setRequestedColorModeLocked(mRequestedColorMode);
} else {
- device.requestDisplayModesLocked(0, 0); // Revert to default.
+ // Reset to default for non primary displays
+ device.setAllowedDisplayModesLocked(new int[] {0});
+ device.setRequestedColorModeLocked(0);
}
// Only grab the display info now as it may have been changed based on the requests above.
@@ -462,17 +465,17 @@ final class LogicalDisplay {
}
/**
- * Requests the given mode.
+ * Sets the display modes the system is free to switch between.
*/
- public void setRequestedModeIdLocked(int modeId) {
- mRequestedModeId = modeId;
+ public void setAllowedDisplayModesLocked(int[] modes) {
+ mAllowedDisplayModes = modes;
}
/**
- * Returns the pending requested mode.
+ * Returns the display modes the system is free to switch between.
*/
- public int getRequestedModeIdLocked() {
- return mRequestedModeId;
+ public int[] getAllowedDisplayModesLocked() {
+ return mAllowedDisplayModes;
}
/**
@@ -531,7 +534,7 @@ final class LogicalDisplay {
pw.println("mDisplayId=" + mDisplayId);
pw.println("mLayerStack=" + mLayerStack);
pw.println("mHasContent=" + mHasContent);
- pw.println("mRequestedMode=" + mRequestedModeId);
+ pw.println("mAllowedDisplayModes=" + Arrays.toString(mAllowedDisplayModes));
pw.println("mRequestedColorMode=" + mRequestedColorMode);
pw.println("mDisplayOffset=(" + mDisplayOffsetX + ", " + mDisplayOffsetY + ")");
pw.println("mDisplayScalingDisabled=" + mDisplayScalingDisabled);
diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
index 2f507d17730e..60cfbd0da2c3 100644
--- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
@@ -16,9 +16,6 @@
package com.android.server.display;
-import com.android.internal.util.DumpUtils;
-import com.android.internal.util.IndentingPrintWriter;
-
import android.content.Context;
import android.database.ContentObserver;
import android.graphics.SurfaceTexture;
@@ -32,6 +29,9 @@ import android.view.Gravity;
import android.view.Surface;
import android.view.SurfaceControl;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -315,7 +315,16 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
}
@Override
- public void requestDisplayModesLocked(int color, int id) {
+ public void setAllowedDisplayModesLocked(int[] modes) {
+ final int id;
+ if (modes.length > 0) {
+ // The allowed modes should be ordered by preference, so just use the first mode
+ // here.
+ id = modes[0];
+ } else {
+ // If we don't have any allowed modes, just use the default mode.
+ id = 0;
+ }
int index = -1;
if (id == 0) {
// Use the default.
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 96ba0841855c..b4a93d3bf08d 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -64,7 +64,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.graphics.drawable.Drawable;
-import android.hardware.display.DisplayManagerInternal;
import android.inputmethodservice.InputMethodService;
import android.net.Uri;
import android.os.Binder;
@@ -99,8 +98,6 @@ import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.Slog;
import android.view.ContextThemeWrapper;
-import android.view.Display;
-import android.view.DisplayInfo;
import android.view.IWindowManager;
import android.view.InputChannel;
import android.view.LayoutInflater;
@@ -1374,13 +1371,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mIWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
- final DisplayManagerInternal displayManagerInternal = LocalServices.getService(
- DisplayManagerInternal.class);
- mImeDisplayValidator = (displayId) -> {
- final DisplayInfo displayInfo = displayManagerInternal.getDisplayInfo(displayId);
- return displayInfo != null
- && (displayInfo.flags & Display.FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0;
- };
+ mImeDisplayValidator = mWindowManagerInternal::shouldShowSystemDecorOnDisplay;
mCaller = new HandlerCaller(context, null, new HandlerCaller.Callback() {
@Override
public void executeMessage(Message msg) {
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index ae915037947e..71ec5b00608e 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -600,12 +600,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
// while IO initialization and registration is delegated to our internal handler
// this approach is just fine because events are posted to our handler anyway
mGnssConfiguration = new GnssConfiguration(mContext);
- sendMessage(INITIALIZE_HANDLER, 0, null);
-
- // Create a GPS net-initiated handler.
+ // Create a GPS net-initiated handler (also needed by handleInitialize)
mNIHandler = new GpsNetInitiatedHandler(context,
mNetInitiatedListener,
mSuplEsEnabled);
+ sendMessage(INITIALIZE_HANDLER, 0, null);
mGnssStatusListenerHelper = new GnssStatusListenerHelper(mContext, mHandler) {
@Override
diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
index 85a3ba1a8559..64f31cd2b119 100644
--- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
+++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java
@@ -31,10 +31,12 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserManager;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
+import com.android.server.SystemConfig;
import java.io.FileDescriptor;
@@ -55,10 +57,13 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub {
private final Object mLock = new Object();
private final Context mContext;
private final AppOpsManager mAppOps;
+ private final ArraySet<String> mBugreportWhitelistedPackages;
BugreportManagerServiceImpl(Context context) {
mContext = context;
mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ mBugreportWhitelistedPackages =
+ SystemConfig.getInstance().getBugreportWhitelistedPackages();
}
@Override
@@ -88,6 +93,10 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub {
int callingUid = Binder.getCallingUid();
mAppOps.checkPackage(callingUid, callingPackage);
+ if (!mBugreportWhitelistedPackages.contains(callingPackage)) {
+ throw new SecurityException(
+ callingPackage + " is not whitelisted to use Bugreport API");
+ }
synchronized (mLock) {
startBugreportLocked(callingUid, callingPackage, bugreportFd, screenshotFd,
bugreportMode, listener);
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 447234ed290b..1d6e5818389b 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -1473,6 +1473,13 @@ public final class DefaultPermissionGrantPolicy {
if (packageExceptions == null) {
// The package must be on the system image
PackageInfo packageInfo = getSystemPackageInfo(packageName);
+
+ if (packageInfo == null) {
+ Log.w(TAG, "No such package:" + packageName);
+ XmlUtils.skipCurrentTag(parser);
+ continue;
+ }
+
if (!isSystemPackage(packageInfo)) {
Log.w(TAG, "Unknown system package:" + packageName);
XmlUtils.skipCurrentTag(parser);
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
index 94bb3ea09d93..5adcf352e260 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java
@@ -384,7 +384,7 @@ public class BatterySaverController implements BatterySaverPolicyListener {
* - When battery saver is on and the battery saver policy changes.
* - When adaptive battery saver becomes activated.
* - When adaptive battery saver becomes deactivated.
- * - When adaptive battery saver policy changes.
+ * - When adaptive battery saver is active (and full is off) and the policy changes.
*/
void handleBatterySaverStateChanged(boolean sendBroadcast, int reason) {
final LowPowerModeListener[] listeners;
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
index 36f18f05c23e..56e1d080a988 100644
--- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -18,7 +18,6 @@ package com.android.server.rollback;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.PackageRollbackInfo.RestoreInfo;
-import android.content.rollback.RollbackInfo;
import android.os.storage.StorageManager;
import android.util.IntArray;
import android.util.Log;
@@ -30,9 +29,11 @@ import com.android.server.pm.Installer.InstallerException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Encapsulates the logic for initiating userdata snapshots and rollbacks via installd.
@@ -153,7 +154,7 @@ public class AppDataRollbackHelper {
}
/**
- * Computes the list of pending backups for {@code userId} given lists of available rollbacks.
+ * Computes the list of pending backups for {@code userId} given lists of rollbacks.
* Packages pending backup for the given user are added to {@code pendingBackupPackages} along
* with their corresponding {@code PackageRollbackInfo}.
*
@@ -162,10 +163,10 @@ public class AppDataRollbackHelper {
*/
private static List<RollbackData> computePendingBackups(int userId,
Map<String, PackageRollbackInfo> pendingBackupPackages,
- List<RollbackData> availableRollbacks) {
+ List<RollbackData> rollbacks) {
List<RollbackData> rd = new ArrayList<>();
- for (RollbackData data : availableRollbacks) {
+ for (RollbackData data : rollbacks) {
for (PackageRollbackInfo info : data.info.getPackages()) {
final IntArray pendingBackupUsers = info.getPendingBackups();
if (pendingBackupUsers != null) {
@@ -183,20 +184,20 @@ public class AppDataRollbackHelper {
}
/**
- * Computes the list of pending restores for {@code userId} given lists of recent rollbacks.
+ * Computes the list of pending restores for {@code userId} given lists of rollbacks.
* Packages pending restore are added to {@code pendingRestores} along with their corresponding
* {@code PackageRollbackInfo}.
*
- * @return the list of {@code RollbackInfo} that has pending restores. Note that some of the
+ * @return the list of {@code RollbackData} that has pending restores. Note that some of the
* restores won't be performed, because they might be counteracted by pending backups.
*/
- private static List<RollbackInfo> computePendingRestores(int userId,
+ private static List<RollbackData> computePendingRestores(int userId,
Map<String, PackageRollbackInfo> pendingRestorePackages,
- List<RollbackInfo> recentRollbacks) {
- List<RollbackInfo> rd = new ArrayList<>();
+ List<RollbackData> rollbacks) {
+ List<RollbackData> rd = new ArrayList<>();
- for (RollbackInfo data : recentRollbacks) {
- for (PackageRollbackInfo info : data.getPackages()) {
+ for (RollbackData data : rollbacks) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final RestoreInfo ri = info.getRestoreInfo(userId);
if (ri != null) {
pendingRestorePackages.put(info.getPackageName(), info);
@@ -215,18 +216,18 @@ public class AppDataRollbackHelper {
* backups updates corresponding {@code changedRollbackData} with a mapping from {@code userId}
* to a inode of theirs CE user data snapshot.
*
- * @return a list {@code RollbackData} that have been changed and should be stored on disk.
+ * @return the set of {@code RollbackData} that have been changed and should be stored on disk.
*/
- public List<RollbackData> commitPendingBackupAndRestoreForUser(int userId,
- List<RollbackData> availableRollbacks, List<RollbackInfo> recentlyExecutedRollbacks) {
+ public Set<RollbackData> commitPendingBackupAndRestoreForUser(int userId,
+ List<RollbackData> rollbacks) {
final Map<String, PackageRollbackInfo> pendingBackupPackages = new HashMap<>();
final List<RollbackData> pendingBackups = computePendingBackups(userId,
- pendingBackupPackages, availableRollbacks);
+ pendingBackupPackages, rollbacks);
final Map<String, PackageRollbackInfo> pendingRestorePackages = new HashMap<>();
- final List<RollbackInfo> pendingRestores = computePendingRestores(userId,
- pendingRestorePackages, recentlyExecutedRollbacks);
+ final List<RollbackData> pendingRestores = computePendingRestores(userId,
+ pendingRestorePackages, rollbacks);
// First remove unnecessary backups, i.e. when user did not unlock their phone between the
// request to backup data and the request to restore it.
@@ -266,13 +267,13 @@ public class AppDataRollbackHelper {
}
if (!pendingRestorePackages.isEmpty()) {
- for (RollbackInfo data : pendingRestores) {
- for (PackageRollbackInfo info : data.getPackages()) {
+ for (RollbackData data : pendingRestores) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
final RestoreInfo ri = info.getRestoreInfo(userId);
if (ri != null) {
try {
mInstaller.restoreAppDataSnapshot(info.getPackageName(), ri.appId,
- ri.seInfo, userId, data.getRollbackId(),
+ ri.seInfo, userId, data.info.getRollbackId(),
Installer.FLAG_STORAGE_CE);
info.removeRestoreInfo(ri);
} catch (InstallerException ie) {
@@ -284,7 +285,9 @@ public class AppDataRollbackHelper {
}
}
- return pendingBackups;
+ final Set<RollbackData> changed = new HashSet<>(pendingBackups);
+ changed.addAll(pendingRestores);
+ return changed;
}
/**
diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java
index 655bf4ab57a7..8a95877be71d 100644
--- a/services/core/java/com/android/server/rollback/RollbackData.java
+++ b/services/core/java/com/android/server/rollback/RollbackData.java
@@ -16,9 +16,13 @@
package com.android.server.rollback;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.content.rollback.RollbackInfo;
import java.io.File;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.time.Instant;
import java.util.ArrayList;
@@ -27,6 +31,30 @@ import java.util.ArrayList;
* packages.
*/
class RollbackData {
+ @IntDef(flag = true, prefix = { "ROLLBACK_STATE_" }, value = {
+ ROLLBACK_STATE_ENABLING,
+ ROLLBACK_STATE_AVAILABLE,
+ ROLLBACK_STATE_COMMITTED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface RollbackState {}
+
+ /**
+ * The rollback is in the process of being enabled. It is not yet
+ * available for use.
+ */
+ static final int ROLLBACK_STATE_ENABLING = 0;
+
+ /**
+ * The rollback is currently available.
+ */
+ static final int ROLLBACK_STATE_AVAILABLE = 1;
+
+ /**
+ * The rollback has been committed.
+ */
+ static final int ROLLBACK_STATE_COMMITTED = 3;
+
/**
* The rollback info for this rollback.
*/
@@ -40,22 +68,23 @@ class RollbackData {
/**
* The time when the upgrade occurred, for purposes of expiring
* rollback data.
+ *
+ * The timestamp is not applicable for all rollback states, but we make
+ * sure to keep it non-null to avoid potential errors there.
*/
- public Instant timestamp;
+ public @NonNull Instant timestamp;
/**
* The session ID for the staged session if this rollback data represents a staged session,
* {@code -1} otherwise.
*/
- public int stagedSessionId;
+ public final int stagedSessionId;
/**
- * A flag to indicate whether the rollback should be considered available
- * for use. This will always be true for rollbacks of non-staged sessions.
- * For rollbacks of staged sessions, this is not set to true until after
- * the staged session has been applied.
+ * The current state of the rollback.
+ * ENABLING, AVAILABLE, or COMMITTED.
*/
- public boolean isAvailable;
+ public @RollbackState int state;
/**
* The id of the post-reboot apk session for a staged install, if any.
@@ -85,19 +114,20 @@ class RollbackData {
/* committedSessionId */ -1);
this.backupDir = backupDir;
this.stagedSessionId = stagedSessionId;
- this.isAvailable = (stagedSessionId == -1);
+ this.state = ROLLBACK_STATE_ENABLING;
+ this.timestamp = Instant.now();
}
/**
* Constructs a RollbackData instance with full rollback data information.
*/
RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId,
- boolean isAvailable, int apkSessionId, boolean restoreUserDataInProgress) {
+ @RollbackState int state, int apkSessionId, boolean restoreUserDataInProgress) {
this.info = info;
this.backupDir = backupDir;
this.timestamp = timestamp;
this.stagedSessionId = stagedSessionId;
- this.isAvailable = isAvailable;
+ this.state = state;
this.apkSessionId = apkSessionId;
this.restoreUserDataInProgress = restoreUserDataInProgress;
}
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 52d441255da6..f52f3a3627ad 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -64,6 +64,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -75,7 +76,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private static final String TAG = "RollbackManager";
// Rollbacks expire after 48 hours.
- // TODO: How to test rollback expiration works properly?
private static final long DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS =
TimeUnit.HOURS.toMillis(48);
@@ -106,15 +106,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
@GuardedBy("mLock")
private final Map<Integer, Integer> mChildSessions = new HashMap<>();
- // Package rollback data available to be used for rolling back a package.
+ // The list of all rollbacks, including available and committed rollbacks.
// This list is null until the rollback data has been loaded.
@GuardedBy("mLock")
- private List<RollbackData> mAvailableRollbacks;
-
- // The list of recently executed rollbacks.
- // This list is null until the rollback data has been loaded.
- @GuardedBy("mLock")
- private List<RollbackInfo> mRecentlyExecutedRollbacks;
+ private List<RollbackData> mRollbacks;
private final RollbackStore mRollbackStore;
@@ -176,17 +171,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
}, filter, null, getHandler());
- // NOTE: A new intent filter is being created here because this broadcast
- // doesn't use a data scheme ("package") like above.
- IntentFilter sessionUpdatedFilter = new IntentFilter();
- sessionUpdatedFilter.addAction(PackageInstaller.ACTION_SESSION_UPDATED);
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- onStagedSessionUpdated(intent);
- }
- }, sessionUpdatedFilter, null, getHandler());
-
IntentFilter enableRollbackFilter = new IntentFilter();
enableRollbackFilter.addAction(Intent.ACTION_PACKAGE_ENABLE_ROLLBACK);
try {
@@ -240,9 +224,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
List<RollbackInfo> rollbacks = new ArrayList<>();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- RollbackData data = mAvailableRollbacks.get(i);
- if (data.isAvailable) {
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
+ if (data.state == RollbackData.ROLLBACK_STATE_AVAILABLE) {
rollbacks.add(data.info);
}
}
@@ -258,7 +242,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- List<RollbackInfo> rollbacks = new ArrayList<>(mRecentlyExecutedRollbacks);
+ List<RollbackInfo> rollbacks = new ArrayList<>();
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
+ if (data.state == RollbackData.ROLLBACK_STATE_COMMITTED) {
+ rollbacks.add(data.info);
+ }
+ }
return new ParceledListSlice<>(rollbacks);
}
}
@@ -290,21 +280,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
-
data.timestamp = data.timestamp.plusMillis(timeDifference);
- try {
- mRollbackStore.saveRollbackData(data);
- } catch (IOException ioe) {
- // TODO: figure out the right way to deal with this, especially if
- // it fails for some data and succeeds for others.
- Log.e(TAG, "Unable to save rollback info for : "
- + data.info.getRollbackId(), ioe);
- }
+ saveRollbackData(data);
}
-
}
}
};
@@ -328,18 +309,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Log.i(TAG, "Initiating rollback");
RollbackData data = getRollbackForId(rollbackId);
- if (data == null) {
+ if (data == null || data.state != RollbackData.ROLLBACK_STATE_AVAILABLE) {
sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
"Rollback unavailable");
return;
}
- if (data.restoreUserDataInProgress) {
- sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
- "Rollback for package is already in progress.");
- return;
- }
-
// Verify the RollbackData is up to date with what's installed on
// device.
// TODO: We assume that between now and the time we commit the
@@ -438,13 +413,25 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
final LocalIntentReceiver receiver = new LocalIntentReceiver(
(Intent result) -> {
getHandler().post(() -> {
- // We've now completed the rollback, so we mark it as no longer in
- // progress.
- data.restoreUserDataInProgress = false;
int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
PackageInstaller.STATUS_FAILURE);
if (status != PackageInstaller.STATUS_SUCCESS) {
+ // Committing the rollback failed, but we
+ // still have all the info we need to try
+ // rolling back again, so restore the rollback
+ // state to how it was before we tried
+ // committing.
+ // TODO: Should we just kill this rollback if
+ // commit failed? Why would we expect commit
+ // not to fail again?
+ synchronized (mLock) {
+ // TODO: Could this cause a rollback to be
+ // resurrected if it should otherwise have
+ // expired by now?
+ data.state = RollbackData.ROLLBACK_STATE_AVAILABLE;
+ data.restoreUserDataInProgress = false;
+ }
sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_INSTALL,
"Rollback downgrade install failed: "
+ result.getStringExtra(
@@ -452,9 +439,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
return;
}
- data.info.setCommittedSessionId(parentSessionId);
- data.info.getCausePackages().addAll(causePackages);
- addRecentlyExecutedRollback(data.info);
+ synchronized (mLock) {
+ if (!data.isStaged()) {
+ // All calls to restoreUserData should have
+ // completed by now for a non-staged install.
+ data.restoreUserDataInProgress = false;
+ }
+
+ data.info.setCommittedSessionId(parentSessionId);
+ data.info.getCausePackages().addAll(causePackages);
+ }
+ mRollbackStore.deletePackageCodePaths(data);
+ saveRollbackData(data);
+
sendSuccess(statusReceiver);
Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED);
@@ -468,7 +465,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
);
- data.restoreUserDataInProgress = true;
+ synchronized (mLock) {
+ data.state = RollbackData.ROLLBACK_STATE_COMMITTED;
+ data.restoreUserDataInProgress = true;
+ }
parentSession.commit(receiver.getIntentSender());
} catch (IOException e) {
Log.e(TAG, "Rollback failed", e);
@@ -485,8 +485,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
"reloadPersistedData");
synchronized (mLock) {
- mAvailableRollbacks = null;
- mRecentlyExecutedRollbacks = null;
+ mRollbacks = null;
}
getHandler().post(() -> {
updateRollbackLifetimeDurationInMillis();
@@ -499,14 +498,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.MANAGE_ROLLBACKS,
"expireRollbackForPackage");
-
- // TODO: Should this take a package version number in addition to
- // package name? For now, just remove all rollbacks matching the
- // package name. This method is only currently used to facilitate
- // testing anyway.
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
for (PackageRollbackInfo info : data.info.getPackages()) {
@@ -522,29 +516,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
void onUnlockUser(int userId) {
getHandler().post(() -> {
- final List<RollbackData> availableRollbacks;
- final List<RollbackInfo> recentlyExecutedRollbacks;
+ final List<RollbackData> rollbacks;
synchronized (mLock) {
- ensureRollbackDataLoadedLocked();
- availableRollbacks = new ArrayList<>(mAvailableRollbacks);
- recentlyExecutedRollbacks = new ArrayList<>(mRecentlyExecutedRollbacks);
+ rollbacks = new ArrayList<>(mRollbacks);
}
- final List<RollbackData> changed =
- mAppDataRollbackHelper.commitPendingBackupAndRestoreForUser(userId,
- availableRollbacks, recentlyExecutedRollbacks);
+ final Set<RollbackData> changed =
+ mAppDataRollbackHelper.commitPendingBackupAndRestoreForUser(userId, rollbacks);
for (RollbackData rd : changed) {
- try {
- mRollbackStore.saveRollbackData(rd);
- } catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : "
- + rd.info.getRollbackId(), ioe);
- }
- }
-
- synchronized (mLock) {
- mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
+ saveRollbackData(rd);
}
});
}
@@ -569,42 +550,55 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
scheduleExpiration(0);
getHandler().post(() -> {
- // Check to see if any staged sessions with rollback enabled have
- // been applied.
- List<RollbackData> staged = new ArrayList<>();
+ // Check to see if any rollback-enabled staged sessions or staged
+ // rollback sessions been applied.
+ List<RollbackData> enabling = new ArrayList<>();
+ List<RollbackData> restoreInProgress = new ArrayList<>();
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- for (RollbackData data : mAvailableRollbacks) {
- if (!data.isAvailable && data.isStaged()) {
- staged.add(data);
+ for (RollbackData data : mRollbacks) {
+ if (data.isStaged()) {
+ if (data.state == RollbackData.ROLLBACK_STATE_ENABLING) {
+ enabling.add(data);
+ } else if (data.restoreUserDataInProgress) {
+ restoreInProgress.add(data);
+ }
}
}
}
- for (RollbackData data : staged) {
+ for (RollbackData data : enabling) {
PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
PackageInstaller.SessionInfo session = installer.getSessionInfo(
data.stagedSessionId);
+ // TODO: What if session is null?
if (session != null) {
if (session.isStagedSessionApplied()) {
- synchronized (mLock) {
- data.isAvailable = true;
- }
- try {
- mRollbackStore.saveRollbackData(data);
- } catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : "
- + data.info.getRollbackId(), ioe);
- }
+ makeRollbackAvailable(data);
} else if (session.isStagedSessionFailed()) {
// TODO: Do we need to remove this from
- // mAvailableRollbacks, or is it okay to leave as
+ // mRollbacks, or is it okay to leave as
// unavailable until the next reboot when it will go
// away on its own?
deleteRollback(data);
}
}
}
+
+ for (RollbackData data : restoreInProgress) {
+ PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
+ PackageInstaller.SessionInfo session = installer.getSessionInfo(
+ data.stagedSessionId);
+ // TODO: What if session is null?
+ if (session != null) {
+ if (session.isStagedSessionApplied() || session.isStagedSessionFailed()) {
+ synchronized (mLock) {
+ data.restoreUserDataInProgress = false;
+ }
+ saveRollbackData(data);
+ }
+ }
+ }
});
}
@@ -621,12 +615,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
/**
* Load rollback data from storage if it has not already been loaded.
- * After calling this function, mAvailableRollbacks and
- * mRecentlyExecutedRollbacks will be non-null.
+ * After calling this function, mRollbacks will be non-null.
*/
@GuardedBy("mLock")
private void ensureRollbackDataLoadedLocked() {
- if (mAvailableRollbacks == null) {
+ if (mRollbacks == null) {
loadAllRollbackDataLocked();
}
}
@@ -639,15 +632,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
@GuardedBy("mLock")
private void loadAllRollbackDataLocked() {
- mAvailableRollbacks = mRollbackStore.loadAvailableRollbacks();
- for (RollbackData data : mAvailableRollbacks) {
+ mRollbacks = mRollbackStore.loadAllRollbackData();
+ for (RollbackData data : mRollbacks) {
mAllocatedRollbackIds.put(data.info.getRollbackId(), true);
}
-
- mRecentlyExecutedRollbacks = mRollbackStore.loadRecentlyExecutedRollbacks();
- for (RollbackInfo info : mRecentlyExecutedRollbacks) {
- mAllocatedRollbackIds.put(info.getRollbackId(), true);
- }
}
/**
@@ -662,17 +650,21 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- for (PackageRollbackInfo info : data.info.getPackages()) {
- if (info.getPackageName().equals(packageName)
- && !packageVersionsEqual(
- info.getVersionRolledBackFrom(),
- installedVersion)) {
- iter.remove();
- deleteRollback(data);
- break;
+ // TODO: Should we remove rollbacks in the ENABLING state here?
+ if (data.state == RollbackData.ROLLBACK_STATE_AVAILABLE
+ || data.state == RollbackData.ROLLBACK_STATE_ENABLING) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
+ if (info.getPackageName().equals(packageName)
+ && !packageVersionsEqual(
+ info.getVersionRolledBackFrom(),
+ installedVersion)) {
+ iter.remove();
+ deleteRollback(data);
+ break;
+ }
}
}
}
@@ -685,53 +677,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
*/
private void onPackageFullyRemoved(String packageName) {
expireRollbackForPackage(packageName);
-
- synchronized (mLock) {
- ensureRollbackDataLoadedLocked();
- Iterator<RollbackInfo> iter = mRecentlyExecutedRollbacks.iterator();
- boolean changed = false;
- while (iter.hasNext()) {
- RollbackInfo rollback = iter.next();
- for (PackageRollbackInfo info : rollback.getPackages()) {
- if (packageName.equals(info.getPackageName())) {
- iter.remove();
- changed = true;
- break;
- }
- }
- }
-
- if (changed) {
- mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
- }
- }
- }
-
- /**
- * Records that the given package has been recently rolled back.
- */
- private void addRecentlyExecutedRollback(RollbackInfo rollback) {
- // TODO: if the list of rollbacks gets too big, trim it to only those
- // that are necessary to keep track of.
- synchronized (mLock) {
- ensureRollbackDataLoadedLocked();
-
- // This should never happen because we can't have any pending backups left after
- // a rollback has been executed. See AppDataRollbackHelper#restoreAppData where we
- // clear all pending backups at the point of restore because they're guaranteed to be
- // no-ops.
- //
- // We may, however, have one or more pending restores left to handle.
- for (PackageRollbackInfo target : rollback.getPackages()) {
- if (target.getPendingBackups().size() > 0) {
- Log.e(TAG, "No backups allowed to be pending for: " + target);
- target.getPendingBackups().clear();
- }
- }
-
- mRecentlyExecutedRollbacks.add(rollback);
- mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks);
- }
}
/**
@@ -768,17 +713,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
// Check to see if anything needs expiration, and if so, expire it.
// Schedules future expiration as appropriate.
- // TODO: Handle cases where the user changes time on the device.
private void runExpiration() {
Instant now = Instant.now();
Instant oldest = null;
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
+ Iterator<RollbackData> iter = mRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
- if (!data.isAvailable) {
+ if (data.state != RollbackData.ROLLBACK_STATE_AVAILABLE) {
continue;
}
if (!now.isBefore(data.timestamp.plusMillis(mRollbackLifetimeDurationInMillis))) {
@@ -876,8 +820,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
RollbackData rd = null;
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- RollbackData data = mAvailableRollbacks.get(i);
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
if (data.apkSessionId == parentSessionId) {
rd = data;
break;
@@ -901,16 +845,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
if (info.getPackageName().equals(packageName)) {
info.getInstalledUsers().addAll(IntArray.wrap(installedUsers));
mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info);
- try {
- mRollbackStore.saveRollbackData(rd);
- } catch (IOException ioe) {
- // TODO: Hopefully this is okay because we will try
- // again to save the rollback when the staged session
- // is applied. Just so long as the device doesn't
- // reboot before then.
- Log.e(TAG, "Unable to save rollback info for : "
- + rd.info.getRollbackId(), ioe);
- }
+ saveRollbackData(rd);
return true;
}
}
@@ -1039,32 +974,33 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private void restoreUserDataInternal(String packageName, int[] userIds, int appId,
long ceDataInode, String seInfo, int token) {
- final RollbackData rollbackData = getRollbackForPackage(packageName);
- if (rollbackData == null) {
- return;
+ PackageRollbackInfo info = null;
+ RollbackData rollbackData = null;
+ synchronized (mLock) {
+ ensureRollbackDataLoadedLocked();
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
+ if (data.restoreUserDataInProgress) {
+ info = getPackageRollbackInfo(data, packageName);
+ if (info != null) {
+ rollbackData = data;
+ break;
+ }
+ }
+ }
}
- if (!rollbackData.restoreUserDataInProgress) {
- Log.e(TAG, "Request to restore userData for: " + packageName
- + ", but no rollback in progress.");
+ if (rollbackData == null) {
return;
}
for (int userId : userIds) {
- final PackageRollbackInfo info = getPackageRollbackInfo(rollbackData, packageName);
final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData(
rollbackData.info.getRollbackId(), info, userId, appId, seInfo);
// We've updated metadata about this rollback, so save it to flash.
if (changedRollbackData) {
- try {
- mRollbackStore.saveRollbackData(rollbackData);
- } catch (IOException ioe) {
- // TODO(narayan): What is the right thing to do here ? This isn't a fatal
- // error, since it will only result in us trying to restore data again,
- // which will be a no-op if there's no data available.
- Log.e(TAG, "Unable to save available rollback: " + packageName, ioe);
- }
+ saveRollbackData(rollbackData);
}
}
}
@@ -1108,6 +1044,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
}
+ completeEnableRollback(sessionId, true);
result.offer(true);
});
@@ -1125,8 +1062,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
RollbackData rd = null;
synchronized (mLock) {
ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- RollbackData data = mAvailableRollbacks.get(i);
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
if (data.stagedSessionId == originalSessionId) {
data.apkSessionId = apkSessionId;
rd = data;
@@ -1136,12 +1073,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
if (rd != null) {
- try {
- mRollbackStore.saveRollbackData(rd);
- } catch (IOException ioe) {
- Log.e(TAG, "Unable to save rollback info for : "
- + rd.info.getRollbackId(), ioe);
- }
+ saveRollbackData(rd);
}
});
}
@@ -1183,21 +1115,21 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
@Override
public void onFinished(int sessionId, boolean success) {
- // If sessionId refers to a staged session, we can't deal with it here since the
- // session might take an unbounded amount of time to become "ready" after the package
- // installer session is committed. In those cases, we respond to it in response to
- // a session ready broadcast.
- PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller();
- PackageInstaller.SessionInfo si = packageInstaller.getSessionInfo(sessionId);
- if (si != null && si.isStaged()) {
- return;
+ RollbackData rollback = completeEnableRollback(sessionId, success);
+ if (rollback != null && !rollback.isStaged()) {
+ makeRollbackAvailable(rollback);
}
-
- completeEnableRollback(sessionId, success);
}
}
- private void completeEnableRollback(int sessionId, boolean success) {
+ /**
+ * Add a rollback to the list of rollbacks.
+ * This should be called after rollback has been enabled for all packages
+ * in the rollback. It does not make the rollback available yet.
+ *
+ * @return the rollback data for a successfully enable-completed rollback.
+ */
+ private RollbackData completeEnableRollback(int sessionId, boolean success) {
RollbackData data = null;
synchronized (mLock) {
Integer parentSessionId = mChildSessions.remove(sessionId);
@@ -1208,107 +1140,71 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
data = mPendingRollbacks.remove(sessionId);
}
- if (data != null) {
- if (success) {
- try {
- data.timestamp = Instant.now();
-
- mRollbackStore.saveRollbackData(data);
- synchronized (mLock) {
- // Note: There is a small window of time between when
- // the session has been committed by the package
- // manager and when we make the rollback available
- // here. Presumably the window is small enough that
- // nobody will want to roll back the newly installed
- // package before we make the rollback available.
- // TODO: We'll lose the rollback data if the
- // device reboots between when the session is
- // committed and this point. Revisit this after
- // adding support for rollback of staged installs.
- ensureRollbackDataLoadedLocked();
- mAvailableRollbacks.add(data);
- }
- // TODO(zezeozue): Provide API to explicitly start observing instead
- // of doing this for all rollbacks. If we do this for all rollbacks,
- // should document in PackageInstaller.SessionParams#setEnableRollback
- // After enabling and commiting any rollback, observe packages and
- // prepare to rollback if packages crashes too frequently.
- List<String> packages = new ArrayList<>();
- for (int i = 0; i < data.info.getPackages().size(); i++) {
- packages.add(data.info.getPackages().get(i).getPackageName());
- }
- mPackageHealthObserver.startObservingHealth(packages,
- mRollbackLifetimeDurationInMillis);
- scheduleExpiration(mRollbackLifetimeDurationInMillis);
- } catch (IOException e) {
- Log.e(TAG, "Unable to enable rollback", e);
- deleteRollback(data);
- }
- } else {
- // The install session was aborted, clean up the pending
- // install.
- deleteRollback(data);
- }
+ if (data == null) {
+ return null;
}
- }
- private void onStagedSessionUpdated(Intent intent) {
- PackageInstaller.SessionInfo pi = intent.getParcelableExtra(PackageInstaller.EXTRA_SESSION);
- if (pi == null) {
- Log.e(TAG, "Missing intent extra: " + PackageInstaller.EXTRA_SESSION);
- return;
+ if (!success) {
+ // The install session was aborted, clean up the pending install.
+ deleteRollback(data);
+ return null;
}
- if (pi.isStaged()) {
- if (!pi.isStagedSessionFailed()) {
- // TODO: The session really isn't "enabled" at this point, since more work might
- // be required post reboot.
- // TODO: We need to make this case consistent with the call from onFinished.
- // Ideally, we'd call completeEnableRollback excatly once per multi-package session
- // with the parentSessionId only.
- completeEnableRollback(pi.sessionId, pi.isStagedSessionReady());
- } else {
- // TODO: Clean up the saved rollback when the session fails. This may need to be
- // unified with the case where things fail post reboot.
- }
- } else {
- Log.e(TAG, "Received onStagedSessionUpdated for: " + pi.sessionId
- + ", which isn't staged");
+ saveRollbackData(data);
+ synchronized (mLock) {
+ // Note: There is a small window of time between when
+ // the session has been committed by the package
+ // manager and when we make the rollback available
+ // here. Presumably the window is small enough that
+ // nobody will want to roll back the newly installed
+ // package before we make the rollback available.
+ // TODO: We'll lose the rollback data if the
+ // device reboots between when the session is
+ // committed and this point. Revisit this after
+ // adding support for rollback of staged installs.
+ ensureRollbackDataLoadedLocked();
+ mRollbacks.add(data);
}
+
+ return data;
}
- /*
- * Returns the RollbackData, if any, for an available rollback that would
- * roll back the given package. Note: This assumes we have at most one
- * available rollback for a given package at any one time.
- */
- private RollbackData getRollbackForPackage(String packageName) {
+ private void makeRollbackAvailable(RollbackData data) {
+ // TODO: What if the rollback has since been expired, for example due
+ // to a new package being installed. Won't this revive an expired
+ // rollback? Consider adding a ROLLBACK_STATE_EXPIRED to address this.
synchronized (mLock) {
- // TODO: Have ensureRollbackDataLoadedLocked return the list of
- // available rollbacks, to hopefully avoid forgetting to call it?
- ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- RollbackData data = mAvailableRollbacks.get(i);
- if (data.isAvailable && getPackageRollbackInfo(data, packageName) != null) {
- return data;
- }
- }
+ data.state = RollbackData.ROLLBACK_STATE_AVAILABLE;
+ data.timestamp = Instant.now();
}
- return null;
+ saveRollbackData(data);
+
+ // TODO(zezeozue): Provide API to explicitly start observing instead
+ // of doing this for all rollbacks. If we do this for all rollbacks,
+ // should document in PackageInstaller.SessionParams#setEnableRollback
+ // After enabling and commiting any rollback, observe packages and
+ // prepare to rollback if packages crashes too frequently.
+ List<String> packages = new ArrayList<>();
+ for (int i = 0; i < data.info.getPackages().size(); i++) {
+ packages.add(data.info.getPackages().get(i).getPackageName());
+ }
+ mPackageHealthObserver.startObservingHealth(packages,
+ mRollbackLifetimeDurationInMillis);
+ scheduleExpiration(mRollbackLifetimeDurationInMillis);
}
/*
- * Returns the RollbackData, if any, for an available rollback with the
- * given rollbackId.
+ * Returns the RollbackData, if any, for a rollback with the given
+ * rollbackId.
*/
private RollbackData getRollbackForId(int rollbackId) {
synchronized (mLock) {
// TODO: Have ensureRollbackDataLoadedLocked return the list of
// available rollbacks, to hopefully avoid forgetting to call it?
ensureRollbackDataLoadedLocked();
- for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
- RollbackData data = mAvailableRollbacks.get(i);
- if (data.isAvailable && data.info.getRollbackId() == rollbackId) {
+ for (int i = 0; i < mRollbacks.size(); ++i) {
+ RollbackData data = mRollbacks.get(i);
+ if (data.info.getRollbackId() == rollbackId) {
return data;
}
}
@@ -1358,4 +1254,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
}
mRollbackStore.deleteRollbackData(rollbackData);
}
+
+ /**
+ * Saves rollback data, swallowing any IOExceptions.
+ * For those times when it's not obvious what to do about the IOException.
+ * TODO: Double check we can't do a better job handling the IOException in
+ * a cases where this method is called.
+ */
+ private void saveRollbackData(RollbackData rollbackData) {
+ try {
+ mRollbackStore.saveRollbackData(rollbackData);
+ } catch (IOException ioe) {
+ Log.e(TAG, "Unable to save rollback info for: "
+ + rollbackData.info.getRollbackId(), ioe);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java
index ecdb2ccd872b..4f8f6856bb6f 100644
--- a/services/core/java/com/android/server/rollback/RollbackStore.java
+++ b/services/core/java/com/android/server/rollback/RollbackStore.java
@@ -35,6 +35,7 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
+import java.text.ParseException;
import java.time.Instant;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
@@ -47,60 +48,44 @@ class RollbackStore {
private static final String TAG = "RollbackManager";
// Assuming the rollback data directory is /data/rollback, we use the
- // following directory structure to store persisted data for available and
- // recently executed rollbacks:
+ // following directory structure to store persisted data for rollbacks:
// /data/rollback/
- // available/
- // XXX/
- // rollback.json
- // com.package.A/
- // base.apk
- // com.package.B/
- // base.apk
- // YYY/
- // rollback.json
- // com.package.C/
- // base.apk
- // recently_executed.json
+ // XXX/
+ // rollback.json
+ // com.package.A/
+ // base.apk
+ // com.package.B/
+ // base.apk
+ // YYY/
+ // rollback.json
//
// * XXX, YYY are the rollbackIds for the corresponding rollbacks.
- // * rollback.json contains all relevant metadata for the rollback. This
- // file is not written until the rollback is made available.
+ // * rollback.json contains all relevant metadata for the rollback.
//
// TODO: Use AtomicFile for all the .json files?
private final File mRollbackDataDir;
- private final File mAvailableRollbacksDir;
- private final File mRecentlyExecutedRollbacksFile;
RollbackStore(File rollbackDataDir) {
mRollbackDataDir = rollbackDataDir;
- mAvailableRollbacksDir = new File(mRollbackDataDir, "available");
- mRecentlyExecutedRollbacksFile = new File(mRollbackDataDir, "recently_executed.json");
}
/**
- * Reads the list of available rollbacks from persistent storage.
+ * Reads the rollback data from persistent storage.
*/
- List<RollbackData> loadAvailableRollbacks() {
- List<RollbackData> availableRollbacks = new ArrayList<>();
- mAvailableRollbacksDir.mkdirs();
- for (File rollbackDir : mAvailableRollbacksDir.listFiles()) {
+ List<RollbackData> loadAllRollbackData() {
+ List<RollbackData> rollbacks = new ArrayList<>();
+ mRollbackDataDir.mkdirs();
+ for (File rollbackDir : mRollbackDataDir.listFiles()) {
if (rollbackDir.isDirectory()) {
try {
- RollbackData data = loadRollbackData(rollbackDir);
- availableRollbacks.add(data);
+ rollbacks.add(loadRollbackData(rollbackDir));
} catch (IOException e) {
- // Note: Deleting the rollbackDir here will cause pending
- // rollbacks to be deleted. This should only ever happen
- // if reloadPersistedData is called while there are
- // pending rollbacks. The reloadPersistedData method is
- // currently only for testing, so that should be okay.
Log.e(TAG, "Unable to read rollback data at " + rollbackDir, e);
removeFile(rollbackDir);
}
}
}
- return availableRollbacks;
+ return rollbacks;
}
/**
@@ -203,37 +188,11 @@ class RollbackStore {
}
/**
- * Reads the list of recently executed rollbacks from persistent storage.
- */
- List<RollbackInfo> loadRecentlyExecutedRollbacks() {
- List<RollbackInfo> recentlyExecutedRollbacks = new ArrayList<>();
- if (mRecentlyExecutedRollbacksFile.exists()) {
- try {
- // TODO: How to cope with changes to the format of this file from
- // when RollbackStore is updated in the future?
- String jsonString = IoUtils.readFileAsString(
- mRecentlyExecutedRollbacksFile.getAbsolutePath());
- JSONObject object = new JSONObject(jsonString);
- JSONArray array = object.getJSONArray("recentlyExecuted");
- for (int i = 0; i < array.length(); ++i) {
- recentlyExecutedRollbacks.add(rollbackInfoFromJson(array.getJSONObject(i)));
- }
- } catch (IOException | JSONException e) {
- // TODO: What to do here? Surely we shouldn't just forget about
- // everything after the point of exception?
- Log.e(TAG, "Failed to read recently executed rollbacks", e);
- }
- }
-
- return recentlyExecutedRollbacks;
- }
-
- /**
* Creates a new RollbackData instance for a non-staged rollback with
* backupDir assigned.
*/
RollbackData createNonStagedRollback(int rollbackId) throws IOException {
- File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
+ File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId));
return new RollbackData(rollbackId, backupDir, -1);
}
@@ -243,7 +202,7 @@ class RollbackStore {
*/
RollbackData createStagedRollback(int rollbackId, int stagedSessionId)
throws IOException {
- File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
+ File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId));
return new RollbackData(rollbackId, backupDir, stagedSessionId);
}
@@ -277,6 +236,17 @@ class RollbackStore {
}
/**
+ * Deletes all backed up apks and apex files associated with the given
+ * rollback.
+ */
+ static void deletePackageCodePaths(RollbackData data) {
+ for (PackageRollbackInfo info : data.info.getPackages()) {
+ File targetDir = new File(data.backupDir, info.getPackageName());
+ removeFile(targetDir);
+ }
+ }
+
+ /**
* Saves the rollback data to persistent storage.
*/
void saveRollbackData(RollbackData data) throws IOException {
@@ -285,7 +255,7 @@ class RollbackStore {
dataJson.put("info", rollbackInfoToJson(data.info));
dataJson.put("timestamp", data.timestamp.toString());
dataJson.put("stagedSessionId", data.stagedSessionId);
- dataJson.put("isAvailable", data.isAvailable);
+ dataJson.put("state", rollbackStateToString(data.state));
dataJson.put("apkSessionId", data.apkSessionId);
dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress);
@@ -305,29 +275,6 @@ class RollbackStore {
}
/**
- * Writes the list of recently executed rollbacks to storage.
- */
- void saveRecentlyExecutedRollbacks(List<RollbackInfo> recentlyExecutedRollbacks) {
- try {
- JSONObject json = new JSONObject();
- JSONArray array = new JSONArray();
- json.put("recentlyExecuted", array);
-
- for (int i = 0; i < recentlyExecutedRollbacks.size(); ++i) {
- RollbackInfo rollback = recentlyExecutedRollbacks.get(i);
- array.put(rollbackInfoToJson(rollback));
- }
-
- PrintWriter pw = new PrintWriter(mRecentlyExecutedRollbacksFile);
- pw.println(json.toString());
- pw.close();
- } catch (IOException | JSONException e) {
- // TODO: What to do here?
- Log.e(TAG, "Failed to save recently executed rollbacks", e);
- }
- }
-
- /**
* Reads the metadata for a rollback from the given directory.
* @throws IOException in case of error reading the data.
*/
@@ -342,10 +289,10 @@ class RollbackStore {
backupDir,
Instant.parse(dataJson.getString("timestamp")),
dataJson.getInt("stagedSessionId"),
- dataJson.getBoolean("isAvailable"),
+ rollbackStateFromString(dataJson.getString("state")),
dataJson.getInt("apkSessionId"),
dataJson.getBoolean("restoreUserDataInProgress"));
- } catch (JSONException | DateTimeParseException e) {
+ } catch (JSONException | DateTimeParseException | ParseException e) {
throw new IOException(e);
}
}
@@ -444,7 +391,7 @@ class RollbackStore {
* If the file is a directory, its contents are deleted as well.
* Has no effect if the directory does not exist.
*/
- private void removeFile(File file) {
+ private static void removeFile(File file) {
if (file.isDirectory()) {
for (File child : file.listFiles()) {
removeFile(child);
@@ -454,4 +401,23 @@ class RollbackStore {
file.delete();
}
}
+
+ private static String rollbackStateToString(@RollbackData.RollbackState int state) {
+ switch (state) {
+ case RollbackData.ROLLBACK_STATE_ENABLING: return "enabling";
+ case RollbackData.ROLLBACK_STATE_AVAILABLE: return "available";
+ case RollbackData.ROLLBACK_STATE_COMMITTED: return "committed";
+ }
+ throw new AssertionError("Invalid rollback state: " + state);
+ }
+
+ private static @RollbackData.RollbackState int rollbackStateFromString(String state)
+ throws ParseException {
+ switch (state) {
+ case "enabling": return RollbackData.ROLLBACK_STATE_ENABLING;
+ case "available": return RollbackData.ROLLBACK_STATE_AVAILABLE;
+ case "committed": return RollbackData.ROLLBACK_STATE_COMMITTED;
+ }
+ throw new ParseException("Invalid rollback state: " + state, 0);
+ }
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java
new file mode 100644
index 000000000000..584fbddee478
--- /dev/null
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.wallpaper;
+
+/**
+ * Wallpaper manager local system service interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class WallpaperManagerInternal {
+
+ /**
+ * Notifies the display is ready for adding wallpaper on it.
+ */
+ public abstract void onDisplayReady(int displayId);
+}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 4aeba153cc68..bb1e00113174 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -100,7 +100,9 @@ import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.JournaledFile;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
+import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.wm.WindowManagerInternal;
import libcore.io.IoUtils;
@@ -743,6 +745,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
private final Context mContext;
private final IWindowManager mIWindowManager;
+ private final WindowManagerInternal mWindowManagerInternal;
private final IPackageManager mIPackageManager;
private final MyPackageMonitor mMonitor;
private final AppOpsManager mAppOpsManager;
@@ -753,27 +756,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
@Override
public void onDisplayAdded(int displayId) {
- synchronized (mLock) {
- if (mLastWallpaper != null) {
- if (supportsMultiDisplay(mLastWallpaper.connection)) {
- final WallpaperConnection.DisplayConnector connector =
- mLastWallpaper.connection.getDisplayConnectorOrCreate(displayId);
- if (connector == null) return;
- connector.connectLocked(mLastWallpaper.connection, mLastWallpaper);
- return;
- }
- // System wallpaper does not support multiple displays, attach this display to
- // the fallback wallpaper.
- if (mFallbackWallpaper != null) {
- final WallpaperConnection.DisplayConnector connector = mFallbackWallpaper
- .connection.getDisplayConnectorOrCreate(displayId);
- if (connector == null) return;
- connector.connectLocked(mFallbackWallpaper.connection, mFallbackWallpaper);
- } else {
- Slog.w(TAG, "No wallpaper can be added to the new display");
- }
- }
- }
}
@Override
@@ -1185,9 +1167,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
private boolean isUsableDisplay(Display display) {
- return display != null && display.hasAccess(mClientUid)
- && (display.supportsSystemDecorations()
- || display.getDisplayId() == DEFAULT_DISPLAY);
+ if (display == null || !display.hasAccess(mClientUid)) {
+ return false;
+ }
+ final int displayId = display.getDisplayId();
+ return displayId == DEFAULT_DISPLAY
+ || mWindowManagerInternal.shouldShowSystemDecorOnDisplay(displayId);
}
void forEachDisplayConnector(Consumer<DisplayConnector> action) {
@@ -1577,12 +1562,22 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
mDefaultWallpaperComponent = WallpaperManager.getDefaultWallpaperComponent(context);
mIWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
+ mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
mIPackageManager = AppGlobals.getPackageManager();
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mDisplayManager = mContext.getSystemService(DisplayManager.class);
mDisplayManager.registerDisplayListener(mDisplayListener, null /* handler */);
mMonitor = new MyPackageMonitor();
mColorsChangedListeners = new SparseArray<>();
+
+ LocalServices.addService(WallpaperManagerInternal.class, new LocalService());
+ }
+
+ private final class LocalService extends WallpaperManagerInternal {
+ @Override
+ public void onDisplayReady(int displayId) {
+ onDisplayReadyInternal(displayId);
+ }
}
void initialize() {
@@ -2768,6 +2763,31 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
return (wallpaper != null) ? wallpaper.allowBackup : false;
}
+ private void onDisplayReadyInternal(int displayId) {
+ synchronized (mLock) {
+ if (mLastWallpaper == null) {
+ return;
+ }
+ if (supportsMultiDisplay(mLastWallpaper.connection)) {
+ final WallpaperConnection.DisplayConnector connector =
+ mLastWallpaper.connection.getDisplayConnectorOrCreate(displayId);
+ if (connector == null) return;
+ connector.connectLocked(mLastWallpaper.connection, mLastWallpaper);
+ return;
+ }
+ // System wallpaper does not support multiple displays, attach this display to
+ // the fallback wallpaper.
+ if (mFallbackWallpaper != null) {
+ final WallpaperConnection.DisplayConnector connector = mFallbackWallpaper
+ .connection.getDisplayConnectorOrCreate(displayId);
+ if (connector == null) return;
+ connector.connectLocked(mFallbackWallpaper.connection, mFallbackWallpaper);
+ } else {
+ Slog.w(TAG, "No wallpaper can be added to the new display");
+ }
+ }
+ }
+
private static JournaledFile makeJournaledFile(int userId) {
final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath();
return new JournaledFile(new File(base), new File(base + ".tmp"));
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index f70adefd7696..178359159eb6 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -564,11 +564,8 @@ final class ActivityRecord extends ConfigurationContainer {
pw.print("requestedVrComponent=");
pw.println(requestedVrComponent);
}
- final boolean waitingVisible =
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(this);
- if (lastVisibleTime != 0 || waitingVisible || nowVisible) {
- pw.print(prefix); pw.print("waitingVisible="); pw.print(waitingVisible);
- pw.print(" nowVisible="); pw.print(nowVisible);
+ if (lastVisibleTime != 0 || nowVisible) {
+ pw.print(prefix); pw.print(" nowVisible="); pw.print(nowVisible);
pw.print(" lastVisibleTime=");
if (lastVisibleTime == 0) pw.print("0");
else TimeUtils.formatDuration(lastVisibleTime, now, pw);
@@ -2358,27 +2355,6 @@ final class ActivityRecord extends ConfigurationContainer {
if (!nowVisible) {
nowVisible = true;
lastVisibleTime = SystemClock.uptimeMillis();
- if (idle || mStackSupervisor.isStoppingNoHistoryActivity()) {
- // If this activity was already idle or there is an activity that must be
- // stopped immediately after visible, then we now need to make sure we perform
- // the full stop of any activities that are waiting to do so. This is because
- // we won't do that while they are still waiting for this one to become visible.
- final int size = mStackSupervisor.mActivitiesWaitingForVisibleActivity.size();
- if (size > 0) {
- for (int i = 0; i < size; i++) {
- final ActivityRecord r =
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.get(i);
- if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "Was waiting for visible: " + r);
- }
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.clear();
- mStackSupervisor.scheduleIdleLocked();
- }
- } else {
- // Instead of doing the full stop routine here, let's just hide any activities
- // we now can, and let them stop when the normal idle happens.
- mStackSupervisor.processStoppingActivitiesLocked(null /* idleActivity */,
- false /* remove */, true /* processPausingActivities */);
- }
mAtmService.scheduleAppGcsLocked();
}
}
@@ -2392,6 +2368,24 @@ final class ActivityRecord extends ConfigurationContainer {
}
}
+ void onAnimationFinished() {
+ if (mRootActivityContainer.allResumedActivitiesIdle()
+ || mStackSupervisor.isStoppingNoHistoryActivity()) {
+ // If all activities are already idle or there is an activity that must be
+ // stopped immediately after visible, then we now need to make sure we perform
+ // the full stop of this activity. This is because we won't do that while they are still
+ // waiting for the animation to finish.
+ if (mStackSupervisor.mStoppingActivities.contains(this)) {
+ mStackSupervisor.scheduleIdleLocked();
+ }
+ } else {
+ // Instead of doing the full stop routine here, let's just hide any activities
+ // we now can, and let them stop when the normal idle happens.
+ mStackSupervisor.processStoppingActivitiesLocked(null /* idleActivity */,
+ false /* remove */, true /* processPausingActivities */);
+ }
+ }
+
/**
* Called when the key dispatching to a window associated with the app window container
* timed-out.
@@ -2424,10 +2418,9 @@ final class ActivityRecord extends ConfigurationContainer {
}
private ActivityRecord getWaitingHistoryRecordLocked() {
- // First find the real culprit... if this activity is waiting for
- // another activity to start or has stopped, then the key dispatching
+ // First find the real culprit... if this activity has stopped, then the key dispatching
// timeout should not be caused by this.
- if (mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(this) || stopped) {
+ if (stopped) {
final ActivityStack stack = mRootActivityContainer.getTopDisplayFocusedStack();
// Try to use the one which is closest to top.
ActivityRecord r = stack.getResumedActivity();
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index ea2aff220030..82c0e213f12b 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -701,6 +701,14 @@ class ActivityStack extends ConfigurationContainer {
*/
void setWindowingMode(int preferredWindowingMode, boolean animate, boolean showRecents,
boolean enteringSplitScreenMode, boolean deferEnsuringVisibility, boolean creating) {
+ mWindowManager.inSurfaceTransaction(() -> setWindowingModeInSurfaceTransaction(
+ preferredWindowingMode, animate, showRecents, enteringSplitScreenMode,
+ deferEnsuringVisibility, creating));
+ }
+
+ private void setWindowingModeInSurfaceTransaction(int preferredWindowingMode, boolean animate,
+ boolean showRecents, boolean enteringSplitScreenMode, boolean deferEnsuringVisibility,
+ boolean creating) {
final int currentMode = getWindowingMode();
final int currentOverrideMode = getRequestedOverrideWindowingMode();
final ActivityDisplay display = getDisplay();
@@ -744,7 +752,7 @@ class ActivityStack extends ConfigurationContainer {
// warning toast about it.
mService.getTaskChangeNotificationController().notifyActivityDismissingDockedStack();
final ActivityStack primarySplitStack = display.getSplitScreenPrimaryStack();
- primarySplitStack.setWindowingMode(WINDOWING_MODE_UNDEFINED,
+ primarySplitStack.setWindowingModeInSurfaceTransaction(WINDOWING_MODE_UNDEFINED,
false /* animate */, false /* showRecents */,
false /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */,
primarySplitStack == this ? creating : false);
@@ -1799,10 +1807,6 @@ class ActivityStack extends ConfigurationContainer {
} else if (prev.hasProcess()) {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueue pending stop if needed: " + prev
+ " wasStopping=" + wasStopping + " visible=" + prev.visible);
- if (mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(prev)) {
- if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG_PAUSE,
- "Complete pause, no longer waiting: " + prev);
- }
if (prev.deferRelaunchUntilPaused) {
// Complete the deferred relaunch that was waiting for pause to complete.
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Re-launching after pause: " + prev);
@@ -1882,16 +1886,6 @@ class ActivityStack extends ConfigurationContainer {
private void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed) {
if (!mStackSupervisor.mStoppingActivities.contains(r)) {
mStackSupervisor.mStoppingActivities.add(r);
-
- // Some activity is waiting for another activity to become visible before it's being
- // stopped, which means that we also want to wait with stopping this one to avoid
- // flickers.
- if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.isEmpty()
- && !mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(r)) {
- if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "adding to waiting visible activity=" + r
- + " existing=" + mStackSupervisor.mActivitiesWaitingForVisibleActivity);
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(r);
- }
}
// If we already have a few activities waiting to stop, then give up
@@ -2707,7 +2701,6 @@ class ActivityStack extends ConfigurationContainer {
mStackSupervisor.mStoppingActivities.remove(next);
mStackSupervisor.mGoingToSleepActivities.remove(next);
next.sleeping = false;
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(next);
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resuming " + next);
@@ -2716,11 +2709,6 @@ class ActivityStack extends ConfigurationContainer {
if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,
"resumeTopActivityLocked: Skip resume: some activity pausing.");
- // Adding previous activity to the waiting visible list, or it would be stopped
- // before top activity being visible.
- if (prev != null && !next.nowVisible) {
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(prev);
- }
return false;
}
@@ -2796,35 +2784,27 @@ class ActivityStack extends ConfigurationContainer {
mLastNoHistoryActivity = null;
}
- if (prev != null && prev != next) {
- if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(prev)
- && !next.nowVisible) {
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(prev);
+ if (prev != null && prev != next && next.nowVisible) {
+
+ // The next activity is already visible, so hide the previous
+ // activity's windows right now so we can show the new one ASAP.
+ // We only do this if the previous is finishing, which should mean
+ // it is on top of the one being resumed so hiding it quickly
+ // is good. Otherwise, we want to do the normal route of allowing
+ // the resumed activity to be shown so we can decide if the
+ // previous should actually be hidden depending on whether the
+ // new one is found to be full-screen or not.
+ if (prev.finishing) {
+ prev.setVisibility(false);
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Resuming top, waiting visible to hide: " + prev);
+ "Not waiting for visible to hide: " + prev
+ + ", nowVisible=" + next.nowVisible);
} else {
- // The next activity is already visible, so hide the previous
- // activity's windows right now so we can show the new one ASAP.
- // We only do this if the previous is finishing, which should mean
- // it is on top of the one being resumed so hiding it quickly
- // is good. Otherwise, we want to do the normal route of allowing
- // the resumed activity to be shown so we can decide if the
- // previous should actually be hidden depending on whether the
- // new one is found to be full-screen or not.
- if (prev.finishing) {
- prev.setVisibility(false);
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Not waiting for visible to hide: " + prev + ", waitingVisible="
- + mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(prev)
- + ", nowVisible=" + next.nowVisible);
- } else {
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Previous already visible but still waiting to hide: " + prev
- + ", waitingVisible="
- + mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(prev)
- + ", nowVisible=" + next.nowVisible);
- }
+ if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
+ "Previous already visible but still waiting to hide: " + prev
+ + ", nowVisible=" + next.nowVisible);
}
+
}
// Launching this app's activity, make sure the app is no longer
@@ -4081,9 +4061,6 @@ class ActivityStack extends ConfigurationContainer {
dc.prepareAppTransition(transit, false);
r.setVisibility(false);
dc.executeAppTransition();
- if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(r)) {
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(r);
- }
}
static final int FINISH_IMMEDIATELY = 0;
@@ -4119,7 +4096,6 @@ class ActivityStack extends ConfigurationContainer {
// make sure the record is cleaned out of other places.
mStackSupervisor.mStoppingActivities.remove(r);
mStackSupervisor.mGoingToSleepActivities.remove(r);
- mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(r);
final ActivityState prevState = r.getState();
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to FINISHING: " + r);
@@ -4725,8 +4701,6 @@ class ActivityStack extends ConfigurationContainer {
"mStoppingActivities");
removeHistoryRecordsForAppLocked(mStackSupervisor.mGoingToSleepActivities, app,
"mGoingToSleepActivities");
- removeHistoryRecordsForAppLocked(mStackSupervisor.mActivitiesWaitingForVisibleActivity, app,
- "mActivitiesWaitingForVisibleActivity");
removeHistoryRecordsForAppLocked(mStackSupervisor.mFinishingActivities, app,
"mFinishingActivities");
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 758a76546c9b..d1108cc68eca 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -267,12 +267,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
*/
private final SparseIntArray mCurTaskIdForUser = new SparseIntArray(20);
- /** List of activities that are waiting for a new activity to become visible before completing
- * whatever operation they are supposed to do. */
- // TODO: Remove mActivitiesWaitingForVisibleActivity list and just remove activity from
- // mStoppingActivities when something else comes up.
- final ArrayList<ActivityRecord> mActivitiesWaitingForVisibleActivity = new ArrayList<>();
-
/** List of processes waiting to find out when a specific activity becomes visible. */
private final ArrayList<WaitInfo> mWaitingForActivityVisible = new ArrayList<>();
@@ -550,7 +544,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
// This could happen, for example, if we are trimming activities
// down to the max limit while they are still waiting to finish.
mFinishingActivities.remove(r);
- mActivitiesWaitingForVisibleActivity.remove(r);
for (int i = mWaitingForActivityVisible.size() - 1; i >= 0; --i) {
if (mWaitingForActivityVisible.get(i).matches(r.mActivityComponent)) {
@@ -2142,28 +2135,27 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
final boolean nowVisible = mRootActivityContainer.allResumedActivitiesVisible();
for (int activityNdx = mStoppingActivities.size() - 1; activityNdx >= 0; --activityNdx) {
ActivityRecord s = mStoppingActivities.get(activityNdx);
- boolean waitingVisible = mActivitiesWaitingForVisibleActivity.contains(s);
+
+ final boolean animating = s.mAppWindowToken.isSelfAnimating();
+
if (DEBUG_STATES) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible
- + " waitingVisible=" + waitingVisible + " finishing=" + s.finishing);
- if (waitingVisible && nowVisible) {
- mActivitiesWaitingForVisibleActivity.remove(s);
- waitingVisible = false;
- if (s.finishing) {
- // If this activity is finishing, it is sitting on top of
- // everyone else but we now know it is no longer needed...
- // so get rid of it. Otherwise, we need to go through the
- // normal flow and hide it once we determine that it is
- // hidden by the activities in front of it.
- if (DEBUG_STATES) Slog.v(TAG, "Before stopping, can hide: " + s);
- s.setVisibility(false);
- }
+ + " animating=" + animating + " finishing=" + s.finishing);
+ if (nowVisible && s.finishing) {
+
+ // If this activity is finishing, it is sitting on top of
+ // everyone else but we now know it is no longer needed...
+ // so get rid of it. Otherwise, we need to go through the
+ // normal flow and hide it once we determine that it is
+ // hidden by the activities in front of it.
+ if (DEBUG_STATES) Slog.v(TAG, "Before stopping, can hide: " + s);
+ s.setVisibility(false);
}
if (remove) {
final ActivityStack stack = s.getActivityStack();
final boolean shouldSleepOrShutDown = stack != null
? stack.shouldSleepOrShutDownActivities()
: mService.isSleepingOrShuttingDownLocked();
- if (!waitingVisible || shouldSleepOrShutDown) {
+ if (!animating || shouldSleepOrShutDown) {
if (!processPausingActivities && s.isState(PAUSING)) {
// Defer processing pausing activities in this iteration and reschedule
// a delayed idle to reprocess it again
@@ -2178,9 +2170,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
}
stops.add(s);
- // Make sure to remove it in all cases in case we entered this block with
- // shouldSleepOrShutDown
- mActivitiesWaitingForVisibleActivity.remove(s);
mStoppingActivities.remove(activityNdx);
}
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 19ff43822923..bb5a2213488a 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -86,6 +86,7 @@ import android.content.Context;
import android.content.res.Configuration;
import android.content.res.ResourceId;
import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -123,6 +124,7 @@ import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils.Dump;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.AttributeCache;
@@ -558,19 +560,19 @@ public class AppTransition implements Dump {
}
resId = updateToTranslucentAnimIfNeeded(resId, transit);
if (ResourceId.isValid(resId)) {
- return AnimationUtils.loadAnimation(context, resId);
+ return loadAnimationSafely(context, resId);
}
return null;
}
- Animation loadAnimationRes(LayoutParams lp, int resId) {
+ private Animation loadAnimationRes(LayoutParams lp, int resId) {
Context context = mContext;
if (ResourceId.isValid(resId)) {
AttributeCache.Entry ent = getCachedAnimations(lp);
if (ent != null) {
context = ent.context;
}
- return AnimationUtils.loadAnimation(context, resId);
+ return loadAnimationSafely(context, resId);
}
return null;
}
@@ -579,12 +581,22 @@ public class AppTransition implements Dump {
if (ResourceId.isValid(resId)) {
AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
if (ent != null) {
- return AnimationUtils.loadAnimation(ent.context, resId);
+ return loadAnimationSafely(ent.context, resId);
}
}
return null;
}
+ @VisibleForTesting
+ Animation loadAnimationSafely(Context context, int resId) {
+ try {
+ return AnimationUtils.loadAnimation(context, resId);
+ } catch (NotFoundException e) {
+ Slog.w(TAG, "Unable to load animation resource", e);
+ return null;
+ }
+ }
+
private int updateToTranslucentAnimIfNeeded(int anim, int transit) {
if (transit == TRANSIT_TRANSLUCENT_ACTIVITY_OPEN && anim == R.anim.activity_open_enter) {
return R.anim.activity_translucent_open_enter;
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 78199d4412a6..220370c0859c 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -2784,6 +2784,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
getDisplayContent().mAppTransition.notifyAppTransitionFinishedLocked(token);
scheduleAnimation();
+
+ mActivityRecord.onAnimationFinished();
}
@Override
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index ae76740b5d26..515ac52178a8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -30,6 +30,7 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_PRIVATE;
+import static android.view.Display.FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.InsetsState.TYPE_IME;
import static android.view.Surface.ROTATION_0;
@@ -4904,10 +4905,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
* @see Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS
*/
boolean supportsSystemDecorations() {
- // TODO(b/114338689): Read the setting from DisplaySettings.
- return mDisplay.supportsSystemDecorations()
+ return mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this)
+ || (mDisplay.getFlags() & FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0
// TODO (b/111363427): Remove this and set the new FLAG_SHOULD_SHOW_LAUNCHER flag
- // (b/114338689) whenever vr 2d display id is set.
+ // whenever vr 2d display id is set.
|| mDisplayId == mWmService.mVr2dDisplayId
|| mWmService.mForceDesktopModeOnExternalDisplays;
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index b028569ccb08..5862d43d663d 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -158,6 +158,7 @@ import com.android.server.policy.WindowManagerPolicy.ScreenOnListener;
import com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs;
import com.android.server.policy.WindowOrientationListener;
import com.android.server.statusbar.StatusBarManagerInternal;
+import com.android.server.wallpaper.WallpaperManagerInternal;
import com.android.server.wm.utils.InsetUtils;
import java.io.PrintWriter;
@@ -535,7 +536,7 @@ public class DisplayPolicy {
}
} else {
mHasStatusBar = false;
- mHasNavigationBar = mDisplayContent.getDisplay().supportsSystemDecorations();
+ mHasNavigationBar = mDisplayContent.supportsSystemDecorations();
}
}
@@ -1944,10 +1945,6 @@ public class DisplayPolicy {
} else {
vf.set(cf);
}
-
- // EXPERIMENT TODO(b/113952590): Remove once experiment in bug is completed
- mExperiments.offsetWindowFramesForNavBar(mNavigationBarPosition, win);
- // EXPERIMENT END
}
} else if (layoutInScreen || (sysUiFl
& (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -2605,7 +2602,11 @@ public class DisplayPolicy {
}
void notifyDisplayReady() {
- mHandler.post(() -> getStatusBarManagerInternal().onDisplayReady(getDisplayId()));
+ mHandler.post(() -> {
+ final int displayId = getDisplayId();
+ getStatusBarManagerInternal().onDisplayReady(displayId);
+ LocalServices.getService(WallpaperManagerInternal.class).onDisplayReady(displayId);
+ });
}
/**
diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java
index e3beb19408e1..e59b6d743c52 100644
--- a/services/core/java/com/android/server/wm/RootActivityContainer.java
+++ b/services/core/java/com/android/server/wm/RootActivityContainer.java
@@ -2016,8 +2016,7 @@ class RootActivityContainer extends ConfigurationContainer
final ActivityStack stack = display.getChildAt(stackNdx);
final ActivityRecord r = stack.getResumedActivity();
if (r != null) {
- if (!r.nowVisible
- || mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(r)) {
+ if (!r.nowVisible) {
return false;
}
foundResumed = true;
@@ -2345,10 +2344,6 @@ class RootActivityContainer extends ConfigurationContainer
printed |= dumpHistoryList(fd, pw, mStackSupervisor.mStoppingActivities, " ",
"Stop", false, !dumpAll,
false, dumpPackage, true, " Activities waiting to stop:", null);
- printed |= dumpHistoryList(fd, pw,
- mStackSupervisor.mActivitiesWaitingForVisibleActivity, " ", "Wait",
- false, !dumpAll, false, dumpPackage, true,
- " Activities waiting for another to become visible:", null);
printed |= dumpHistoryList(fd, pw, mStackSupervisor.mGoingToSleepActivities,
" ", "Sleep", false, !dumpAll,
false, dumpPackage, true, " Activities waiting to sleep:", null);
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index b88e581d5783..4a0831e39100 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -43,16 +43,15 @@ import android.util.Slog;
import android.view.BatchedInputEventReceiver;
import android.view.Choreographer;
import android.view.Display;
+import android.view.InputApplicationHandle;
import android.view.InputChannel;
import android.view.InputDevice;
import android.view.InputEvent;
+import android.view.InputWindowHandle;
import android.view.MotionEvent;
import android.view.WindowManager;
import com.android.internal.annotations.VisibleForTesting;
-import android.view.InputApplicationHandle;
-import android.view.InputWindowHandle;
-import com.android.server.wm.WindowManagerService.H;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -356,12 +355,10 @@ class TaskPositioner {
+ startY + "}");
}
mTask = win.getTask();
- // Use the dim bounds, not the original task bounds. The cursor
- // movement should be calculated relative to the visible bounds.
- // Also, use the dim bounds of the task which accounts for
+ // Use the bounds of the task which accounts for
// multiple app windows. Don't use any bounds from win itself as it
// may not be the same size as the task.
- mTask.getDimBounds(mTmpRect);
+ mTask.getBounds(mTmpRect);
startDrag(resize, preserveOrientation, startX, startY, mTmpRect);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 33e46f4af301..d3f3711db0d8 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -474,4 +474,9 @@ public abstract class WindowManagerInternal {
* Return the display Id for given window.
*/
public abstract int getDisplayIdForWindow(IBinder windowToken);
+
+ /**
+ * Checks whether this display should support showing system decorations.
+ */
+ public abstract boolean shouldShowSystemDecorOnDisplay(int displayId);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1bd1795dadd8..d3f387c1ebe2 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1179,8 +1179,7 @@ public class WindowManagerService extends IWindowManager.Stub
+ displayId + ". Aborting.");
return WindowManagerGlobal.ADD_INVALID_DISPLAY;
}
- if (!displayContent.hasAccess(session.mUid)
- && !mDisplayManagerInternal.isUidPresentOnDisplay(session.mUid, displayId)) {
+ if (!displayContent.hasAccess(session.mUid)) {
Slog.w(TAG_WM, "Attempted to add window to a display for which the application "
+ "does not have access: " + displayId + ". Aborting.");
return WindowManagerGlobal.ADD_INVALID_DISPLAY;
@@ -6776,7 +6775,7 @@ public class WindowManagerService extends IWindowManager.Stub
+ "not exist: " + displayId);
return false;
}
- return mDisplayWindowSettings.shouldShowSystemDecorsLocked(displayContent);
+ return displayContent.supportsSystemDecorations();
}
}
@@ -7245,6 +7244,13 @@ public class WindowManagerService extends IWindowManager.Stub
return Display.INVALID_DISPLAY;
}
}
+
+ @Override
+ public boolean shouldShowSystemDecorOnDisplay(int displayId) {
+ synchronized (mGlobalLock) {
+ return WindowManagerService.this.shouldShowSystemDecors(displayId);
+ }
+ }
}
void registerAppFreezeListener(AppFreezeListener listener) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index b7925f20be86..d5a6f00ff30d 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -842,6 +842,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// The offset from the layout containing frame to the actual containing frame.
final int layoutXDiff;
final int layoutYDiff;
+ final WindowState imeWin = mWmService.mRoot.getCurrentInputMethodWindow();
+ final boolean isImeTarget =
+ imeWin != null && imeWin.isVisibleNow() && isInputMethodTarget();
if (inFullscreenContainer || layoutInParentFrame()) {
// We use the parent frame as the containing frame for fullscreen and child windows
mWindowFrames.mContainingFrame.set(mWindowFrames.mParentFrame);
@@ -861,15 +864,19 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mWindowFrames.mContainingFrame.bottom =
mWindowFrames.mContainingFrame.top + frozen.height();
}
- final WindowState imeWin = mWmService.mRoot.getCurrentInputMethodWindow();
// IME is up and obscuring this window. Adjust the window position so it is visible.
- if (imeWin != null && imeWin.isVisibleNow() && isInputMethodTarget()) {
- if (inFreeformWindowingMode() && mWindowFrames.mContainingFrame.bottom
- > mWindowFrames.mContentFrame.bottom) {
- // In freeform we want to move the top up directly.
- // TODO: Investigate why this is contentFrame not parentFrame.
- mWindowFrames.mContainingFrame.top -= mWindowFrames.mContainingFrame.bottom
- - mWindowFrames.mContentFrame.bottom;
+ if (isImeTarget) {
+ if (inFreeformWindowingMode()) {
+ // Push the freeform window up to make room for the IME. However, don't push
+ // it up past the top of the screen.
+ final int bottomOverlap = mWindowFrames.mContainingFrame.bottom
+ - mWindowFrames.mVisibleFrame.bottom;
+ if (bottomOverlap > 0) {
+ final int distanceToTop = Math.max(mWindowFrames.mContainingFrame.top
+ - mWindowFrames.mDisplayFrame.top, 0);
+ int offs = Math.min(bottomOverlap, distanceToTop);
+ mWindowFrames.mContainingFrame.top -= offs;
+ }
} else if (!inPinnedWindowingMode() && mWindowFrames.mContainingFrame.bottom
> mWindowFrames.mParentFrame.bottom) {
// But in docked we want to behave like fullscreen and behave as if the task
@@ -955,9 +962,21 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final int left = Math.max(limitFrame.left + minVisibleWidth - width,
Math.min( mWindowFrames.mFrame.left, limitFrame.right - minVisibleWidth));
mWindowFrames.mFrame.set(left, top, left + width, top + height);
+ final int visBottom = mWindowFrames.mVisibleFrame.bottom;
+ final int contentBottom = mWindowFrames.mContentFrame.bottom;
mWindowFrames.mContentFrame.set( mWindowFrames.mFrame);
mWindowFrames.mVisibleFrame.set(mWindowFrames.mContentFrame);
mWindowFrames.mStableFrame.set(mWindowFrames.mContentFrame);
+ if (isImeTarget && inFreeformWindowingMode()) {
+ // After displacing a freeform window to make room for the ime, any part of
+ // the window still covered by IME should be inset.
+ if (contentBottom + layoutYDiff < mWindowFrames.mContentFrame.bottom) {
+ mWindowFrames.mContentFrame.bottom = contentBottom + layoutYDiff;
+ }
+ if (visBottom + layoutYDiff < mWindowFrames.mVisibleFrame.bottom) {
+ mWindowFrames.mVisibleFrame.bottom = visBottom + layoutYDiff;
+ }
+ }
} else if (mAttrs.type == TYPE_DOCK_DIVIDER) {
dc.getDockedDividerController().positionDockedStackedDivider(mWindowFrames.mFrame);
mWindowFrames.mContentFrame.set(mWindowFrames.mFrame);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index f496e817bc6c..36251f52d985 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -172,7 +172,6 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
-import android.os.ParcelableException;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
@@ -5338,9 +5337,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
*/
@Override
public long getRequiredStrongAuthTimeout(ComponentName who, int userId, boolean parent) {
- if (!mHasFeature || !mLockPatternUtils.hasSecureLockScreen()) {
+ if (!mHasFeature) {
return DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
}
+ if (!mLockPatternUtils.hasSecureLockScreen()) {
+ // No strong auth timeout on devices not supporting the
+ // {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature
+ return 0;
+ }
enforceFullCrossUsersPermission(userId);
synchronized (getLockObject()) {
if (who != null) {
diff --git a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
index c8e67820ce46..d0158e0c819f 100644
--- a/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/AppStateTrackerTest.java
@@ -685,10 +685,10 @@ public class AppStateTrackerTest {
List<OpEntry> entries = new ArrayList<>();
entries.add(new OpEntry(
AppOpsManager.OP_ACCESS_NOTIFICATIONS,
- AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_IGNORED));
entries.add(new OpEntry(
AppStateTracker.TARGET_OP,
- AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_IGNORED));
ops.add(new PackageOps(PACKAGE_1, UID_1, entries));
@@ -696,7 +696,7 @@ public class AppStateTrackerTest {
entries = new ArrayList<>();
entries.add(new OpEntry(
AppStateTracker.TARGET_OP,
- AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_IGNORED));
ops.add(new PackageOps(PACKAGE_2, UID_2, entries));
@@ -704,7 +704,7 @@ public class AppStateTrackerTest {
entries = new ArrayList<>();
entries.add(new OpEntry(
AppStateTracker.TARGET_OP,
- AppOpsManager.MODE_ALLOWED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_ALLOWED));
ops.add(new PackageOps(PACKAGE_1, UID_10_1, entries));
@@ -712,10 +712,10 @@ public class AppStateTrackerTest {
entries = new ArrayList<>();
entries.add(new OpEntry(
AppStateTracker.TARGET_OP,
- AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_IGNORED));
entries.add(new OpEntry(
AppOpsManager.OP_ACCESS_NOTIFICATIONS,
- AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, null));
+ AppOpsManager.MODE_IGNORED));
ops.add(new PackageOps(PACKAGE_3, UID_10_3, entries));
diff --git a/services/tests/runtests.py b/services/tests/runtests.py
index f19cc5d567ec..4c8b4bad8019 100755
--- a/services/tests/runtests.py
+++ b/services/tests/runtests.py
@@ -19,7 +19,7 @@ import subprocess
import sys
INSTRUMENTED_PACKAGE_RUNNER = ('com.android.frameworks.servicestests/'
- 'android.support.test.runner.AndroidJUnitRunner')
+ 'androidx.test.runner.AndroidJUnitRunner')
PACKAGE_WHITELIST = (
"com.android.server",
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
index edd89f9e61d1..96f329b9161e 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
@@ -45,21 +45,6 @@ public class AppOpsNotedWatcherTest {
private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
- public void testWatchNotedOpsRequiresPermission() {
- // Create a mock listener
- final OnOpNotedListener listener = mock(OnOpNotedListener.class);
-
- // Try to start watching noted ops
- final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
- try {
- appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION,
- AppOpsManager.OP_RECORD_AUDIO}, listener);
- fail("Watching noted ops shoudl require " + Manifest.permission.WATCH_APPOPS);
- } catch (SecurityException expected) {
- /*ignored*/
- }
- }
-
@Test
public void testWatchNotedOps() {
// Create a mock listener
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java
index eb0c6279ea99..66d2baba2909 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsUpgradeTest.java
@@ -107,8 +107,8 @@ public class AppOpsUpgradeTest {
}
final AppOpsService.Op _op1 = ops.get(op1);
final AppOpsService.Op _op2 = ops.get(op2);
- final int mode1 = (_op1 == null) ? defaultModeOp1 : _op1.mode;
- final int mode2 = (_op2 == null) ? defaultModeOp2 : _op2.mode;
+ final int mode1 = (_op1 == null) ? defaultModeOp1 : _op1.getMode();
+ final int mode2 = (_op2 == null) ? defaultModeOp2 : _op2.getMode();
assertEquals(mode1, mode2);
if (mode1 != defaultModeOp1) {
numberOfNonDefaultOps++;
diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
index fc7ccc576abb..798605568138 100644
--- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java
@@ -31,7 +31,6 @@ import static org.mockito.Mockito.when;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.PackageRollbackInfo.RestoreInfo;
-import android.content.rollback.RollbackInfo;
import android.util.IntArray;
import android.util.SparseLongArray;
@@ -46,8 +45,7 @@ import org.mockito.Mockito;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.Set;
@RunWith(JUnit4.class)
public class AppDataRollbackHelperTest {
@@ -247,13 +245,13 @@ public class AppDataRollbackHelperTest {
-1);
dataForDifferentUser.info.getPackages().add(ignoredInfo);
- RollbackInfo rollbackInfo = new RollbackInfo(17239,
- Arrays.asList(pendingRestore, wasRecentlyRestored), false,
- new ArrayList<>(), -1);
+ RollbackData dataForRestore = new RollbackData(17239, new File("/does/not/exist"), -1);
+ dataForRestore.info.getPackages().add(pendingRestore);
+ dataForRestore.info.getPackages().add(wasRecentlyRestored);
- List<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37,
- Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser),
- Collections.singletonList(rollbackInfo));
+ Set<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37,
+ Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser,
+ dataForRestore));
InOrder inOrder = Mockito.inOrder(installer);
// Check that pending backup and restore for the same package mutually destroyed each other.
@@ -267,9 +265,10 @@ public class AppDataRollbackHelperTest {
assertEquals(53, pendingBackup.getCeSnapshotInodes().get(37));
// Check that changed returns correct RollbackData.
- assertEquals(2, changed.size());
- assertEquals(dataWithPendingBackup, changed.get(0));
- assertEquals(dataWithRecentRestore, changed.get(1));
+ assertEquals(3, changed.size());
+ assertTrue(changed.contains(dataWithPendingBackup));
+ assertTrue(changed.contains(dataWithRecentRestore));
+ assertTrue(changed.contains(dataForRestore));
// Check that restore was performed.
inOrder.verify(installer).restoreAppDataSnapshot(
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 8171469d4da4..6ec864c05258 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -61,7 +61,6 @@ import android.util.ArraySet;
import android.view.Display;
import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -323,6 +322,8 @@ public class AppStandbyControllerTests {
private boolean mOnParole = false;
private CountDownLatch mLatch;
private long mLastParoleChangeTime;
+ private boolean mIsExpecting = false;
+ private boolean mExpectedParoleState;
public boolean getParoleState() {
synchronized (this) {
@@ -333,6 +334,15 @@ public class AppStandbyControllerTests {
public void rearmLatch() {
synchronized (this) {
mLatch = new CountDownLatch(1);
+ mIsExpecting = false;
+ }
+ }
+
+ public void rearmLatch(boolean expectedParoleState) {
+ synchronized (this) {
+ mLatch = new CountDownLatch(1);
+ mIsExpecting = true;
+ mExpectedParoleState = expectedParoleState;
}
}
@@ -358,7 +368,9 @@ public class AppStandbyControllerTests {
if (mLatch != null && mLatch.getCount() > 0) {
mOnParole = isParoleOn;
mLastParoleChangeTime = getCurrentTime();
- mLatch.countDown();
+ if (!mIsExpecting || isParoleOn == mExpectedParoleState) {
+ mLatch.countDown();
+ }
}
}
}
@@ -417,17 +429,23 @@ public class AppStandbyControllerTests {
}
@Test
- @FlakyTest(bugId = 119774928)
public void testEnabledState() throws Exception {
TestParoleListener paroleListener = new TestParoleListener();
+ paroleListener.rearmLatch(true);
mController.addListener(paroleListener);
long lastUpdateTime;
// Test that listeners are notified if enabled changes when the device is not in parole.
setChargingState(mController, false);
- // Start off not enabled. Device is effectively on permanent parole.
+ // Start off not enabled. Device is effectively in permanent parole.
setAppIdleEnabled(mController, false);
+ // Since AppStandbyController uses a handler to notify listeners of a state change, there is
+ // some inherent latency between changing the state and getting the notification. We need to
+ // wait until the paroleListener has been notified that parole is on before continuing with
+ // the test.
+ paroleListener.awaitOnLatch(STABLE_CHARGING_THRESHOLD * 3 / 2);
+ assertTrue(paroleListener.mOnParole);
// Enable controller
paroleListener.rearmLatch();
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 8caa39dfc9e7..1f861716d380 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -175,9 +175,9 @@ public class AppTimeLimitControllerTests {
/** Verify app usage limit observer is added */
@Test
public void testAppUsageLimitObserver_AddObserver() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID1));
- addAppUsageLimitObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN, TIME_30_MIN);
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID2));
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID1));
}
@@ -203,7 +203,7 @@ public class AppTimeLimitControllerTests {
/** Verify app usage limit observer is removed */
@Test
public void testAppUsageLimitObserver_RemoveObserver() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID1));
mController.removeAppUsageLimitObserver(UID, OBS_ID1, USER_ID);
assertFalse("Observer wasn't removed", hasAppUsageLimitObserver(UID, OBS_ID1));
@@ -290,9 +290,9 @@ public class AppTimeLimitControllerTests {
/** Re-adding an observer should result in only one copy */
@Test
public void testAppUsageLimitObserver_ObserverReAdd() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID1));
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_10_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_10_MIN, TIME_10_MIN);
assertTrue("Observer wasn't added",
getAppUsageLimitObserver(UID, OBS_ID1).getTimeLimitMs() == TIME_10_MIN);
mController.removeAppUsageLimitObserver(UID, OBS_ID1, USER_ID);
@@ -304,7 +304,7 @@ public class AppTimeLimitControllerTests {
public void testAllObservers_ExclusiveObserverIds() {
addAppUsageObserver(OBS_ID1, GROUP1, TIME_10_MIN);
addUsageSessionObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_1_MIN);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_10_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_10_MIN, TIME_10_MIN);
assertTrue("Observer wasn't added", hasAppUsageObserver(UID, OBS_ID1));
assertTrue("Observer wasn't added", hasUsageSessionObserver(UID, OBS_ID1));
assertTrue("Observer wasn't added", hasAppUsageLimitObserver(UID, OBS_ID1));
@@ -396,7 +396,7 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_Accumulation() throws Exception {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
startUsage(PKG_SOC1);
// Add 10 mins
setTime(TIME_10_MIN);
@@ -456,7 +456,7 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_TimeoutOtherApp() throws Exception {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, 4_000L);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, 4_000L, 4_000L);
startUsage(PKG_SOC2);
assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
setTime(6_000L);
@@ -498,7 +498,7 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_Timeout() throws Exception {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, 4_000L);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, 4_000L, 4_000L);
startUsage(PKG_SOC1);
setTime(6_000L);
assertTrue(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
@@ -551,7 +551,7 @@ public class AppTimeLimitControllerTests {
setTime(TIME_10_MIN);
startUsage(PKG_GAME1);
setTime(TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP_GAME, TIME_30_MIN, TIME_30_MIN);
setTime(TIME_30_MIN + TIME_10_MIN);
stopUsage(PKG_GAME1);
assertFalse(mLimitReachedLatch.await(1_000L, TimeUnit.MILLISECONDS));
@@ -612,7 +612,7 @@ public class AppTimeLimitControllerTests {
startUsage(PKG_SOC1);
setTime(TIME_10_MIN);
// 10 second time limit
- addAppUsageLimitObserver(OBS_ID1, GROUP_SOC, 10_000L);
+ addAppUsageLimitObserver(OBS_ID1, GROUP_SOC, 10_000L, 10_000L);
setTime(TIME_10_MIN + 5_000L);
// Shouldn't call back in 6 seconds
assertFalse(mLimitReachedLatch.await(6_000L, TimeUnit.MILLISECONDS));
@@ -692,23 +692,23 @@ public class AppTimeLimitControllerTests {
public void testAppUsageLimitObserver_MaxObserverLimit() throws Exception {
boolean receivedException = false;
int ANOTHER_UID = UID + 1;
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID2, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID3, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID4, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID5, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID6, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID7, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID8, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID9, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID10, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID3, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID4, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID5, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID6, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID7, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID8, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID9, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID10, GROUP1, TIME_30_MIN, TIME_30_MIN);
// Readding an observer should not cause an IllegalStateException
- addAppUsageLimitObserver(OBS_ID5, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID5, GROUP1, TIME_30_MIN, TIME_30_MIN);
// Adding an observer for a different uid shouldn't cause an IllegalStateException
mController.addAppUsageLimitObserver(
- ANOTHER_UID, OBS_ID11, GROUP1, TIME_30_MIN, null, USER_ID);
+ ANOTHER_UID, OBS_ID11, GROUP1, TIME_30_MIN, TIME_30_MIN, null, USER_ID);
try {
- addAppUsageLimitObserver(OBS_ID11, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID11, GROUP1, TIME_30_MIN, TIME_30_MIN);
} catch (IllegalStateException ise) {
receivedException = true;
}
@@ -748,9 +748,9 @@ public class AppTimeLimitControllerTests {
public void testAppUsageLimitObserver_MinimumTimeLimit() throws Exception {
boolean receivedException = false;
// adding an observer with a one minute time limit should not cause an exception
- addAppUsageLimitObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT, MIN_TIME_LIMIT);
try {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT - 1);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, MIN_TIME_LIMIT - 1, MIN_TIME_LIMIT - 1);
} catch (IllegalArgumentException iae) {
receivedException = true;
}
@@ -807,7 +807,7 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_ConcurrentUsage() throws Exception {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
AppTimeLimitController.UsageGroup group = getAppUsageLimitObserver(UID, OBS_ID1);
startUsage(PKG_SOC1);
// Add 10 mins
@@ -967,7 +967,7 @@ public class AppTimeLimitControllerTests {
/** Verify app usage limit observer added correctly reports its total usage limit */
@Test
public void testAppUsageLimitObserver_GetTotalUsageLimit() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
AppTimeLimitController.AppUsageLimitGroup group = getAppUsageLimitObserver(UID, OBS_ID1);
assertNotNull("Observer wasn't added", group);
assertEquals("Observer didn't correctly report total usage limit",
@@ -978,7 +978,7 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_GetUsageRemaining() {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
startUsage(PKG_SOC1);
setTime(TIME_10_MIN);
stopUsage(PKG_SOC1);
@@ -993,8 +993,8 @@ public class AppTimeLimitControllerTests {
*/
@Test
public void testAppUsageLimitObserver_GetAppUsageLimit() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN, TIME_10_MIN);
UsageStatsManagerInternal.AppUsageLimitData group = getAppUsageLimit(PKG_SOC1);
assertEquals("Observer with the smallest usage limit remaining wasn't returned",
TIME_10_MIN, group.getTotalUsageLimit());
@@ -1006,8 +1006,8 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_GetAppUsageLimitUsed() {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN, TIME_10_MIN);
startUsage(PKG_GAME1);
setTime(TIME_10_MIN * 2 + TIME_1_MIN);
stopUsage(PKG_GAME1);
@@ -1024,8 +1024,8 @@ public class AppTimeLimitControllerTests {
@Test
public void testAppUsageLimitObserver_GetAppUsageLimitAllUsed() {
setTime(0L);
- addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN);
- addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN);
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_30_MIN, TIME_30_MIN);
+ addAppUsageLimitObserver(OBS_ID2, GROUP_SOC, TIME_10_MIN, TIME_10_MIN);
startUsage(PKG_SOC1);
setTime(TIME_10_MIN);
stopUsage(PKG_SOC1);
@@ -1035,10 +1035,21 @@ public class AppTimeLimitControllerTests {
0L, group.getUsageRemaining());
}
+ /** Verify that a limit of 0 is not allowed. */
+ @Test
+ public void testAppUsageLimitObserver_ZeroTimeLimitIsNotAllowed() {
+ try {
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, 0, 0);
+ fail("timeLimit of 0 should not be allowed.");
+ } catch (IllegalArgumentException expected) {
+ // Exception expected.
+ }
+ }
+
/** Verify that a limit of 0 is allowed for the special case of re-registering an observer. */
@Test
- public void testAppUsageLimitObserver_ZeroTimeLimitIsAllowed() {
- addAppUsageLimitObserver(OBS_ID1, GROUP1, 0);
+ public void testAppUsageLimitObserver_ZeroTimeRemainingIsAllowed() {
+ addAppUsageLimitObserver(OBS_ID1, GROUP1, TIME_1_MIN, 0);
AppTimeLimitController.AppUsageLimitGroup group = getAppUsageLimitObserver(UID, OBS_ID1);
assertNotNull("Observer wasn't added", group);
assertEquals("Usage remaining was not 0.", 0, group.getUsageRemaining());
@@ -1066,8 +1077,10 @@ public class AppTimeLimitControllerTests {
null, null, USER_ID);
}
- private void addAppUsageLimitObserver(int observerId, String[] packages, long timeLimit) {
- mController.addAppUsageLimitObserver(UID, observerId, packages, timeLimit, null, USER_ID);
+ private void addAppUsageLimitObserver(int observerId, String[] packages, long timeLimit,
+ long timeRemaining) {
+ mController.addAppUsageLimitObserver(UID, observerId, packages, timeLimit, timeRemaining,
+ null, USER_ID);
}
/** Is there still an app usage observer by that id */
diff --git a/services/tests/uiservicestests/Android.bp b/services/tests/uiservicestests/Android.bp
index f4443fe81a00..e4ab257c8d28 100644
--- a/services/tests/uiservicestests/Android.bp
+++ b/services/tests/uiservicestests/Android.bp
@@ -17,7 +17,7 @@ android_test {
"services.net",
"services.usage",
"guava",
- "android-support-test",
+ "androidx.test.rules", "hamcrest-library",
"mockito-target-inline-minus-junit4",
"platform-test-annotations",
"hamcrest-library",
diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
index 56d3a20df9a7..a1d48cc9d638 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
@@ -16,15 +16,15 @@ package com.android.server;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
import android.os.Build;
-import android.support.test.InstrumentationRegistry;
import android.testing.TestableContext;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.uri.UriGrantsManagerInternal;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java b/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
index d4c41e0285bd..dc7f118628b7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
@@ -20,9 +20,10 @@ import static com.android.server.notification.AlertRateLimiter.ALLOWED_ALERT_INT
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
index cfc7430cc8f4..e1f39137e618 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
@@ -15,26 +15,26 @@
*/
package com.android.server.notification;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_BADGE;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.when;
+
import android.app.ActivityManager;
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.NotificationChannel;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
index 3e01fb58c754..273a9e66e55b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BubbleExtractorTest.java
@@ -17,8 +17,6 @@ package com.android.server.notification;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_BADGE;
-import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -31,9 +29,10 @@ import android.app.Notification.Builder;
import android.app.NotificationChannel;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
index 20c5f5dd63dc..6be2c2e8c59e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -62,13 +62,14 @@ import android.os.Vibrator;
import android.provider.Settings;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager;
import android.view.accessibility.IAccessibilityManagerClient;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.IntPair;
import com.android.server.UiServiceTestCase;
import com.android.server.lights.Light;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
index 97f210400141..5041779840b3 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
@@ -16,18 +16,16 @@
package com.android.server.notification;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.eq;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
index 84ef0c9c7a4a..f652c5afd203 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
@@ -25,21 +25,22 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-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;
-
import android.app.Notification;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
+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;
+
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
index abc6e3cf46bf..e9515fa7fd9d 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
@@ -15,31 +15,30 @@
*/
package com.android.server.notification;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.Notification;
import android.app.Notification.Builder;
-import android.app.NotificationManager;
import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.when;
-
-import static org.junit.Assert.assertEquals;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.UiServiceTestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ImportanceExtractorTest extends UiServiceTestCase {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
index ca473c64991f..1408749fa4fe 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
@@ -24,10 +24,11 @@ import static junit.framework.Assert.assertNull;
import android.app.NotificationChannel;
import android.net.Uri;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Xml;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
index 068129569d14..e15af3dbecc4 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
@@ -35,10 +35,11 @@ import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.telecom.TelecomManager;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
index 2162f282e134..52c199a34f67 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
@@ -39,9 +39,10 @@ import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.NotificationRankingUpdate;
import android.service.notification.SnoozeCriterion;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index b9ae7d5e3f93..9f11472b9c7c 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -56,8 +56,9 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.Adjustment;
import android.service.notification.StatusBarNotification;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.R;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
index bae8564a0694..20d7a2af1540 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
@@ -17,7 +17,6 @@ package com.android.server.notification;
import static android.service.notification.NotificationStats.DISMISSAL_PEEK;
import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_NEGATIVE;
-import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_POSITIVE;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
@@ -25,9 +24,10 @@ import static junit.framework.Assert.assertTrue;
import android.os.Parcel;
import android.service.notification.NotificationStats;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
index 55c16b367fab..0ea53fa3e04f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
@@ -22,20 +22,18 @@ import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
import android.app.ActivityManager;
import android.app.Notification;
-import android.app.Person;
import android.app.PendingIntent;
+import android.app.Person;
import android.app.RemoteInput;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
@@ -43,14 +41,15 @@ import android.graphics.Typeface;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.StyleSpan;
import android.util.Pair;
import android.widget.RemoteViews;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotifyingAppTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotifyingAppTest.java
index fbb8c33d14aa..25e10d0740da 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotifyingAppTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotifyingAppTest.java
@@ -20,9 +20,10 @@ import static junit.framework.Assert.assertTrue;
import android.os.Parcel;
import android.service.notification.NotifyingApp;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 05bb30742fbd..39e47ecb1b22 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -59,13 +59,14 @@ import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings.Secure;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.TestableContentResolver;
import android.util.ArrayMap;
import android.util.Xml;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index b32288720fd2..2abd340e967a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -41,13 +41,13 @@ import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
-import android.provider.Settings.Secure;
import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.TestableContentResolver;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
index 5d8d48f158fa..68aa1dc1bf3b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
@@ -15,17 +15,19 @@
*/
package com.android.server.notification;
-import android.support.test.runner.AndroidJUnit4;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.UiServiceTestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RateEstimatorTest extends UiServiceTestCase {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index 110e3fe5eb24..042c9d99eb8c 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -23,14 +23,14 @@ import static org.junit.Assert.assertTrue;
import android.service.notification.ScheduleCalendar;
import android.service.notification.ZenModeConfig;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.filters.FlakyTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
index efa70e7204f1..551e1860d9b3 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
@@ -10,11 +10,11 @@ import android.net.Uri;
import android.service.notification.Condition;
import android.service.notification.ScheduleCalendar;
import android.service.notification.ZenModeConfig;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
index 174c5fa6a51e..1e645436e7ea 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
@@ -15,12 +15,17 @@
*/
package com.android.server.notification;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.app.Notification;
@@ -30,24 +35,19 @@ import android.app.PendingIntent;
import android.os.SystemClock;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.IntArray;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.UiServiceTestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
index 025b11a70414..b1ee1209d83e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
@@ -15,23 +15,24 @@
*/
package com.android.server.notification;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
import android.app.Notification;
import android.app.Person;
import android.os.Bundle;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.SpannableString;
-import java.util.ArrayList;
-import java.util.Arrays;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.UiServiceTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertEquals;
-
-import com.android.server.UiServiceTestCase;
+import java.util.ArrayList;
+import java.util.Arrays;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
index 9c7e0289248b..dcab78ede287 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeConfigTest.java
@@ -28,10 +28,11 @@ import android.service.notification.Condition;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.EventInfo;
import android.service.notification.ZenPolicy;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Xml;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
index 7c6b1c15177e..a0ee417c8b47 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenPolicyTest.java
@@ -19,14 +19,14 @@ package com.android.server.notification;
import static junit.framework.Assert.assertEquals;
import android.service.notification.ZenPolicy;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PackageMatchingCacheTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PackageMatchingCacheTest.java
index c6aea882b7ca..f6c854e23494 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/PackageMatchingCacheTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/PackageMatchingCacheTest.java
@@ -21,10 +21,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import com.android.server.slice.SliceManagerService.PackageMatchingCache;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
index a71aca53ca26..4c2822af264c 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
@@ -26,11 +26,12 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java
index 1efa4153073a..ff2236d25e28 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java
@@ -24,14 +24,15 @@ import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.net.Uri;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.Xml.Encoding;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
-import com.android.server.slice.SlicePermissionManager.PkgUser;
import com.android.server.slice.SliceClientPermissions.SliceAuthority;
+import com.android.server.slice.SlicePermissionManager.PkgUser;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java
index bc2815099fdb..d942c5af0422 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java
@@ -19,9 +19,10 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
import android.util.Xml.Encoding;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import org.junit.Before;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
index 6d4f5f891dc1..7182f0f3bf80 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -34,18 +34,18 @@ import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
import android.app.slice.SliceSpec;
import android.app.usage.UsageStatsManagerInternal;
-import android.content.pm.PackageManagerInternal;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableContext;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.filters.SmallTest;
+
import com.android.server.LocalServices;
import com.android.server.UiServiceTestCase;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
index efefee119e5f..1872530baa7a 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
@@ -23,13 +23,14 @@ import android.content.ContentResolver;
import android.net.Uri;
import android.net.Uri.Builder;
import android.os.FileUtils;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.util.Log;
import android.util.Xml.Encoding;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import org.junit.Test;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java
index 5775991b8ba6..8e61d210c28f 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java
@@ -20,11 +20,12 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.Xml.Encoding;
+import androidx.test.filters.SmallTest;
+
import com.android.server.UiServiceTestCase;
import com.android.server.slice.SlicePermissionManager.PkgUser;
import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index b91f3ecd78c2..6e09167f7cba 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -23,29 +23,29 @@ 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 androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.view.Display;
-import androidx.test.filters.SmallTest;
-
import org.junit.Before;
import org.junit.Test;
+import androidx.test.filters.SmallTest;
+
/**
* Test class for {@link AppTransition}.
*
* Build/Install/Run:
- * atest FrameworksServicesTests:AppTransitionTests
+ * atest WmTests:AppTransitionTests
*/
@SmallTest
@Presubmit
@@ -167,4 +167,11 @@ public class AppTransitionTests extends WindowTestsBase {
assertFalse(dc1.mOpeningApps.contains(token1));
}
+ @Test
+ public void testLoadAnimationSafely() {
+ DisplayContent dc = createNewDisplay(Display.STATE_ON);
+ assertNull(dc.mAppTransition.loadAnimationSafely(
+ getInstrumentation().getTargetContext(), -1));
+ }
+
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
index 61c1d39e420f..2ccdb9ea068c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.DisplayCutout.BOUNDS_POSITION_TOP;
import static android.view.DisplayCutout.fromBoundingRect;
@@ -41,6 +42,7 @@ import com.android.server.wm.utils.WmDisplayCutout;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
/**
* Tests for the {@link WindowState#computeFrameLw} method and other window frame machinery.
@@ -78,17 +80,22 @@ public class WindowFrameTests extends WindowTestsBase {
}
private static class TaskWithBounds extends Task {
- final Rect mBounds;
+ Rect mBounds;
final Rect mOverrideDisplayedBounds = new Rect();
boolean mFullscreenForTest = true;
TaskWithBounds(TaskStack stack, WindowManagerService wm, Rect bounds) {
super(0, stack, 0, wm, 0, false, new TaskDescription(), null);
- mBounds = bounds;
setBounds(bounds);
}
@Override
+ public int setBounds(Rect bounds) {
+ mBounds = bounds;
+ return super.setBounds(bounds);
+ }
+
+ @Override
public Rect getBounds() {
return mBounds;
}
@@ -513,6 +520,66 @@ public class WindowFrameTests extends WindowTestsBase {
assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetRight(), 0);
}
+ @Test
+ public void testFreeformContentInsets() {
+ // fullscreen task doesn't use bounds for computeFrame
+ final Task task = new TaskWithBounds(mStubStack, mWm, null);
+ WindowState w = createWindow(task, MATCH_PARENT, MATCH_PARENT);
+ w.mAttrs.gravity = Gravity.LEFT | Gravity.TOP;
+ task.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ ((TaskWithBounds) task).mFullscreenForTest = false;
+ w.setWindowingMode(WINDOWING_MODE_FREEFORM);
+
+ DisplayContent dc = mWm.getDefaultDisplayContentLocked();
+ dc.mInputMethodTarget = w;
+ WindowState mockIme = mock(WindowState.class);
+ Mockito.doReturn(true).when(mockIme).isVisibleNow();
+ dc.mInputMethodWindow = mockIme;
+
+ // With no insets or system decor all the frames incoming from PhoneWindowManager
+ // are identical.
+ final Rect pf = new Rect(0, 0, 1000, 800);
+ final Rect df = pf;
+ final Rect of = df;
+ final Rect cf = new Rect(pf);
+ cf.bottom -= 400;
+ final Rect vf = new Rect(cf);
+ final Rect sf = new Rect(pf);
+ final Rect dcf = pf;
+
+ // First check that it only gets moved up enough to show window.
+ final Rect winRect = new Rect(200, 200, 300, 500);
+
+ task.setBounds(winRect);
+ w.setBounds(winRect);
+ w.getWindowFrames().setFrames(pf, df, of, cf, vf, dcf, sf, mEmptyRect);
+ w.computeFrameLw();
+
+ final Rect expected = new Rect(winRect.left, cf.bottom - winRect.height(),
+ winRect.right, cf.bottom);
+ assertEquals(expected, w.getFrameLw());
+ assertEquals(expected, w.getContentFrameLw());
+ assertEquals(expected, w.getVisibleFrameLw());
+
+ // Now check that it won't get moved beyond the top and then has appropriate insets
+ winRect.bottom = 600;
+ task.setBounds(winRect);
+ w.setBounds(winRect);
+ w.getWindowFrames().setFrames(pf, df, of, cf, vf, dcf, sf, mEmptyRect);
+ w.computeFrameLw();
+
+ assertFrame(w, winRect.left, 0, winRect.right, winRect.height());
+ expected.top = 0;
+ expected.bottom = cf.bottom;
+ assertContentFrame(w, expected);
+ assertVisibleFrame(w, expected);
+
+ // Check that it's moved back without ime insets
+ w.getWindowFrames().setFrames(pf, df, of, pf, pf, dcf, sf, mEmptyRect);
+ w.computeFrameLw();
+ assertEquals(winRect, w.getFrameLw());
+ }
+
private WindowStateWithTask createWindow(Task task, int width, int height) {
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
attrs.width = width;
diff --git a/services/usage/java/com/android/server/usage/AppTimeLimitController.java b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
index 731cbf42eca7..f3d63873dc4b 100644
--- a/services/usage/java/com/android/server/usage/AppTimeLimitController.java
+++ b/services/usage/java/com/android/server/usage/AppTimeLimitController.java
@@ -511,8 +511,10 @@ public class AppTimeLimitController {
class AppUsageLimitGroup extends UsageGroup {
public AppUsageLimitGroup(UserData user, ObserverAppData observerApp, int observerId,
- String[] observed, long timeLimitMs, PendingIntent limitReachedCallback) {
+ String[] observed, long timeLimitMs, long timeRemainingMs,
+ PendingIntent limitReachedCallback) {
super(user, observerApp, observerId, observed, timeLimitMs, limitReachedCallback);
+ mUsageTimeMs = timeLimitMs - timeRemainingMs;
}
@Override
@@ -839,9 +841,9 @@ public class AppTimeLimitController {
* Existing app usage limit observer with the same observerId will be removed.
*/
public void addAppUsageLimitObserver(int requestingUid, int observerId, String[] observed,
- long timeLimit, PendingIntent callbackIntent, @UserIdInt int userId) {
- // Allow the special case of the limit being 0, but with no callback.
- if (timeLimit != 0L && timeLimit < getMinTimeLimit()) {
+ long timeLimit, long timeRemaining, PendingIntent callbackIntent,
+ @UserIdInt int userId) {
+ if (timeLimit < getMinTimeLimit()) {
throw new IllegalArgumentException("Time limit must be >= " + getMinTimeLimit());
}
synchronized (mLock) {
@@ -859,7 +861,7 @@ public class AppTimeLimitController {
"Too many app usage observers added by uid " + requestingUid);
}
group = new AppUsageLimitGroup(user, observerApp, observerId, observed, timeLimit,
- timeLimit == 0L ? null : callbackIntent);
+ timeRemaining, timeRemaining == 0L ? null : callbackIntent);
observerApp.appUsageLimitGroups.append(observerId, group);
if (DEBUG) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
index 4756fb4d4948..485a79d63862 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
@@ -27,6 +27,7 @@ import android.util.Slog;
import android.util.TimeUtils;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import libcore.io.IoUtils;
@@ -1246,4 +1247,36 @@ public class UsageStatsDatabase {
}
directory.delete();
}
+
+ /**
+ * print total number and list of stats files for each interval type.
+ * @param pw
+ */
+ public void dump(IndentingPrintWriter pw, boolean compact) {
+ synchronized (mLock) {
+ pw.println("UsageStatsDatabase:");
+ pw.increaseIndent();
+ for (int i = 0; i < mSortedStatFiles.length; i++) {
+ final TimeSparseArray<AtomicFile> files = mSortedStatFiles[i];
+ final int size = files.size();
+ pw.print(UserUsageStatsService.intervalToString(i));
+ pw.print(" stats files: ");
+ pw.print(size);
+ pw.println(", sorted list of files:");
+ pw.increaseIndent();
+ for (int f = 0; f < size; f++) {
+ final long fileName = files.keyAt(f);
+ if (compact) {
+ pw.print(UserUsageStatsService.formatDateTime(fileName, false));
+ } else {
+ pw.printPair(Long.toString(fileName),
+ UserUsageStatsService.formatDateTime(fileName, true));
+ }
+ pw.println();
+ }
+ pw.decreaseIndent();
+ }
+ pw.decreaseIndent();
+ }
+ }
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index b14d7228dcb4..27fdbcb80275 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -1399,7 +1399,8 @@ public class UsageStatsService extends SystemService implements
@Override
public void registerAppUsageLimitObserver(int observerId, String[] packages,
- long timeLimitMs, PendingIntent callbackIntent, String callingPackage) {
+ long timeLimitMs, long timeRemainingMs, PendingIntent callbackIntent,
+ String callingPackage) {
if (!hasPermissions(callingPackage,
Manifest.permission.SUSPEND_APPS, Manifest.permission.OBSERVE_APP_USAGE)) {
throw new SecurityException("Caller doesn't have both SUSPEND_APPS and "
@@ -1409,7 +1410,11 @@ public class UsageStatsService extends SystemService implements
if (packages == null || packages.length == 0) {
throw new IllegalArgumentException("Must specify at least one package");
}
- if (callbackIntent == null && timeLimitMs != 0L) {
+ if (timeRemainingMs > timeLimitMs) {
+ throw new IllegalArgumentException(
+ "Remaining time can't be greater than total time.");
+ }
+ if (callbackIntent == null && timeRemainingMs != 0L) {
throw new NullPointerException("callbackIntent can't be null");
}
final int callingUid = Binder.getCallingUid();
@@ -1417,7 +1422,7 @@ public class UsageStatsService extends SystemService implements
final long token = Binder.clearCallingIdentity();
try {
UsageStatsService.this.registerAppUsageLimitObserver(callingUid, observerId,
- packages, timeLimitMs, callbackIntent, userId);
+ packages, timeLimitMs, timeRemainingMs, callbackIntent, userId);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -1545,9 +1550,9 @@ public class UsageStatsService extends SystemService implements
}
void registerAppUsageLimitObserver(int callingUid, int observerId, String[] packages,
- long timeLimitMs, PendingIntent callbackIntent, int userId) {
- mAppTimeLimit.addAppUsageLimitObserver(callingUid, observerId, packages, timeLimitMs,
- callbackIntent, userId);
+ long timeLimitMs, long timeRemainingMs, PendingIntent callbackIntent, int userId) {
+ mAppTimeLimit.addAppUsageLimitObserver(callingUid, observerId, packages,
+ timeLimitMs, timeRemainingMs, callbackIntent, userId);
}
void unregisterAppUsageLimitObserver(int callingUid, int observerId, int userId) {
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index ebd8e36aa07d..b9a5676a84ef 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -658,9 +658,10 @@ class UserUsageStatsService {
pw.println(" stats");
printIntervalStats(pw, mCurrentStats[interval], !compact, true, pkg);
}
+ mDatabase.dump(pw, compact);
}
- private String formatDateTime(long dateTime, boolean pretty) {
+ static String formatDateTime(long dateTime, boolean pretty) {
if (pretty) {
return "\"" + sDateFormat.format(dateTime)+ "\"";
}
@@ -888,7 +889,7 @@ class UserUsageStatsService {
pw.decreaseIndent();
}
- private static String intervalToString(int interval) {
+ public static String intervalToString(int interval) {
switch (interval) {
case INTERVAL_DAILY:
return "daily";
diff --git a/startop/iorap/tests/Android.bp b/startop/iorap/tests/Android.bp
index 5ac4a46b81f1..4359978f5814 100644
--- a/startop/iorap/tests/Android.bp
+++ b/startop/iorap/tests/Android.bp
@@ -29,7 +29,7 @@ java_library {
// test android dependencies
"platform-test-annotations",
- "android-support-test",
+ "androidx.test.rules",
// test framework dependencies
"mockito-target-inline-minus-junit4",
// "mockito-target-minus-junit4",
diff --git a/startop/iorap/tests/AndroidManifest.xml b/startop/iorap/tests/AndroidManifest.xml
index 99f4add6579f..b967e7207a3f 100644
--- a/startop/iorap/tests/AndroidManifest.xml
+++ b/startop/iorap/tests/AndroidManifest.xml
@@ -22,7 +22,7 @@
<!--suppress AndroidDomInspection -->
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.google.android.startop.iorap.tests" />
<!--
diff --git a/startop/iorap/tests/AndroidTest.xml b/startop/iorap/tests/AndroidTest.xml
index 919154d3e48a..bcd11033bed3 100644
--- a/startop/iorap/tests/AndroidTest.xml
+++ b/startop/iorap/tests/AndroidTest.xml
@@ -44,7 +44,7 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.google.android.startop.iorap.tests" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
</test>
</configuration>
diff --git a/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt
index 16dcbe20f46a..b1e6194e0c92 100644
--- a/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt
+++ b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt
@@ -14,12 +14,14 @@
package com.google.android.startop.iorap
-import android.net.Uri
import android.os.ServiceManager
-import android.support.test.filters.MediumTest
+import androidx.test.filters.MediumTest
import org.junit.Test
-import org.junit.Ignore
-import org.mockito.Mockito.*
+import org.mockito.Mockito.argThat
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.inOrder
+import org.mockito.Mockito.spy
+import org.mockito.Mockito.timeout
// @Ignore("Test is disabled until iorapd is added to init and there's selinux policies for it")
@MediumTest
@@ -27,7 +29,7 @@ class IIorapIntegrationTest {
/**
* @throws ServiceManager.ServiceNotFoundException if iorapd service could not be found
*/
- private val iorapService : IIorap by lazy {
+ private val iorapService: IIorap by lazy {
// TODO: connect to 'iorapd.stub' which doesn't actually do any work other than reply.
IIorap.Stub.asInterface(ServiceManager.getServiceOrThrow("iorapd"))
@@ -39,7 +41,7 @@ class IIorapIntegrationTest {
// A dummy binder stub implementation is required to use with mockito#spy.
// Mockito overrides the methods at runtime and tracks how methods were invoked.
- open class DummyTaskListener : ITaskListener.Stub() {
+ open class DummyTaskListener : ITaskListener.Stub() {
// Note: make parameters nullable to avoid the kotlin IllegalStateExceptions
// from using the mockito matchers (eq, argThat, etc).
override fun onProgress(requestId: RequestId?, result: TaskResult?) {
@@ -49,7 +51,7 @@ class IIorapIntegrationTest {
}
}
- private fun testAnyMethod(func : (RequestId) -> Unit) {
+ private fun testAnyMethod(func: (RequestId) -> Unit) {
val taskListener = spy(DummyTaskListener())!!
try {
@@ -68,14 +70,13 @@ class IIorapIntegrationTest {
// The "stub" behavior of iorapd is that every request immediately gets a response of
// BEGAN,ONGOING,COMPLETED
- inOrder.verify(taskListener, timeout(100)).
- onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_BEGAN })
- inOrder.verify(taskListener, timeout(100)).
- onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_ONGOING })
- inOrder.verify(taskListener, timeout(100)).
- onComplete(eq(requestId), argThat { it!!.state == TaskResult.STATE_COMPLETED })
+ inOrder.verify(taskListener, timeout(100))
+ .onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_BEGAN })
+ inOrder.verify(taskListener, timeout(100))
+ .onProgress(eq(requestId), argThat { it!!.state == TaskResult.STATE_ONGOING })
+ inOrder.verify(taskListener, timeout(100))
+ .onComplete(eq(requestId), argThat { it!!.state == TaskResult.STATE_COMPLETED })
inOrder.verifyNoMoreInteractions()
-
} finally {
// iorapService.setTaskListener(null)
// FIXME: null is broken, C++ side sees a non-null object.
@@ -96,7 +97,7 @@ class IIorapIntegrationTest {
@Test
fun testOnAppIntentEvent() {
- testAnyMethod { requestId : RequestId ->
+ testAnyMethod { requestId: RequestId ->
iorapService.onAppIntentEvent(requestId, AppIntentEvent.createDefaultIntentChanged(
ActivityInfo("dont care", "dont care"),
ActivityInfo("dont care 2", "dont care 2")))
@@ -105,7 +106,7 @@ class IIorapIntegrationTest {
@Test
fun testOnSystemServiceEvent() {
- testAnyMethod { requestId : RequestId ->
+ testAnyMethod { requestId: RequestId ->
iorapService.onSystemServiceEvent(requestId,
SystemServiceEvent(SystemServiceEvent.TYPE_START))
}
@@ -113,9 +114,9 @@ class IIorapIntegrationTest {
@Test
fun testOnSystemServiceUserEvent() {
- testAnyMethod { requestId : RequestId ->
+ testAnyMethod { requestId: RequestId ->
iorapService.onSystemServiceUserEvent(requestId,
- SystemServiceUserEvent(SystemServiceUserEvent.TYPE_START_USER,0))
+ SystemServiceUserEvent(SystemServiceUserEvent.TYPE_START_USER, 0))
}
}
}
diff --git a/startop/iorap/tests/src/com/google/android/startop/iorap/ParcelablesTest.kt b/startop/iorap/tests/src/com/google/android/startop/iorap/ParcelablesTest.kt
index 4abbb3e9f162..8fa0cde0f9cc 100644
--- a/startop/iorap/tests/src/com/google/android/startop/iorap/ParcelablesTest.kt
+++ b/startop/iorap/tests/src/com/google/android/startop/iorap/ParcelablesTest.kt
@@ -17,7 +17,7 @@ package com.google.android.startop.iorap
import android.net.Uri
import android.os.Parcel
import android.os.Parcelable
-import android.support.test.filters.SmallTest
+import androidx.test.filters.SmallTest
import org.junit.Test
import org.junit.runner.RunWith
import com.google.common.truth.Truth.assertThat
@@ -29,7 +29,7 @@ import org.junit.runners.Parameterized
*/
@SmallTest
@RunWith(Parameterized::class)
-class ParcelablesTest<T : Parcelable>(private val inputData : InputData<T>) {
+class ParcelablesTest<T : Parcelable>(private val inputData: InputData<T>) {
companion object {
private val initialRequestId = RequestId.nextValueForSequence()!!
@@ -73,19 +73,19 @@ class ParcelablesTest<T : Parcelable>(private val inputData : InputData<T>) {
TaskResult(TaskResult.STATE_ONGOING))
)
- private fun newActivityInfo() : ActivityInfo {
+ private fun newActivityInfo(): ActivityInfo {
return ActivityInfo("some package", "some activity")
}
- private fun newActivityInfoOther() : ActivityInfo {
+ private fun newActivityInfoOther(): ActivityInfo {
return ActivityInfo("some package 2", "some activity 2")
}
- private fun newUri() : Uri {
+ private fun newUri(): Uri {
return Uri.parse("https://www.google.com")
}
- private fun cloneRequestId(requestId: RequestId) : RequestId {
+ private fun cloneRequestId(requestId: RequestId): RequestId {
val constructor = requestId::class.java.declaredConstructors[0]
constructor.isAccessible = true
return constructor.newInstance(requestId.requestId) as RequestId
@@ -108,7 +108,7 @@ class ParcelablesTest<T : Parcelable>(private val inputData : InputData<T>) {
@Test
fun testParcelRoundTrip() {
// calling writeToParcel and then T::CREATOR.createFromParcel would return the same data.
- val assertParcels = { it : T, data : InputData<T> ->
+ val assertParcels = { it: T, data: InputData<T> ->
val parcel = Parcel.obtain()
it.writeToParcel(parcel, 0)
parcel.setDataPosition(0) // future reads will see all previous writes.
@@ -121,7 +121,7 @@ class ParcelablesTest<T : Parcelable>(private val inputData : InputData<T>) {
assertParcels(inputData.validOther, inputData)
}
- data class InputData<T : Parcelable>(val valid : T, val validCopy : T, val validOther : T) {
+ data class InputData<T : Parcelable>(val valid: T, val validCopy: T, val validOther: T) {
val kls = valid.javaClass
init {
assertThat(valid).isNotSameAs(validCopy)
@@ -130,8 +130,8 @@ class ParcelablesTest<T : Parcelable>(private val inputData : InputData<T>) {
assertThat(validOther.javaClass).isEqualTo(valid.javaClass)
}
- fun createFromParcel(parcel : Parcel) : T {
- val field = kls.getDeclaredField("CREATOR")
+ fun createFromParcel(parcel: Parcel): T {
+ val field = kls.getDeclaredField("CREATOR")
val creator = field.get(null) as Parcelable.Creator<T>
return creator.createFromParcel(parcel)
diff --git a/startop/view_compiler/dex_builder_test/Android.bp b/startop/view_compiler/dex_builder_test/Android.bp
index ac60e966fe43..22a3cfafbc44 100644
--- a/startop/view_compiler/dex_builder_test/Android.bp
+++ b/startop/view_compiler/dex_builder_test/Android.bp
@@ -43,7 +43,7 @@ android_test {
sdk_version: "current",
data: [":generate_dex_testcases", ":generate_compiled_layout1", ":generate_compiled_layout2"],
static_libs: [
- "android-support-test",
+ "androidx.test.rules",
"guava",
],
manifest: "AndroidManifest.xml",
diff --git a/startop/view_compiler/dex_builder_test/AndroidManifest.xml b/startop/view_compiler/dex_builder_test/AndroidManifest.xml
index 6ac5fc5db345..b33566363286 100644
--- a/startop/view_compiler/dex_builder_test/AndroidManifest.xml
+++ b/startop/view_compiler/dex_builder_test/AndroidManifest.xml
@@ -22,7 +22,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="android.startop.test"
android:label="DexBuilder Tests"/>
diff --git a/startop/view_compiler/dex_builder_test/AndroidTest.xml b/startop/view_compiler/dex_builder_test/AndroidTest.xml
index 92e2a718bcce..82509b960f24 100644
--- a/startop/view_compiler/dex_builder_test/AndroidTest.xml
+++ b/startop/view_compiler/dex_builder_test/AndroidTest.xml
@@ -31,6 +31,6 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="android.startop.test" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
</test>
</configuration>
diff --git a/startop/view_compiler/dex_builder_test/src/android/startop/test/DexBuilderTest.java b/startop/view_compiler/dex_builder_test/src/android/startop/test/DexBuilderTest.java
index 42d4161ee81e..f7b1674894f5 100644
--- a/startop/view_compiler/dex_builder_test/src/android/startop/test/DexBuilderTest.java
+++ b/startop/view_compiler/dex_builder_test/src/android/startop/test/DexBuilderTest.java
@@ -14,18 +14,14 @@
package android.startop.test;
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import com.google.common.io.ByteStreams;
-import dalvik.system.InMemoryDexClassLoader;
import dalvik.system.PathClassLoader;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.ByteBuffer;
+
import org.junit.Assert;
import org.junit.Test;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
// Adding tests here requires changes in several other places. See README.md in
// the view_compiler directory for more information.
public class DexBuilderTest {
diff --git a/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java b/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java
index a3b1b6c11ac3..3dfb20c2e524 100644
--- a/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java
+++ b/startop/view_compiler/dex_builder_test/src/android/startop/test/LayoutCompilerTest.java
@@ -15,18 +15,15 @@
package android.startop.test;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.view.View;
-import com.google.common.io.ByteStreams;
-import dalvik.system.InMemoryDexClassLoader;
+
+import androidx.test.InstrumentationRegistry;
+
import dalvik.system.PathClassLoader;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.ByteBuffer;
-import org.junit.Assert;
+
import org.junit.Test;
+import java.lang.reflect.Method;
+
// Adding tests here requires changes in several other places. See README.md in
// the view_compiler directory for more information.
public class LayoutCompilerTest {
diff --git a/telecomm/java/android/telecom/CallIdentification.java b/telecomm/java/android/telecom/CallIdentification.java
index d15e024ecca2..745affd6b17d 100644
--- a/telecomm/java/android/telecom/CallIdentification.java
+++ b/telecomm/java/android/telecom/CallIdentification.java
@@ -44,7 +44,7 @@ public final class CallIdentification implements Parcelable {
* A {@link CallScreeningService} uses this class to create new instances of
* {@link CallIdentification} for a screened call.
*/
- public static class Builder {
+ public final static class Builder {
private CharSequence mName;
private CharSequence mDescription;
private CharSequence mDetails;
@@ -67,7 +67,7 @@ public final class CallIdentification implements Parcelable {
* @param callIdAppName The app name.
* @hide
*/
- public Builder(String callIdPackageName, CharSequence callIdAppName) {
+ public Builder(@NonNull String callIdPackageName, @NonNull CharSequence callIdAppName) {
mPackageName = callIdPackageName;
mAppName = callIdAppName;
}
@@ -80,7 +80,7 @@ public final class CallIdentification implements Parcelable {
* @param name The name associated with the call, or {@code null} if none is provided.
* @return Builder instance.
*/
- public Builder setName(@Nullable CharSequence name) {
+ public @NonNull Builder setName(@Nullable CharSequence name) {
mName = name;
return this;
}
@@ -97,7 +97,7 @@ public final class CallIdentification implements Parcelable {
* @param description The call description, or {@code null} if none is provided.
* @return Builder instance.
*/
- public Builder setDescription(@Nullable CharSequence description) {
+ public @NonNull Builder setDescription(@Nullable CharSequence description) {
mDescription = description;
return this;
}
@@ -114,7 +114,8 @@ public final class CallIdentification implements Parcelable {
* @param details The call details, or {@code null} if none is provided.
* @return Builder instance.
*/
- public Builder setDetails(@Nullable CharSequence details) {
+
+ public @NonNull Builder setDetails(@Nullable CharSequence details) {
mDetails = details;
return this;
}
@@ -127,7 +128,7 @@ public final class CallIdentification implements Parcelable {
* @param photo The photo associated with the call, or {@code null} if none was provided.
* @return Builder instance.
*/
- public Builder setPhoto(@Nullable Icon photo) {
+ public @NonNull Builder setPhoto(@Nullable Icon photo) {
mPhoto = photo;
return this;
}
@@ -141,7 +142,7 @@ public final class CallIdentification implements Parcelable {
* @param nuisanceConfidence The nuisance confidence.
* @return The builder.
*/
- public Builder setNuisanceConfidence(@NuisanceConfidence int nuisanceConfidence) {
+ public @NonNull Builder setNuisanceConfidence(@NuisanceConfidence int nuisanceConfidence) {
mNuisanceConfidence = nuisanceConfidence;
return this;
}
@@ -152,7 +153,7 @@ public final class CallIdentification implements Parcelable {
*
* @return {@link CallIdentification} instance.
*/
- public CallIdentification build() {
+ public @NonNull CallIdentification build() {
return new CallIdentification(mName, mDescription, mDetails, mPhoto,
mNuisanceConfidence, mPackageName, mAppName);
}
diff --git a/telecomm/java/android/telecom/PhoneAccountSuggestion.java b/telecomm/java/android/telecom/PhoneAccountSuggestion.java
index 05b23956fa51..3799cf332d7a 100644
--- a/telecomm/java/android/telecom/PhoneAccountSuggestion.java
+++ b/telecomm/java/android/telecom/PhoneAccountSuggestion.java
@@ -17,6 +17,7 @@
package android.telecom;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
@@ -72,7 +73,7 @@ public final class PhoneAccountSuggestion implements Parcelable {
*/
@SystemApi
@TestApi
- public PhoneAccountSuggestion(PhoneAccountHandle handle, @SuggestionReason int reason,
+ public PhoneAccountSuggestion(@NonNull PhoneAccountHandle handle, @SuggestionReason int reason,
boolean shouldAutoSelect) {
this.mHandle = handle;
this.mReason = reason;
@@ -101,7 +102,7 @@ public final class PhoneAccountSuggestion implements Parcelable {
/**
* @return The {@link PhoneAccountHandle} for this suggestion.
*/
- public PhoneAccountHandle getPhoneAccountHandle() {
+ @NonNull public PhoneAccountHandle getPhoneAccountHandle() {
return mHandle;
}
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index d5091680285b..7688ac6857af 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -17,6 +17,7 @@ package android.telecom;
import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressAutoDoc;
import android.annotation.SuppressLint;
@@ -814,10 +815,11 @@ public class TelecomManager {
* <p>
* The default dialer has access to use this method.
*
- * @return The user outgoing phone account selected by the user.
+ * @return The user outgoing phone account selected by the user, or {@code null} if there is no
+ * user selected outgoing {@link PhoneAccountHandle}.
*/
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
- public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
+ public @Nullable PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
try {
if (isServiceConnected()) {
return getTelecomService().getUserSelectedOutgoingPhoneAccount(
@@ -833,13 +835,14 @@ public class TelecomManager {
* Sets the user-chosen default {@link PhoneAccountHandle} for making outgoing phone calls.
*
* @param accountHandle The {@link PhoneAccountHandle} which will be used by default for making
- * outgoing voice calls.
+ * outgoing voice calls, or {@code null} if no default is specified (the
+ * user will be asked each time a call is placed in this case).
* @hide
*/
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
@TestApi
@SystemApi
- public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) {
+ public void setUserSelectedOutgoingPhoneAccount(@Nullable PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
getTelecomService().setUserSelectedOutgoingPhoneAccount(accountHandle);
@@ -1206,7 +1209,8 @@ public class TelecomManager {
/**
* Used to set the default dialer package.
*
- * @param packageName to set the default dialer to.
+ * @param packageName to set the default dialer to, or {@code null} if the system provided
+ * dialer should be used instead.
*
* @result {@code true} if the default dialer was successfully changed, {@code false} if
* the specified package does not correspond to an installed dialer, or is already
@@ -1225,7 +1229,7 @@ public class TelecomManager {
@RequiresPermission(allOf = {
android.Manifest.permission.MODIFY_PHONE_STATE,
android.Manifest.permission.WRITE_SECURE_SETTINGS})
- public boolean setDefaultDialer(String packageName) {
+ public boolean setDefaultDialer(@Nullable String packageName) {
try {
if (isServiceConnected()) {
return getTelecomService().setDefaultDialer(packageName);
@@ -1239,9 +1243,10 @@ public class TelecomManager {
/**
* Determines the package name of the system-provided default phone app.
*
- * @return package name for the system dialer package or null if no system dialer is preloaded.
+ * @return package name for the system dialer package or {@code null} if no system dialer is
+ * preloaded.
*/
- public String getSystemDialerPackage() {
+ public @Nullable String getSystemDialerPackage() {
try {
if (isServiceConnected()) {
return getTelecomService().getSystemDialerPackage();
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index 79b78077609f..9d46300b2b88 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -1191,8 +1191,8 @@ public final class Telephony {
* Broadcast Action: A debug code has been entered in the dialer. This intent is
* broadcast by the system and OEM telephony apps may need to receive these broadcasts.
* These "secret codes" are used to activate developer menus by dialing certain codes.
- * And they are of the form {@code *#*#&lt;code&gt;#*#*}. The intent will have the data
- * URI: {@code android_secret_code://&lt;code&gt;}. It is possible that a manifest
+ * And they are of the form {@code *#*#<code>#*#*}. The intent will have the data
+ * URI: {@code android_secret_code://<code>}. It is possible that a manifest
* receiver would be woken up even if it is not currently running.
*
* <p>Requires {@code android.Manifest.permission#CONTROL_INCALL_EXPERIENCE} to
diff --git a/telephony/java/android/telephony/CallAttributes.java b/telephony/java/android/telephony/CallAttributes.java
index 368f0c67e2b0..3a340053ace3 100644
--- a/telephony/java/android/telephony/CallAttributes.java
+++ b/telephony/java/android/telephony/CallAttributes.java
@@ -16,6 +16,7 @@
package android.telephony;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -29,15 +30,15 @@ import java.util.Objects;
* @hide
*/
@SystemApi
-public class CallAttributes implements Parcelable {
+public final class CallAttributes implements Parcelable {
private PreciseCallState mPreciseCallState;
@NetworkType
private int mNetworkType; // TelephonyManager.NETWORK_TYPE_* ints
private CallQuality mCallQuality;
- public CallAttributes(PreciseCallState state, @NetworkType int networkType,
- CallQuality callQuality) {
+ public CallAttributes(@NonNull PreciseCallState state, @NetworkType int networkType,
+ @NonNull CallQuality callQuality) {
this.mPreciseCallState = state;
this.mNetworkType = networkType;
this.mCallQuality = callQuality;
@@ -59,6 +60,7 @@ public class CallAttributes implements Parcelable {
/**
* Returns the {@link PreciseCallState} of the call.
*/
+ @NonNull
public PreciseCallState getPreciseCallState() {
return mPreciseCallState;
}
@@ -96,6 +98,7 @@ public class CallAttributes implements Parcelable {
/**
* Returns the {#link CallQuality} of the call.
*/
+ @NonNull
public CallQuality getCallQuality() {
return mCallQuality;
}
diff --git a/telephony/java/android/telephony/CarrierRestrictionRules.java b/telephony/java/android/telephony/CarrierRestrictionRules.java
index 47ce632f98c5..78623e74277a 100644
--- a/telephony/java/android/telephony/CarrierRestrictionRules.java
+++ b/telephony/java/android/telephony/CarrierRestrictionRules.java
@@ -177,7 +177,8 @@ public final class CarrierRestrictionRules implements Parcelable {
* @return a list of boolean with the same size as input, indicating if each
* {@link CarrierIdentifier} is allowed or not.
*/
- public List<Boolean> isCarrierIdentifiersAllowed(@NonNull List<CarrierIdentifier> carrierIds) {
+ public @NonNull List<Boolean> areCarrierIdentifiersAllowed(
+ @NonNull List<CarrierIdentifier> carrierIds) {
ArrayList<Boolean> result = new ArrayList<>(carrierIds.size());
// First calculate the result for each slot independently
@@ -332,7 +333,7 @@ public final class CarrierRestrictionRules implements Parcelable {
/**
* Builder for a {@link CarrierRestrictionRules}.
*/
- public static class Builder {
+ public static final class Builder {
private final CarrierRestrictionRules mRules;
/** {@hide} */
@@ -341,14 +342,14 @@ public final class CarrierRestrictionRules implements Parcelable {
}
/** build command */
- public CarrierRestrictionRules build() {
+ public @NonNull CarrierRestrictionRules build() {
return mRules;
}
/**
* Indicate that all carriers are allowed.
*/
- public Builder setAllCarriersAllowed() {
+ public @NonNull Builder setAllCarriersAllowed() {
mRules.mAllowedCarriers.clear();
mRules.mExcludedCarriers.clear();
mRules.mCarrierRestrictionDefault = CARRIER_RESTRICTION_DEFAULT_ALLOWED;
@@ -360,7 +361,8 @@ public final class CarrierRestrictionRules implements Parcelable {
*
* @param allowedCarriers list of allowed carriers
*/
- public Builder setAllowedCarriers(List<CarrierIdentifier> allowedCarriers) {
+ public @NonNull Builder setAllowedCarriers(
+ @NonNull List<CarrierIdentifier> allowedCarriers) {
mRules.mAllowedCarriers = new ArrayList<CarrierIdentifier>(allowedCarriers);
return this;
}
@@ -370,7 +372,8 @@ public final class CarrierRestrictionRules implements Parcelable {
*
* @param excludedCarriers list of excluded carriers
*/
- public Builder setExcludedCarriers(List<CarrierIdentifier> excludedCarriers) {
+ public @NonNull Builder setExcludedCarriers(
+ @NonNull List<CarrierIdentifier> excludedCarriers) {
mRules.mExcludedCarriers = new ArrayList<CarrierIdentifier>(excludedCarriers);
return this;
}
@@ -380,7 +383,7 @@ public final class CarrierRestrictionRules implements Parcelable {
*
* @param carrierRestrictionDefault prioritized carrier list
*/
- public Builder setDefaultCarrierRestriction(
+ public @NonNull Builder setDefaultCarrierRestriction(
@CarrierRestrictionDefault int carrierRestrictionDefault) {
mRules.mCarrierRestrictionDefault = carrierRestrictionDefault;
return this;
@@ -391,7 +394,7 @@ public final class CarrierRestrictionRules implements Parcelable {
*
* @param multiSimPolicy multi SIM policy
*/
- public Builder setMultiSimPolicy(@MultiSimPolicy int multiSimPolicy) {
+ public @NonNull Builder setMultiSimPolicy(@MultiSimPolicy int multiSimPolicy) {
mRules.mMultiSimPolicy = multiSimPolicy;
return this;
}
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index 6c45cc4ef3b8..bec949406b6c 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -26,6 +26,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
+import android.telephony.NetworkRegistrationState.Domain;
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
@@ -99,11 +100,12 @@ public abstract class NetworkService extends Service {
/**
* API to get network registration state. The result will be passed to the callback.
- * @param domain
- * @param callback
+ * @param domain Network domain
+ * @param callback The callback for reporting network registration state
* @return SIM slot id the network service associated with.
*/
- public void getNetworkRegistrationState(int domain, NetworkServiceCallback callback) {
+ public void getNetworkRegistrationState(@Domain int domain,
+ @NonNull NetworkServiceCallback callback) {
callback.onGetNetworkRegistrationStateComplete(
NetworkServiceCallback.RESULT_ERROR_UNSUPPORTED, null);
}
diff --git a/telephony/java/android/telephony/PhoneNumberRange.java b/telephony/java/android/telephony/PhoneNumberRange.java
index 2c66503a1ee7..c35a485d613f 100644
--- a/telephony/java/android/telephony/PhoneNumberRange.java
+++ b/telephony/java/android/telephony/PhoneNumberRange.java
@@ -149,7 +149,7 @@ public final class PhoneNumberRange implements Parcelable {
* @param number A phone number, with or without separators or a country code.
* @return {@code true} if the number matches, {@code false} otherwise.
*/
- public boolean matches(String number) {
+ public boolean matches(@NonNull String number) {
// Check the prefix, make sure it matches either with or without the country code.
String normalizedNumber = number.replaceAll("[^0-9]", "");
String prefixWithCountryCode = mCountryCode + mPrefix;
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 03f6351f15b3..683905e0cf24 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -17,6 +17,8 @@
package android.telephony;
import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
@@ -1760,6 +1762,7 @@ public class ServiceState implements Parcelable {
* @return List of {@link NetworkRegistrationState}
* @hide
*/
+ @NonNull
@SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStates() {
synchronized (mNetworkRegistrationStates) {
@@ -1776,6 +1779,7 @@ public class ServiceState implements Parcelable {
*
* @deprecated Use {@link #getNetworkRegistrationStatesFromTransportType(int)}
*/
+ @NonNull
@Deprecated
@SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStates(int transportType) {
@@ -1789,6 +1793,7 @@ public class ServiceState implements Parcelable {
* @return List of {@link NetworkRegistrationState}
* @hide
*/
+ @NonNull
@SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStatesForTransportType(
int transportType) {
@@ -1812,6 +1817,7 @@ public class ServiceState implements Parcelable {
* @return List of {@link NetworkRegistrationState}
* @hide
*/
+ @NonNull
@SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStatesForDomain(
@Domain int domain) {
@@ -1838,6 +1844,7 @@ public class ServiceState implements Parcelable {
*
* @deprecated Use {@link #getNetworkRegistrationState(int, int)}
*/
+ @Nullable
@Deprecated
@SystemApi
public NetworkRegistrationState getNetworkRegistrationStates(@Domain int domain,
@@ -1854,6 +1861,7 @@ public class ServiceState implements Parcelable {
* @hide
*
*/
+ @Nullable
@SystemApi
public NetworkRegistrationState getNetworkRegistrationState(@Domain int domain,
int transportType) {
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index e0b7fc44ffaf..d7a0e50e5df7 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -1270,7 +1270,7 @@ public class SubscriptionManager {
if (!userVisibleOnly || activeList == null) {
return activeList;
} else {
- return activeList.stream().filter(subInfo -> !shouldHideSubscription(subInfo))
+ return activeList.stream().filter(subInfo -> isSubscriptionVisible(subInfo))
.collect(Collectors.toList());
}
}
@@ -2867,32 +2867,27 @@ public class SubscriptionManager {
}
/**
- * Whether system UI should hide a subscription. If it's a bundled opportunistic
- * subscription, it shouldn't show up in anywhere in Settings app, dialer app,
- * or status bar. Exception is if caller is carrier app, in which case they will
+ * Whether a subscription is visible to API caller. If it's a bundled opportunistic
+ * subscription, it should be hidden anywhere in Settings, dialer, status bar etc.
+ * Exception is if caller owns carrier privilege, in which case they will
* want to see their own hidden subscriptions.
*
* @param info the subscriptionInfo to check against.
- * @return true if this subscription should be hidden.
+ * @return true if this subscription should be visible to the API caller.
*
- * @hide
*/
- public boolean shouldHideSubscription(SubscriptionInfo info) {
+ private boolean isSubscriptionVisible(SubscriptionInfo info) {
if (info == null) return false;
- // If hasCarrierPrivileges or canManageSubscription returns true, it means caller
- // has carrier privilege.
- boolean hasCarrierPrivilegePermission = (info.isEmbedded() && canManageSubscription(info))
- || TelephonyManager.from(mContext).hasCarrierPrivileges(info.getSubscriptionId());
-
- return isInvisibleSubscription(info) && !hasCarrierPrivilegePermission;
- }
+ // If subscription is NOT grouped opportunistic subscription, it's visible.
+ if (TextUtils.isEmpty(info.getGroupUuid()) || !info.isOpportunistic()) return true;
- /**
- * @hide
- */
- public static boolean isInvisibleSubscription(SubscriptionInfo info) {
- return info != null && !TextUtils.isEmpty(info.getGroupUuid()) && info.isOpportunistic();
+ // If the caller is the carrier app and owns the subscription, it should be visible
+ // to the caller.
+ boolean hasCarrierPrivilegePermission = TelephonyManager.from(mContext)
+ .hasCarrierPrivileges(info.getSubscriptionId())
+ || (info.isEmbedded() && canManageSubscription(info));
+ return hasCarrierPrivilegePermission;
}
/**
@@ -2920,7 +2915,7 @@ public class SubscriptionManager {
for (SubscriptionInfo info : availableList) {
// Opportunistic subscriptions are considered invisible
// to users so they should never be returned.
- if (isInvisibleSubscription(info)) continue;
+ if (!isSubscriptionVisible(info)) continue;
String groupUuid = info.getGroupUuid();
if (groupUuid == null) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 31d8ddbbd35f..aaf5f33346f5 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1355,12 +1355,7 @@ public class TelephonyManager {
*/
public static final String EXTRA_RECOVERY_ACTION = "recoveryAction";
- /**
- * The max value for the timeout passed in {@link #requestNumberVerification}.
- * @hide
- */
- @SystemApi
- public static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000;
+ private static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000;
/**
* Intent sent when an error occurs that debug tools should log and possibly take further
@@ -1571,6 +1566,7 @@ public class TelephonyManager {
* Returns the Type Allocation Code from the IMEI. Return null if Type Allocation Code is not
* available.
*/
+ @Nullable
public String getTypeAllocationCode() {
return getTypeAllocationCode(getSlotIndex());
}
@@ -1581,6 +1577,7 @@ public class TelephonyManager {
*
* @param slotIndex of which Type Allocation Code is returned
*/
+ @Nullable
public String getTypeAllocationCode(int slotIndex) {
ITelephony telephony = getITelephony();
if (telephony == null) return null;
@@ -1641,6 +1638,7 @@ public class TelephonyManager {
* Returns the Manufacturer Code from the MEID. Return null if Manufacturer Code is not
* available.
*/
+ @Nullable
public String getManufacturerCode() {
return getManufacturerCode(getSlotIndex());
}
@@ -1651,6 +1649,7 @@ public class TelephonyManager {
*
* @param slotIndex of which Type Allocation Code is returned
*/
+ @Nullable
public String getManufacturerCode(int slotIndex) {
ITelephony telephony = getITelephony();
if (telephony == null) return null;
@@ -2027,6 +2026,15 @@ public class TelephonyManager {
return cmdline;
}
+ /**
+ * @return The max value for the timeout passed in {@link #requestNumberVerification}.
+ * @hide
+ */
+ @SystemApi
+ public static long getMaxNumberVerificationTimeoutMillis() {
+ return MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS;
+ }
+
/** Kernel command line */
private static final String sKernelCmdLine = getProcCmdLine();
@@ -2793,8 +2801,8 @@ public class TelephonyManager {
* (see {@link #hasCarrierPrivileges}).
* <p>
* These "secret codes" are used to activate developer menus by dialing certain codes.
- * And they are of the form {@code *#*#&lt;code&gt;#*#*}. The intent will have the data
- * URI: {@code android_secret_code://&lt;code&gt;}. It is possible that a manifest
+ * And they are of the form {@code *#*#<code>#*#*}. The intent will have the data
+ * URI: {@code android_secret_code://<code>}. It is possible that a manifest
* receiver would be woken up even if it is not currently running.
* <p>
* It is supposed to replace {@link android.provider.Telephony.Sms.Intents#SECRET_CODE_ACTION}
@@ -4495,6 +4503,7 @@ public class TelephonyManager {
* {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
* @hide
*/
+ @Nullable
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getIsimDomain() {
@@ -5743,8 +5752,8 @@ public class TelephonyManager {
*
* @hide
* @param range The range of phone numbers the caller expects a phone call from.
- * @param timeoutMillis The amount of time to wait for such a call, or
- * {@link #MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS}, whichever is lesser.
+ * @param timeoutMillis The amount of time to wait for such a call, or the value of
+ * {@link #getMaxNumberVerificationTimeoutMillis()}, whichever is lesser.
* @param executor The {@link Executor} that callbacks should be executed on.
* @param callback The callback to use for delivering results.
*/
@@ -6000,6 +6009,7 @@ public class TelephonyManager {
* @return IMS Service Table or null if not present or not loaded
* @hide
*/
+ @Nullable
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getIsimIst() {
@@ -6926,14 +6936,12 @@ public class TelephonyManager {
}
/**
- * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning
- * SystemProperty to decide whether DUN APN is required for
- * tethering.
+ * Check whether DUN APN is required for tethering.
*
- * @return 0: Not required. 1: required. 2: Not set.
+ * @return {@code true} if DUN APN is required for tethering.
* @hide
*/
- public int getTetherApnRequired() {
+ public boolean getTetherApnRequired() {
try {
ITelephony telephony = getITelephony();
if (telephony != null)
@@ -6943,7 +6951,7 @@ public class TelephonyManager {
} catch (NullPointerException ex) {
Rlog.e(TAG, "hasMatchedTetherApnSetting NPE", ex);
}
- return 2;
+ return false;
}
@@ -9071,6 +9079,7 @@ public class TelephonyManager {
* @return Application ID for specified app type or {@code null} if no uicc or error.
* @hide
*/
+ @Nullable
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getAidForAppType(@UiccAppType int appType) {
@@ -10363,12 +10372,6 @@ public class TelephonyManager {
@SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void switchMultiSimConfig(int numOfSims) {
- //only proceed if multi-sim is not restricted
- if (!isMultisimSupported()) {
- Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted or not supported.");
- return;
- }
-
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index a4ed7750d417..9d072f008bed 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -19,7 +19,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.content.ContentValues;
import android.database.Cursor;
-import android.hardware.radio.V1_0.ApnTypes;
+import android.hardware.radio.V1_4.ApnTypes;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
@@ -79,7 +79,7 @@ public class ApnSetting implements Parcelable {
* APN type for all APNs.
* @hide
*/
- public static final int TYPE_ALL = ApnTypes.ALL;
+ public static final int TYPE_ALL = ApnTypes.ALL | ApnTypes.MCX;
/** APN type for default data traffic. */
public static final int TYPE_DEFAULT = ApnTypes.DEFAULT | ApnTypes.HIPRI;
/** APN type for MMS traffic. */
@@ -103,6 +103,8 @@ public class ApnSetting implements Parcelable {
* for access to carrier services in an emergency call situation.
*/
public static final int TYPE_EMERGENCY = ApnTypes.EMERGENCY;
+ /** APN type for MCX (Mission Critical Service) where X can be PTT/Video/Data */
+ public static final int TYPE_MCX = ApnTypes.MCX;
/** @hide */
@IntDef(flag = true, prefix = { "TYPE_" }, value = {
@@ -115,7 +117,8 @@ public class ApnSetting implements Parcelable {
TYPE_IMS,
TYPE_CBS,
TYPE_IA,
- TYPE_EMERGENCY
+ TYPE_EMERGENCY,
+ TYPE_MCX
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApnType {}
@@ -206,6 +209,7 @@ public class ApnSetting implements Parcelable {
APN_TYPE_STRING_MAP.put("cbs", TYPE_CBS);
APN_TYPE_STRING_MAP.put("ia", TYPE_IA);
APN_TYPE_STRING_MAP.put("emergency", TYPE_EMERGENCY);
+ APN_TYPE_STRING_MAP.put("mcx", TYPE_MCX);
APN_TYPE_INT_MAP = new ArrayMap<Integer, String>();
APN_TYPE_INT_MAP.put(TYPE_DEFAULT, "default");
APN_TYPE_INT_MAP.put(TYPE_MMS, "mms");
@@ -217,6 +221,7 @@ public class ApnSetting implements Parcelable {
APN_TYPE_INT_MAP.put(TYPE_CBS, "cbs");
APN_TYPE_INT_MAP.put(TYPE_IA, "ia");
APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, "emergency");
+ APN_TYPE_INT_MAP.put(TYPE_MCX, "mcx");
PROTOCOL_STRING_MAP = new ArrayMap<String, Integer>();
PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
@@ -1833,7 +1838,7 @@ public class ApnSetting implements Parcelable {
* {@link ApnSetting} built from this builder otherwise.
*/
public ApnSetting build() {
- if ((mApnTypeBitmask & ApnTypes.ALL) == 0 || TextUtils.isEmpty(mApnName)
+ if ((mApnTypeBitmask & TYPE_ALL) == 0 || TextUtils.isEmpty(mApnName)
|| TextUtils.isEmpty(mEntryName)) {
return null;
}
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index 79572b9706a9..a3fa77bd9b47 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -152,8 +152,9 @@ public abstract class DataService extends Service {
* @param callback The result callback for this request. Null if the client does not care
* about the result.
*/
- public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
- boolean allowRoaming, @SetupDataReason int reason,
+ public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile,
+ boolean isRoaming, boolean allowRoaming,
+ @SetupDataReason int reason,
@Nullable LinkProperties linkProperties,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
@@ -192,7 +193,7 @@ public abstract class DataService extends Service {
* @param callback The result callback for this request. Null if the client does not care
* about the result.
*/
- public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming,
+ public void setInitialAttachApn(@NonNull DataProfile dataProfile, boolean isRoaming,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
if (callback != null) {
@@ -211,7 +212,7 @@ public abstract class DataService extends Service {
* @param callback The result callback for this request. Null if the client does not care
* about the result.
*/
- public void setDataProfile(List<DataProfile> dps, boolean isRoaming,
+ public void setDataProfile(@NonNull List<DataProfile> dps, boolean isRoaming,
@Nullable DataServiceCallback callback) {
// The default implementation is to return unsupported.
if (callback != null) {
diff --git a/telephony/java/android/telephony/data/QualifiedNetworksService.java b/telephony/java/android/telephony/data/QualifiedNetworksService.java
index 45b4849990c2..c38f2788ca92 100644
--- a/telephony/java/android/telephony/data/QualifiedNetworksService.java
+++ b/telephony/java/android/telephony/data/QualifiedNetworksService.java
@@ -16,6 +16,8 @@
package android.telephony.data;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
@@ -132,7 +134,7 @@ public abstract class QualifiedNetworksService extends Service {
* for data setup.
*/
public final void updateQualifiedNetworkTypes(@ApnType int apnTypes,
- int[] qualifiedNetworkTypes) {
+ @Nullable int[] qualifiedNetworkTypes) {
mHandler.obtainMessage(QNS_UPDATE_QUALIFIED_NETWORKS, mSlotIndex, apnTypes,
qualifiedNetworkTypes).sendToTarget();
}
@@ -233,6 +235,7 @@ public abstract class QualifiedNetworksService extends Service {
* @param slotIndex SIM slot index the qualified networks service associated with.
* @return Qualified networks service instance
*/
+ @NonNull
public abstract NetworkAvailabilityUpdater createNetworkAvailabilityUpdater(int slotIndex);
/** @hide */
diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java
index ad343498f9e1..afbf46d8b7b1 100644
--- a/telephony/java/android/telephony/euicc/EuiccManager.java
+++ b/telephony/java/android/telephony/euicc/EuiccManager.java
@@ -17,6 +17,7 @@ package android.telephony.euicc;
import android.Manifest;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
@@ -429,6 +430,7 @@ public class EuiccManager {
*
* @return an EuiccManager that uses the given card ID for all calls.
*/
+ @NonNull
public EuiccManager createForCardId(int cardId) {
return new EuiccManager(mContext, cardId);
}
diff --git a/telephony/java/android/telephony/ims/ImsCallSessionListener.java b/telephony/java/android/telephony/ims/ImsCallSessionListener.java
index 337375ac51c3..a09844d6c0e2 100644
--- a/telephony/java/android/telephony/ims/ImsCallSessionListener.java
+++ b/telephony/java/android/telephony/ims/ImsCallSessionListener.java
@@ -16,6 +16,7 @@
package android.telephony.ims;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.RemoteException;
import android.telephony.CallQuality;
@@ -606,7 +607,7 @@ public class ImsCallSessionListener {
*
* @param profile updated ImsStreamMediaProfile
*/
- public void callSessionRttAudioIndicatorChanged(ImsStreamMediaProfile profile) {
+ public void callSessionRttAudioIndicatorChanged(@NonNull ImsStreamMediaProfile profile) {
try {
mListener.callSessionRttAudioIndicatorChanged(profile);
} catch (RemoteException e) {
@@ -619,7 +620,7 @@ public class ImsCallSessionListener {
*
* @param callQuality The new call quality
*/
- public void callQualityChanged(CallQuality callQuality) {
+ public void callQualityChanged(@NonNull CallQuality callQuality) {
try {
mListener.callQualityChanged(callQuality);
} catch (RemoteException e) {
diff --git a/telephony/java/android/telephony/ims/ImsSsData.java b/telephony/java/android/telephony/ims/ImsSsData.java
index 10001bc69d17..464db34d0d65 100644
--- a/telephony/java/android/telephony/ims/ImsSsData.java
+++ b/telephony/java/android/telephony/ims/ImsSsData.java
@@ -17,6 +17,7 @@ package android.telephony.ims;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,6 +25,9 @@ import android.telephony.Rlog;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
/**
* Provides STK Call Control Supplementary Service information.
@@ -260,13 +264,13 @@ public final class ImsSsData implements Parcelable {
public final int result;
private int[] mSsInfo;
- private ImsCallForwardInfo[] mCfInfo;
- private ImsSsInfo[] mImsSsInfo;
+ private List<ImsCallForwardInfo> mCfInfo;
+ private List<ImsSsInfo> mImsSsInfo;
/**
* Builder for optional ImsSsData parameters.
*/
- public static class Builder {
+ public static final class Builder {
private ImsSsData mImsSsData;
/**
@@ -301,7 +305,7 @@ public final class ImsSsData implements Parcelable {
* Set the array of {@link ImsSsInfo}s that are associated with this supplementary service
* data.
*/
- public @NonNull Builder setSuppServiceInfo(@NonNull ImsSsInfo[] imsSsInfos) {
+ public @NonNull Builder setSuppServiceInfo(@NonNull List<ImsSsInfo> imsSsInfos) {
mImsSsData.mImsSsInfo = imsSsInfos;
return this;
}
@@ -311,7 +315,7 @@ public final class ImsSsData implements Parcelable {
* service data.
*/
public @NonNull Builder setCallForwardingInfo(
- @NonNull ImsCallForwardInfo[] imsCallForwardInfos) {
+ @NonNull List<ImsCallForwardInfo> imsCallForwardInfos) {
mImsSsData.mCfInfo = imsCallForwardInfos;
return this;
}
@@ -360,8 +364,8 @@ public final class ImsSsData implements Parcelable {
serviceClass = in.readInt();
result = in.readInt();
mSsInfo = in.createIntArray();
- mCfInfo = (ImsCallForwardInfo[])in.readParcelableArray(this.getClass().getClassLoader());
- mImsSsInfo = (ImsSsInfo[])in.readParcelableArray(this.getClass().getClassLoader());
+ mCfInfo = in.readParcelableList(new ArrayList<>(), this.getClass().getClassLoader());
+ mImsSsInfo = in.readParcelableList(new ArrayList<>(), this.getClass().getClassLoader());
}
public static final @android.annotation.NonNull Creator<ImsSsData> CREATOR = new Creator<ImsSsData>() {
@@ -384,8 +388,8 @@ public final class ImsSsData implements Parcelable {
out.writeInt(getServiceClass());
out.writeInt(getResult());
out.writeIntArray(mSsInfo);
- out.writeParcelableArray(mCfInfo, 0);
- out.writeParcelableArray(mImsSsInfo, 0);
+ out.writeParcelableList(mCfInfo, 0);
+ out.writeParcelableList(mImsSsInfo, 0);
}
@Override
@@ -500,12 +504,12 @@ public final class ImsSsData implements Parcelable {
/** @hide */
public void setImsSpecificSuppServiceInfo(ImsSsInfo[] imsSsInfo) {
- mImsSsInfo = imsSsInfo;
+ mImsSsInfo = Arrays.asList(imsSsInfo);
}
/** @hide */
public void setCallForwardingInfo(ImsCallForwardInfo[] cfInfo) {
- mCfInfo = cfInfo;
+ mCfInfo = Arrays.asList(cfInfo);
}
/**
@@ -524,7 +528,7 @@ public final class ImsSsData implements Parcelable {
int[] result = new int[2];
- if (mImsSsInfo == null || mImsSsInfo.length == 0) {
+ if (mImsSsInfo == null || mImsSsInfo.size() == 0) {
Rlog.e(TAG, "getSuppServiceInfoCompat: Could not parse mImsSsInfo, returning empty "
+ "int[]");
return result;
@@ -535,26 +539,26 @@ public final class ImsSsData implements Parcelable {
if (isTypeClir()) {
// Assume there will only be one ImsSsInfo.
// contains {"n","m"} parameters
- result[0] = mImsSsInfo[0].getClirOutgoingState();
- result[1] = mImsSsInfo[0].getClirInterrogationStatus();
+ result[0] = mImsSsInfo.get(0).getClirOutgoingState();
+ result[1] = mImsSsInfo.get(0).getClirInterrogationStatus();
return result;
}
// COLR 7.31
if (isTypeColr()) {
- result[0] = mImsSsInfo[0].getProvisionStatus();
+ result[0] = mImsSsInfo.get(0).getProvisionStatus();
}
// Facility Lock CLCK 7.4 (for call barring), CLIP 7.6, COLP 7.8, as well as any
// other result, just return the status for the "n" parameter and provisioning status for
// "m" as the default.
- result[0] = mImsSsInfo[0].getStatus();
- result[1] = mImsSsInfo[0].getProvisionStatus();
+ result[0] = mImsSsInfo.get(0).getStatus();
+ result[1] = mImsSsInfo.get(0).getProvisionStatus();
return result;
}
/**
* @return an array of {@link ImsSsInfo}s associated with this supplementary service data.
*/
- public @NonNull ImsSsInfo[] getSuppServiceInfo() {
+ public @NonNull List<ImsSsInfo> getSuppServiceInfo() {
return mImsSsInfo;
}
@@ -562,7 +566,7 @@ public final class ImsSsData implements Parcelable {
* @return an array of {@link ImsCallForwardInfo}s associated with this supplementary service
* data.
**/
- public ImsCallForwardInfo[] getCallForwardInfo() {
+ public @Nullable List<ImsCallForwardInfo> getCallForwardInfo() {
return mCfInfo;
}
diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java
index 303a9fee50be..18e7530a790e 100644
--- a/telephony/java/android/telephony/ims/ImsSsInfo.java
+++ b/telephony/java/android/telephony/ims/ImsSsInfo.java
@@ -173,7 +173,7 @@ public final class ImsSsInfo implements Parcelable {
/**
* Builds {@link ImsSsInfo} instances, which may include optional parameters.
*/
- public static class Builder {
+ public static final class Builder {
private final ImsSsInfo mImsSsInfo;
@@ -304,7 +304,7 @@ public final class ImsSsInfo implements Parcelable {
/**
* @return The Incoming Communication Barring (ICB) number.
*/
- public String getIncomingCommunicationBarringNumber() {
+ public @Nullable String getIncomingCommunicationBarringNumber() {
return mIcbNum;
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java
index e86a47d5bfa1..1335b52673d2 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java
@@ -16,6 +16,7 @@
package android.telephony.mbms.vendor;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.app.Service;
@@ -187,7 +188,7 @@ public class MbmsGroupCallServiceBase extends Service {
*
* May throw an {@link IllegalArgumentException} or a {@link SecurityException}, which
* will be intercepted and passed to the app as
- * {@link MbmsErrors.InitializationErrors#ERROR_UNABLE_TO_INITIALIZE}
+ * {@link MbmsErrors.InitializationErrtrors#ERROR_UNABLE_TO_INITIALIZE}
*
* May return any value from {@link MbmsErrors.InitializationErrors}
* or {@link MbmsErrors#SUCCESS}. Non-successful error codes will be passed to the app via
@@ -196,7 +197,7 @@ public class MbmsGroupCallServiceBase extends Service {
* @param callback The callback to use to communicate with the app.
* @param subscriptionId The subscription ID to use.
*/
- public int initialize(MbmsGroupCallSessionCallback callback, int subscriptionId)
+ public int initialize(@NonNull MbmsGroupCallSessionCallback callback, int subscriptionId)
throws RemoteException {
throw new UnsupportedOperationException("Not implemented");
}
@@ -215,8 +216,8 @@ public class MbmsGroupCallServiceBase extends Service {
* @param callback The callback object on which the app wishes to receive updates.
* @return Any error in {@link MbmsErrors.GeneralErrors}
*/
- public int startGroupCall(int subscriptionId, long tmgi, List<Integer> saiList,
- List<Integer> frequencyList, GroupCallCallback callback) {
+ public int startGroupCall(int subscriptionId, long tmgi, @NonNull List<Integer> saiList,
+ @NonNull List<Integer> frequencyList, @NonNull GroupCallCallback callback) {
throw new UnsupportedOperationException("Not implemented");
}
@@ -241,8 +242,8 @@ public class MbmsGroupCallServiceBase extends Service {
* @param saiList New list of SAIs that the call is available on.
* @param frequencyList New list of frequencies that the call is available on.
*/
- public void updateGroupCall(int subscriptionId, long tmgi, List<Integer> saiList,
- List<Integer> frequencyList) {
+ public void updateGroupCall(int subscriptionId, long tmgi, @NonNull List<Integer> saiList,
+ @NonNull List<Integer> frequencyList) {
throw new UnsupportedOperationException("Not implemented");
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 5c5d44a8f42e..b90194a91382 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -721,13 +721,12 @@ interface ITelephony {
int getPreferredNetworkType(int subId);
/**
- * Check TETHER_DUN_REQUIRED and TETHER_DUN_APN settings, net.tethering.noprovisioning
- * SystemProperty to decide whether DUN APN is required for
- * tethering.
+ * Check whether DUN APN is required for tethering.
*
- * @return 0: Not required. 1: required. 2: Not set.
+ * @return {@code true} if DUN APN is required for tethering.
+ * @hide
*/
- int getTetherApnRequired();
+ boolean getTetherApnRequired();
/**
* Enables framework IMS and triggers IMS Registration.
diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java
index e87d28c6f9e9..d5061a32ba6d 100644
--- a/telephony/java/com/android/internal/telephony/PhoneConstants.java
+++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java
@@ -141,6 +141,8 @@ public class PhoneConstants {
/** APN type for Emergency PDN. This is not an IA apn, but is used
* for access to carrier services in an emergency call situation. */
public static final String APN_TYPE_EMERGENCY = "emergency";
+ /** APN type for Mission Critical Services */
+ public static final String APN_TYPE_MCX = "mcx";
/** Array of all APN types */
public static final String[] APN_TYPES = {APN_TYPE_DEFAULT,
APN_TYPE_MMS,
@@ -151,7 +153,8 @@ public class PhoneConstants {
APN_TYPE_IMS,
APN_TYPE_CBS,
APN_TYPE_IA,
- APN_TYPE_EMERGENCY
+ APN_TYPE_EMERGENCY,
+ APN_TYPE_MCX
};
public static final int RIL_CARD_MAX_APPS = 8;
diff --git a/tests/ActivityManagerPerfTests/tests/Android.mk b/tests/ActivityManagerPerfTests/tests/Android.mk
index f23a665dc5b2..e1f56b8ba55f 100644
--- a/tests/ActivityManagerPerfTests/tests/Android.mk
+++ b/tests/ActivityManagerPerfTests/tests/Android.mk
@@ -21,7 +21,7 @@ LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
apct-perftests-utils \
ActivityManagerPerfTestsUtils
diff --git a/tests/ActivityManagerPerfTests/tests/AndroidManifest.xml b/tests/ActivityManagerPerfTests/tests/AndroidManifest.xml
index a1ab33a96248..04aef47419d0 100644
--- a/tests/ActivityManagerPerfTests/tests/AndroidManifest.xml
+++ b/tests/ActivityManagerPerfTests/tests/AndroidManifest.xml
@@ -25,6 +25,6 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.perftests.amtests"/>
</manifest>
diff --git a/tests/ActivityManagerPerfTests/tests/AndroidTest.xml b/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
index ffb5404d7d94..76c40b2e3dc6 100644
--- a/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
+++ b/tests/ActivityManagerPerfTests/tests/AndroidTest.xml
@@ -24,6 +24,6 @@
<option name="test-tag" value="ActivityManagerPerfTests"/>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.frameworks.perftests.amtests"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
</test>
</configuration> \ No newline at end of file
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
index 58fb136ae9b3..daff76f4f522 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
@@ -21,7 +21,8 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.perftests.utils.ManualBenchmarkState;
import android.perftests.utils.PerfManualStatusReporter;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import com.android.frameworks.perftests.am.util.TargetPackageUtils;
import com.android.frameworks.perftests.am.util.TimeReceiver;
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BroadcastPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BroadcastPerfTest.java
index f7dab03f10ee..bc528d4d4fb7 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BroadcastPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BroadcastPerfTest.java
@@ -17,8 +17,9 @@
package com.android.frameworks.perftests.am.tests;
import android.content.Intent;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.Constants;
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java
index 3bf56ce8b085..8e8221954ad6 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java
@@ -17,8 +17,9 @@
package com.android.frameworks.perftests.am.tests;
import android.content.ContentProviderClient;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.TargetPackageUtils;
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
index e1263db61b8b..996c5a5c5584 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
@@ -21,8 +21,9 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.Constants;
import com.android.frameworks.perftests.am.util.TargetPackageUtils;
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
index f05f32382e53..ba2064005937 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
@@ -19,8 +19,9 @@ package com.android.frameworks.perftests.am.tests;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.Constants;
import com.android.frameworks.perftests.am.util.TargetPackageUtils;
diff --git a/tests/ActivityManagerPerfTests/utils/Android.mk b/tests/ActivityManagerPerfTests/utils/Android.mk
index 60c94239d85f..7a7471dd6cd8 100644
--- a/tests/ActivityManagerPerfTests/utils/Android.mk
+++ b/tests/ActivityManagerPerfTests/utils/Android.mk
@@ -23,7 +23,7 @@ LOCAL_SRC_FILES := \
src/com/android/frameworks/perftests/am/util/ITimeReceiverCallback.aidl
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
junit \
ub-uiautomator
diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
index 67071d204eff..fc787bafa93a 100644
--- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
+++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
@@ -19,10 +19,11 @@ package com.android.frameworks.perftests.am.util;
import android.content.Intent;
import android.os.RemoteException;
import android.os.ResultReceiver;
-import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import java.io.IOException;
public class Utils {
diff --git a/tests/AppLaunch/Android.mk b/tests/AppLaunch/Android.mk
index 1fb548b0edde..f50bca560f83 100644
--- a/tests/AppLaunch/Android.mk
+++ b/tests/AppLaunch/Android.mk
@@ -12,7 +12,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_JAVA_LIBRARIES := android.test.base android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
LOCAL_COMPATIBILITY_SUITE := device-tests
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index 5ea8ff1c4861..9d7319f7d337 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -30,11 +30,12 @@ import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.test.rule.logging.AtraceLogger;
import android.test.InstrumentationTestCase;
import android.test.InstrumentationTestRunner;
import android.util.Log;
+import androidx.test.rule.logging.AtraceLogger;
+
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
@@ -51,6 +52,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
/**
* This test is intended to measure the time it takes for the apps to start.
* Names of the applications are passed in command line, and the
diff --git a/tests/AppLaunchWear/Android.mk b/tests/AppLaunchWear/Android.mk
index 6d083661324d..332b6808ace8 100644
--- a/tests/AppLaunchWear/Android.mk
+++ b/tests/AppLaunchWear/Android.mk
@@ -12,7 +12,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_JAVA_LIBRARIES := android.test.base android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
LOCAL_COMPATIBILITY_SUITE := device-tests
diff --git a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
index d36d84e8f51d..97701c61011e 100644
--- a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
@@ -30,16 +30,16 @@ import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.test.rule.logging.AtraceLogger;
import android.test.InstrumentationTestCase;
import android.test.InstrumentationTestRunner;
import android.util.Log;
+import androidx.test.rule.logging.AtraceLogger;
+
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -52,6 +52,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
/**
* This test is intended to measure the time it takes for the apps to start.
* Names of the applications are passed in command line, and the
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/Android.mk b/tests/BackgroundDexOptServiceIntegrationTests/Android.mk
index b10305d96fce..f47cf96446ba 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/Android.mk
+++ b/tests/BackgroundDexOptServiceIntegrationTests/Android.mk
@@ -24,7 +24,7 @@ LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
LOCAL_PACKAGE_NAME := BackgroundDexOptServiceIntegrationTests
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml b/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml
index afae155f88fe..aec9f77cf922 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml
+++ b/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml
@@ -34,7 +34,7 @@
</application>
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.bgdexopttest"
android:label="Integration test for BackgroundDexOptService" />
</manifest>
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml b/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml
index 9bb1e280b861..a532422a38d3 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml
+++ b/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml
@@ -50,6 +50,6 @@
<option name="test-tag" value="BackgroundDexOptServiceIntegrationTests"/>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.frameworks.bgdexopttest"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
</test>
</configuration>
diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
index fd20f4a1fa77..7d826f7172da 100644
--- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
+++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java
@@ -17,17 +17,16 @@
package com.android.server.pm;
import android.app.AlarmManager;
-import android.app.UiAutomation;
import android.content.Context;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.SystemProperties;
import android.os.storage.StorageManager;
-import android.support.test.InstrumentationRegistry;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.After;
-import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
diff --git a/tests/Camera2Tests/CameraToo/tests/Android.mk b/tests/Camera2Tests/CameraToo/tests/Android.mk
index eb8f6c306862..fe4dc42aa7d9 100644
--- a/tests/Camera2Tests/CameraToo/tests/Android.mk
+++ b/tests/Camera2Tests/CameraToo/tests/Android.mk
@@ -20,6 +20,6 @@ LOCAL_PACKAGE_NAME := CameraTooTests
LOCAL_INSTRUMENTATION_FOR := CameraToo
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test mockito-target-minus-junit4
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules mockito-target-minus-junit4
include $(BUILD_PACKAGE)
diff --git a/tests/Camera2Tests/CameraToo/tests/AndroidManifest.xml b/tests/Camera2Tests/CameraToo/tests/AndroidManifest.xml
index 30210bae5cd1..8d3574929ca8 100644
--- a/tests/Camera2Tests/CameraToo/tests/AndroidManifest.xml
+++ b/tests/Camera2Tests/CameraToo/tests/AndroidManifest.xml
@@ -23,7 +23,7 @@
<application android:label="CameraToo">
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.example.android.camera2.cameratoo"
android:label="CameraToo tests" />
</manifest>
diff --git a/tests/Compatibility/Android.mk b/tests/Compatibility/Android.mk
index 9c47a2610223..643f9ebd5f15 100644
--- a/tests/Compatibility/Android.mk
+++ b/tests/Compatibility/Android.mk
@@ -17,7 +17,7 @@ include $(CLEAR_VARS)
# We only want this apk build for tests.
LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
# Include all test java files.
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
index 95eb5c9e7770..d683ec746a61 100644
--- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
+++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
@@ -33,10 +33,11 @@ import android.os.Bundle;
import android.os.DropBoxManager;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibilityRunner.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibilityRunner.java
index b61ec346f041..960ea4966958 100644
--- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibilityRunner.java
+++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibilityRunner.java
@@ -16,7 +16,7 @@
package com.android.compatibilitytest;
-import android.support.test.runner.AndroidJUnitRunner;
+import androidx.test.runner.AndroidJUnitRunner;
// empty subclass to maintain backwards compatibility on host-side harness
public class AppCompatibilityRunner extends AndroidJUnitRunner {}
diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.mk b/tests/DynamicCodeLoggerIntegrationTests/Android.mk
index f324eb10a7b0..62c1ba89653c 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/Android.mk
+++ b/tests/DynamicCodeLoggerIntegrationTests/Android.mk
@@ -67,7 +67,7 @@ LOCAL_CERTIFICATE := shared
LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/server/pm)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
truth-prebuilt \
# Include both versions of the .so if we have 2 arch
diff --git a/tests/DynamicCodeLoggerIntegrationTests/AndroidManifest.xml b/tests/DynamicCodeLoggerIntegrationTests/AndroidManifest.xml
index 4327da2db3dd..08fac300512b 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/AndroidManifest.xml
+++ b/tests/DynamicCodeLoggerIntegrationTests/AndroidManifest.xml
@@ -29,7 +29,7 @@
</application>
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.dynamiccodeloggertest"
android:label="Integration test for DynamicCodeLogger" />
</manifest>
diff --git a/tests/DynamicCodeLoggerIntegrationTests/AndroidTest.xml b/tests/DynamicCodeLoggerIntegrationTests/AndroidTest.xml
index f70b9c8cb357..f8a1ec90a78a 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/AndroidTest.xml
+++ b/tests/DynamicCodeLoggerIntegrationTests/AndroidTest.xml
@@ -24,7 +24,7 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.frameworks.dynamiccodeloggertest"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
index 4f9aeea5bdb4..db2f659c655b 100644
--- a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
+++ b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java
@@ -24,11 +24,12 @@ import android.content.Context;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.util.EventLog;
import android.util.EventLog.Event;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import dalvik.system.DexClassLoader;
import org.junit.Before;
diff --git a/tests/FlickerTests/AndroidManifest.xml b/tests/FlickerTests/AndroidManifest.xml
index ba6394008642..5b1a36b84cc4 100644
--- a/tests/FlickerTests/AndroidManifest.xml
+++ b/tests/FlickerTests/AndroidManifest.xml
@@ -29,7 +29,7 @@
<uses-library android:name="android.test.runner"/>
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.server.wm.flicker"
android:label="WindowManager Flicker Tests">
</instrumentation>
diff --git a/tests/FlickerTests/lib/Android.mk b/tests/FlickerTests/lib/Android.mk
index 6a8dfe8b5d0a..e438822a6f32 100644
--- a/tests/FlickerTests/lib/Android.mk
+++ b/tests/FlickerTests/lib/Android.mk
@@ -24,7 +24,7 @@ LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- ub-janktesthelper \
+ androidx.test.janktesthelper \
cts-amwm-util \
platformprotosnano \
layersprotosnano \
@@ -41,7 +41,7 @@ LOCAL_SRC_FILES := src/com/android/server/wm/flicker/AutomationUtils.java \
src/com/android/server/wm/flicker/WindowUtils.java
LOCAL_STATIC_JAVA_LIBRARIES := sysui-helper \
launcher-helper-lib \
- compatibility-device-util
+ compatibility-device-util-axt
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
index 6306f0e16375..e00a2474556c 100644
--- a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
+++ b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/AutomationUtils.java
@@ -30,7 +30,6 @@ import android.content.pm.PackageManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
import android.support.test.launcherhelper.LauncherStrategyFactory;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
@@ -43,6 +42,8 @@ import android.util.Rational;
import android.view.View;
import android.view.ViewConfiguration;
+import androidx.test.InstrumentationRegistry;
+
/**
* Collection of UI Automation helper functions.
*/
diff --git a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/TransitionRunner.java b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/TransitionRunner.java
index f6e8192ee4c0..0a3fe3c00de2 100644
--- a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/TransitionRunner.java
+++ b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/TransitionRunner.java
@@ -18,9 +18,10 @@ package com.android.server.wm.flicker;
import android.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
-import android.support.test.InstrumentationRegistry;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.wm.flicker.monitor.ITransitionMonitor;
import com.android.server.wm.flicker.monitor.LayersTraceMonitor;
import com.android.server.wm.flicker.monitor.ScreenRecorder;
diff --git a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/WindowUtils.java b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/WindowUtils.java
index 0da876173995..c54396f895e4 100644
--- a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/WindowUtils.java
+++ b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/WindowUtils.java
@@ -20,10 +20,11 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
import android.view.Surface;
import android.view.WindowManager;
+import androidx.test.InstrumentationRegistry;
+
/**
* Helper functions to retrieve system window sizes and positions.
*/
diff --git a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitor.java b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitor.java
index 717d187e1d4a..3f86f0d001d7 100644
--- a/tests/FlickerTests/lib/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitor.java
+++ b/tests/FlickerTests/lib/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitor.java
@@ -25,7 +25,7 @@ import android.view.FrameStats;
/**
* Monitors {@link android.view.WindowAnimationFrameStats} to detect janky frames.
*
- * Adapted from {@link android.support.test.jank.internal.WindowAnimationFrameStatsMonitorImpl}
+ * Adapted from {@link androidx.test.jank.internal.WindowAnimationFrameStatsMonitorImpl}
* using the same threshold to determine jank.
*/
public class WindowAnimationFrameStatsMonitor implements ITransitionMonitor {
diff --git a/tests/FlickerTests/lib/test/Android.mk b/tests/FlickerTests/lib/test/Android.mk
index 0e3f58d8a8c9..5be89ba624e6 100644
--- a/tests/FlickerTests/lib/test/Android.mk
+++ b/tests/FlickerTests/lib/test/Android.mk
@@ -25,7 +25,7 @@ LOCAL_COMPATIBILITY_SUITE := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
platform-test-annotations \
truth-prebuilt \
platformprotosnano \
diff --git a/tests/FlickerTests/lib/test/AndroidManifest.xml b/tests/FlickerTests/lib/test/AndroidManifest.xml
index d30172d56c2c..6451a5710821 100644
--- a/tests/FlickerTests/lib/test/AndroidManifest.xml
+++ b/tests/FlickerTests/lib/test/AndroidManifest.xml
@@ -18,7 +18,7 @@
<uses-library android:name="android.test.runner"/>
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.server.wm.flicker"
android:label="WindowManager Flicker Lib Test">
</instrumentation>
diff --git a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/LayersTraceTest.java b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/LayersTraceTest.java
index 42b2acace8c9..7d77126fd7d4 100644
--- a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/LayersTraceTest.java
+++ b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/LayersTraceTest.java
@@ -26,9 +26,10 @@ import static org.junit.Assert.fail;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
import android.view.WindowManager;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.Test;
import java.util.List;
diff --git a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/TestFileUtils.java b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/TestFileUtils.java
index 5a24e6d91595..c46175c1a977 100644
--- a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/TestFileUtils.java
+++ b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/TestFileUtils.java
@@ -17,7 +17,8 @@
package com.android.server.wm.flicker;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import com.google.common.io.ByteStreams;
diff --git a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitorTest.java b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitorTest.java
index f7fa0d572de6..dd6fed04d3e6 100644
--- a/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitorTest.java
+++ b/tests/FlickerTests/lib/test/src/com/android/server/wm/flicker/monitor/WindowAnimationFrameStatsMonitorTest.java
@@ -18,9 +18,7 @@ package com.android.server.wm.flicker.monitor;
import static com.android.server.wm.flicker.AutomationUtils.wakeUpAndGoToHomeScreen;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.support.test.InstrumentationRegistry;
+import androidx.test.InstrumentationRegistry;
import org.junit.Before;
import org.junit.Ignore;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ChangeAppRotationTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/ChangeAppRotationTest.java
index 34f4ebb89543..b6860cbd8d96 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ChangeAppRotationTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ChangeAppRotationTest.java
@@ -25,11 +25,12 @@ import static com.android.server.wm.flicker.WindowUtils.getStatusBarPosition;
import static com.android.server.wm.flicker.WmTraceSubject.assertThat;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.util.Log;
import android.view.Surface;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToAppTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToAppTest.java
index 2b62fcf196fb..6590b86f1499 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToAppTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToAppTest.java
@@ -20,9 +20,10 @@ import static com.android.server.wm.flicker.CommonTransitions.editTextLoseFocusT
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToHomeTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToHomeTest.java
index 42b161f8a604..4771b02000c0 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToHomeTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CloseImeWindowToHomeTest.java
@@ -20,9 +20,10 @@ import static com.android.server.wm.flicker.CommonTransitions.editTextLoseFocusT
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonTransitions.java b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonTransitions.java
index 92bb1ea0b58f..65888acc184b 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonTransitions.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonTransitions.java
@@ -30,7 +30,6 @@ import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
@@ -38,6 +37,8 @@ import android.support.test.uiautomator.Until;
import android.util.Rational;
import android.view.Surface;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.wm.flicker.TransitionRunner.TransitionBuilder;
/**
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/DebugTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/DebugTest.java
index fec248c13818..61cca0d6b53f 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/DebugTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/DebugTest.java
@@ -17,12 +17,13 @@
package com.android.server.wm.flicker;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.util.Rational;
import android.view.Surface;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/FlickerTestBase.java b/tests/FlickerTests/src/com/android/server/wm/flicker/FlickerTestBase.java
index 7061b23c069d..00e11c0cef41 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/FlickerTestBase.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/FlickerTestBase.java
@@ -21,10 +21,11 @@ import static com.android.server.wm.flicker.AutomationUtils.setDefaultWait;
import static com.google.common.truth.Truth.assertWithMessage;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.wm.flicker.TransitionRunner.TransitionResult;
import org.junit.After;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppColdTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppColdTest.java
index 7e713699c72e..7818c4e4ba50 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppColdTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppColdTest.java
@@ -20,9 +20,9 @@ import static com.android.server.wm.flicker.CommonTransitions.getOpenAppCold;
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
import static com.android.server.wm.flicker.WmTraceSubject.assertThat;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppToSplitScreenTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppToSplitScreenTest.java
index 745569aac7ab..63018ec1d9e7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppToSplitScreenTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppToSplitScreenTest.java
@@ -19,9 +19,9 @@ package com.android.server.wm.flicker;
import static com.android.server.wm.flicker.CommonTransitions.appToSplitScreen;
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppWarmTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppWarmTest.java
index de7639d43d3c..1aba93056c89 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppWarmTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenAppWarmTest.java
@@ -20,9 +20,9 @@ import static com.android.server.wm.flicker.CommonTransitions.openAppWarm;
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
import static com.android.server.wm.flicker.WmTraceSubject.assertThat;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenImeWindowTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenImeWindowTest.java
index 1bd519c8334e..a81fa8e6d123 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/OpenImeWindowTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/OpenImeWindowTest.java
@@ -19,8 +19,8 @@ package com.android.server.wm.flicker;
import static com.android.server.wm.flicker.CommonTransitions.editTextSetFocus;
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ResizeSplitScreenTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/ResizeSplitScreenTest.java
index 8a15cbdb7709..50dba81e53b7 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ResizeSplitScreenTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ResizeSplitScreenTest.java
@@ -25,11 +25,12 @@ import static com.google.common.truth.Truth.assertThat;
import android.graphics.Rect;
import android.platform.helpers.IAppHelper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Rational;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/SeamlessAppRotationTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/SeamlessAppRotationTest.java
index 3eab68d1272f..117ac5a8fadf 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/SeamlessAppRotationTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/SeamlessAppRotationTest.java
@@ -27,10 +27,11 @@ import static com.android.server.wm.flicker.testapp.ActivityOptions.SEAMLESS_ACT
import android.content.Intent;
import android.graphics.Rect;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
import android.view.Surface;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/SplitScreenToLauncherTest.java b/tests/FlickerTests/src/com/android/server/wm/flicker/SplitScreenToLauncherTest.java
index 40bd4e962153..1d30df9750b2 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/SplitScreenToLauncherTest.java
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/SplitScreenToLauncherTest.java
@@ -19,10 +19,10 @@ package com.android.server.wm.flicker;
import static com.android.server.wm.flicker.CommonTransitions.splitScreenToLauncher;
import static com.android.server.wm.flicker.WindowUtils.getDisplayBounds;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/Internal/Android.mk b/tests/Internal/Android.mk
index da566967fbeb..2e26ef103794 100644
--- a/tests/Internal/Android.mk
+++ b/tests/Internal/Android.mk
@@ -11,7 +11,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_STATIC_JAVA_LIBRARIES := junit \
- android-support-test \
+ androidx.test.rules \
mockito-target-minus-junit4
LOCAL_JAVA_RESOURCE_DIRS := res
diff --git a/tests/Internal/AndroidManifest.xml b/tests/Internal/AndroidManifest.xml
index e5a56949fe4e..c85c3b12504a 100644
--- a/tests/Internal/AndroidManifest.xml
+++ b/tests/Internal/AndroidManifest.xml
@@ -38,7 +38,7 @@
</service>
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.internal.tests"
android:label="Internal Tests" />
</manifest>
diff --git a/tests/Internal/AndroidTest.xml b/tests/Internal/AndroidTest.xml
index 6531c9355e3d..7b67e9ebcced 100644
--- a/tests/Internal/AndroidTest.xml
+++ b/tests/Internal/AndroidTest.xml
@@ -24,6 +24,6 @@
<option name="test-tag" value="InternalTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.internal.tests" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
</test>
</configuration> \ No newline at end of file
diff --git a/tests/Internal/src/android/app/WallpaperColorsTest.java b/tests/Internal/src/android/app/WallpaperColorsTest.java
index 881f6284413f..65ff6eb1ba04 100644
--- a/tests/Internal/src/android/app/WallpaperColorsTest.java
+++ b/tests/Internal/src/android/app/WallpaperColorsTest.java
@@ -20,8 +20,9 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Assert;
import org.junit.Test;
diff --git a/tests/Internal/src/android/app/WallpaperInfoTest.java b/tests/Internal/src/android/app/WallpaperInfoTest.java
index 7f06f2cb7aeb..476b99155672 100644
--- a/tests/Internal/src/android/app/WallpaperInfoTest.java
+++ b/tests/Internal/src/android/app/WallpaperInfoTest.java
@@ -26,9 +26,10 @@ import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Parcel;
import android.service.wallpaper.WallpaperService;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/Internal/src/android/service/wallpaper/WallpaperServiceTest.java b/tests/Internal/src/android/service/wallpaper/WallpaperServiceTest.java
index b9e282ebdfef..592aa3ac4a6b 100644
--- a/tests/Internal/src/android/service/wallpaper/WallpaperServiceTest.java
+++ b/tests/Internal/src/android/service/wallpaper/WallpaperServiceTest.java
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
+import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java
index 39608a40b416..17fa93135c7d 100644
--- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java
+++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java
@@ -27,9 +27,10 @@ import android.app.WallpaperColors;
import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Color;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.colorextraction.types.ExtractionType;
diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
index a7d5ae8f69a3..d92cfce0379b 100644
--- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
+++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
@@ -20,11 +20,12 @@ import static org.junit.Assert.assertTrue;
import android.app.WallpaperColors;
import android.graphics.Color;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Range;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.graphics.ColorUtils;
diff --git a/tests/Internal/src/com/android/internal/graphics/ColorUtilsTest.java b/tests/Internal/src/com/android/internal/graphics/ColorUtilsTest.java
index 73df9a09ea75..d0bb8e3745bc 100644
--- a/tests/Internal/src/com/android/internal/graphics/ColorUtilsTest.java
+++ b/tests/Internal/src/com/android/internal/graphics/ColorUtilsTest.java
@@ -16,12 +16,13 @@
package com.android.internal.graphics;
+import static org.junit.Assert.assertTrue;
+
import android.graphics.Color;
-import android.support.test.filters.SmallTest;
-import org.junit.Test;
+import androidx.test.filters.SmallTest;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
@SmallTest
public class ColorUtilsTest {
diff --git a/tests/Internal/src/com/android/internal/ml/clustering/KMeansTest.java b/tests/Internal/src/com/android/internal/ml/clustering/KMeansTest.java
index a64f8a60d485..540a1ec2bd5a 100644
--- a/tests/Internal/src/com/android/internal/ml/clustering/KMeansTest.java
+++ b/tests/Internal/src/com/android/internal/ml/clustering/KMeansTest.java
@@ -20,8 +20,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.annotation.SuppressLint;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Assert;
import org.junit.Before;
diff --git a/tests/PackageWatchdog/Android.mk b/tests/PackageWatchdog/Android.mk
index 1c1c2a426d15..1e4aacce1613 100644
--- a/tests/PackageWatchdog/Android.mk
+++ b/tests/PackageWatchdog/Android.mk
@@ -22,7 +22,7 @@ LOCAL_MODULE_TAGS := tests
LOCAL_STATIC_JAVA_LIBRARIES := \
junit \
frameworks-base-testutils \
- android-support-test \
+ androidx.test.rules \
services.core
LOCAL_JAVA_LIBRARIES := \
diff --git a/tests/PackageWatchdog/AndroidManifest.xml b/tests/PackageWatchdog/AndroidManifest.xml
index fa89528403c3..540edb41f66f 100644
--- a/tests/PackageWatchdog/AndroidManifest.xml
+++ b/tests/PackageWatchdog/AndroidManifest.xml
@@ -22,7 +22,7 @@
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.tests.packagewatchdog"
android:label="PackageWatchdog Test"/>
</manifest>
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index 77cd62e4cbd3..598f60ad7c8d 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -24,7 +24,8 @@ import static org.junit.Assert.assertTrue;
import android.content.pm.VersionedPackage;
import android.os.test.TestLooper;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import com.android.server.PackageWatchdog.PackageHealthObserver;
import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
diff --git a/tests/RcsTests/Android.mk b/tests/RcsTests/Android.mk
index 7b348d73747a..a276584530f4 100644
--- a/tests/RcsTests/Android.mk
+++ b/tests/RcsTests/Android.mk
@@ -11,7 +11,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
-LOCAL_STATIC_JAVA_LIBRARIES := junit android-support-test mockito-target-minus-junit4 truth-prebuilt
+LOCAL_STATIC_JAVA_LIBRARIES := junit androidx.test.rules mockito-target-minus-junit4 truth-prebuilt
include $(BUILD_PACKAGE)
diff --git a/tests/RcsTests/AndroidManifest.xml b/tests/RcsTests/AndroidManifest.xml
index a7e7d479a4d9..b1706a0a3629 100644
--- a/tests/RcsTests/AndroidManifest.xml
+++ b/tests/RcsTests/AndroidManifest.xml
@@ -6,6 +6,6 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.tests.rcs"/>
</manifest>
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadIconChangedEventTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadIconChangedEventTest.java
index 89d32ab5a925..e8989424de6d 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadIconChangedEventTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadIconChangedEventTest.java
@@ -19,10 +19,11 @@ import static com.google.common.truth.Truth.assertThat;
import android.net.Uri;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsGroupThreadIconChangedEvent;
import android.telephony.ims.RcsGroupThreadIconChangedEventDescriptor;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadNameChangedEventTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadNameChangedEventTest.java
index 726b9cd6641f..356688d4db81 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadNameChangedEventTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadNameChangedEventTest.java
@@ -18,10 +18,11 @@ package com.android.tests.ims;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsGroupThreadNameChangedEvent;
import android.telephony.ims.RcsGroupThreadNameChangedEventDescriptor;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantJoinedEventTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantJoinedEventTest.java
index a109310076d2..572fcb8ffd5e 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantJoinedEventTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantJoinedEventTest.java
@@ -18,10 +18,11 @@ package com.android.tests.ims;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsGroupThreadParticipantJoinedEvent;
import android.telephony.ims.RcsGroupThreadParticipantJoinedEventDescriptor;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantLeftEventTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantLeftEventTest.java
index de2688c5b8c8..038b2e8e60e3 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantLeftEventTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsGroupThreadParticipantLeftEventTest.java
@@ -18,10 +18,11 @@ package com.android.tests.ims;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsGroupThreadParticipantLeftEvent;
import android.telephony.ims.RcsGroupThreadParticipantLeftEventDescriptor;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsParticipantAliasChangedEventTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantAliasChangedEventTest.java
index 57240545e5d8..283c71b38eef 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsParticipantAliasChangedEventTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantAliasChangedEventTest.java
@@ -18,10 +18,11 @@ package com.android.tests.ims;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsParticipantAliasChangedEvent;
import android.telephony.ims.RcsParticipantAliasChangedEventDescriptor;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsParticipantQueryParamsTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantQueryParamsTest.java
index 6361a393187e..2d95513be069 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsParticipantQueryParamsTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsParticipantQueryParamsTest.java
@@ -18,9 +18,10 @@ package com.android.tests.ims;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsParticipantQueryParams;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RcsTests/src/com/android/tests/ims/RcsThreadQueryParamsTest.java b/tests/RcsTests/src/com/android/tests/ims/RcsThreadQueryParamsTest.java
index beb4f8ad28e2..fb51bdaa88a5 100644
--- a/tests/RcsTests/src/com/android/tests/ims/RcsThreadQueryParamsTest.java
+++ b/tests/RcsTests/src/com/android/tests/ims/RcsThreadQueryParamsTest.java
@@ -21,10 +21,11 @@ import static android.telephony.ims.RcsThreadQueryParams.THREAD_TYPE_GROUP;
import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.ims.RcsParticipant;
import android.telephony.ims.RcsThreadQueryParams;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/RollbackTest/Android.mk b/tests/RollbackTest/Android.mk
index db9376b844f9..206f8671d497 100644
--- a/tests/RollbackTest/Android.mk
+++ b/tests/RollbackTest/Android.mk
@@ -107,7 +107,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, RollbackTest/src)
LOCAL_PACKAGE_NAME := RollbackTest
LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
LOCAL_COMPATIBILITY_SUITE := general-tests
LOCAL_JAVA_RESOURCE_FILES := \
$(ROLLBACK_TEST_APP_AV1) \
diff --git a/tests/RollbackTest/RollbackTest.xml b/tests/RollbackTest/RollbackTest.xml
index ac39f853656a..70cd86783d6d 100644
--- a/tests/RollbackTest/RollbackTest.xml
+++ b/tests/RollbackTest/RollbackTest.xml
@@ -20,7 +20,7 @@
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.tests.rollback" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<!-- Exclude the StagedRollbackTest tests, which needs to be specially
driven from the StagedRollbackTest host test -->
diff --git a/tests/RollbackTest/RollbackTest/AndroidManifest.xml b/tests/RollbackTest/RollbackTest/AndroidManifest.xml
index e57a768ad1b5..5380dc9fc8cd 100644
--- a/tests/RollbackTest/RollbackTest/AndroidManifest.xml
+++ b/tests/RollbackTest/RollbackTest/AndroidManifest.xml
@@ -24,7 +24,7 @@
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.tests.rollback"
android:label="Rollback Test"/>
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/LocalIntentSender.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/LocalIntentSender.java
index ddcf1dabcafc..267ef7377b36 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/LocalIntentSender.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/LocalIntentSender.java
@@ -21,7 +21,8 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackBroadcastReceiver.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackBroadcastReceiver.java
index e10f866c899f..8a925b9bad38 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackBroadcastReceiver.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackBroadcastReceiver.java
@@ -20,9 +20,10 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.support.test.InstrumentationRegistry;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index 7be83edd91b9..4780f30d5f7f 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -19,27 +19,26 @@ package com.android.tests.rollback;
import static com.android.tests.rollback.RollbackTestUtils.assertPackageRollbackInfoEquals;
import static com.android.tests.rollback.RollbackTestUtils.assertRollbackInfoEquals;
import static com.android.tests.rollback.RollbackTestUtils.getUniqueRollbackInfoForPackage;
+import static com.android.tests.rollback.RollbackTestUtils.processUserData;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
import android.Manifest;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.VersionedPackage;
import android.content.rollback.RollbackInfo;
import android.content.rollback.RollbackManager;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.provider.DeviceConfig;
-import android.support.test.InstrumentationRegistry;
import android.util.Log;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
+import androidx.test.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -47,7 +46,6 @@ import org.junit.runners.JUnit4;
import java.util.Collections;
import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
@@ -427,52 +425,6 @@ public class RollbackTest {
}
}
- private static final String NO_RESPONSE = "NO RESPONSE";
-
- // Calls into the test app to process user data.
- // Asserts if the user data could not be processed or was version
- // incompatible with the previously processed user data.
- private void processUserData(String packageName) throws Exception {
- Intent intent = new Intent();
- intent.setComponent(new ComponentName(packageName,
- "com.android.tests.rollback.testapp.ProcessUserData"));
- Context context = InstrumentationRegistry.getContext();
-
- HandlerThread handlerThread = new HandlerThread("RollbackTestHandlerThread");
- handlerThread.start();
-
- // It can sometimes take a while after rollback before the app will
- // receive this broadcast, so try a few times in a loop.
- String result = NO_RESPONSE;
- for (int i = 0; result.equals(NO_RESPONSE) && i < 5; ++i) {
- BlockingQueue<String> resultQueue = new LinkedBlockingQueue<>();
- context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (getResultCode() == 1) {
- resultQueue.add("OK");
- } else {
- // If the test app doesn't receive the broadcast or
- // fails to set the result data, then getResultData
- // here returns the initial NO_RESPONSE data passed to
- // the sendOrderedBroadcast call.
- resultQueue.add(getResultData());
- }
- }
- }, new Handler(handlerThread.getLooper()), 0, NO_RESPONSE, null);
-
- result = resultQueue.poll(10, TimeUnit.SECONDS);
- if (result == null) {
- result = "ProcessUserData broadcast timed out";
- }
- }
-
- handlerThread.quit();
- if (!"OK".equals(result)) {
- fail(result);
- }
- }
-
/**
* Test that app user data is rolled back.
*/
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
index f28714c87125..e8cbd60ae649 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
@@ -16,7 +16,13 @@
package com.android.tests.rollback;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -27,12 +33,11 @@ import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.RollbackInfo;
import android.content.rollback.RollbackManager;
-import android.support.test.InstrumentationRegistry;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.util.Log;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import androidx.test.InstrumentationRegistry;
import java.io.IOException;
import java.io.InputStream;
@@ -393,4 +398,53 @@ class RollbackTestUtils {
throw new AssertionError(e);
}
}
+
+ private static final String NO_RESPONSE = "NO RESPONSE";
+
+ /**
+ * Calls into the test app to process user data.
+ * Asserts if the user data could not be processed or was version
+ * incompatible with the previously processed user data.
+ */
+ static void processUserData(String packageName) {
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName(packageName,
+ "com.android.tests.rollback.testapp.ProcessUserData"));
+ Context context = InstrumentationRegistry.getContext();
+
+ HandlerThread handlerThread = new HandlerThread("RollbackTestHandlerThread");
+ handlerThread.start();
+
+ // It can sometimes take a while after rollback before the app will
+ // receive this broadcast, so try a few times in a loop.
+ String result = NO_RESPONSE;
+ for (int i = 0; result.equals(NO_RESPONSE) && i < 5; ++i) {
+ BlockingQueue<String> resultQueue = new LinkedBlockingQueue<>();
+ context.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (getResultCode() == 1) {
+ resultQueue.add("OK");
+ } else {
+ // If the test app doesn't receive the broadcast or
+ // fails to set the result data, then getResultData
+ // here returns the initial NO_RESPONSE data passed to
+ // the sendOrderedBroadcast call.
+ resultQueue.add(getResultData());
+ }
+ }
+ }, new Handler(handlerThread.getLooper()), 0, NO_RESPONSE, null);
+
+ try {
+ result = resultQueue.take();
+ } catch (InterruptedException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ handlerThread.quit();
+ if (!"OK".equals(result)) {
+ fail(result);
+ }
+ }
}
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
index b65917b2ae5b..59ae8d9deaeb 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java
@@ -84,6 +84,7 @@ public class StagedRollbackTest {
RollbackTestUtils.install("RollbackTestAppAv1.apk", false);
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ RollbackTestUtils.processUserData(TEST_APP_A);
RollbackTestUtils.installStaged(true, "RollbackTestAppAv2.apk");
@@ -98,6 +99,7 @@ public class StagedRollbackTest {
@Test
public void testApkOnlyCommitRollback() throws Exception {
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ RollbackTestUtils.processUserData(TEST_APP_A);
RollbackManager rm = RollbackTestUtils.getRollbackManager();
RollbackInfo rollback = getUniqueRollbackInfoForPackage(
@@ -129,6 +131,7 @@ public class StagedRollbackTest {
@Test
public void testApkOnlyConfirmRollback() throws Exception {
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
+ RollbackTestUtils.processUserData(TEST_APP_A);
RollbackManager rm = RollbackTestUtils.getRollbackManager();
RollbackInfo rollback = getUniqueRollbackInfoForPackage(
diff --git a/tests/ServiceCrashTest/Android.mk b/tests/ServiceCrashTest/Android.mk
index d1f6450e84a6..617ee7caf139 100644
--- a/tests/ServiceCrashTest/Android.mk
+++ b/tests/ServiceCrashTest/Android.mk
@@ -12,7 +12,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_JAVA_LIBRARIES := android.test.base
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util-axt androidx.test.rules
include $(BUILD_PACKAGE)
diff --git a/tests/UsageStatsPerfTests/Android.mk b/tests/UsageStatsPerfTests/Android.mk
index cd29b51e5a24..4304fb0d8e9e 100644
--- a/tests/UsageStatsPerfTests/Android.mk
+++ b/tests/UsageStatsPerfTests/Android.mk
@@ -21,7 +21,7 @@ LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules \
apct-perftests-utils \
services.usage
diff --git a/tests/UsageStatsPerfTests/AndroidManifest.xml b/tests/UsageStatsPerfTests/AndroidManifest.xml
index 596a79cd8948..98915485c7bd 100644
--- a/tests/UsageStatsPerfTests/AndroidManifest.xml
+++ b/tests/UsageStatsPerfTests/AndroidManifest.xml
@@ -24,6 +24,6 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.perftests.usage"/>
</manifest>
diff --git a/tests/UsageStatsPerfTests/AndroidTest.xml b/tests/UsageStatsPerfTests/AndroidTest.xml
index c9b51dc5ba07..b8892ebc2ff7 100644
--- a/tests/UsageStatsPerfTests/AndroidTest.xml
+++ b/tests/UsageStatsPerfTests/AndroidTest.xml
@@ -23,6 +23,6 @@
<option name="test-tag" value="UsageStatsPerfTests"/>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.frameworks.perftests.usage"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
</test>
</configuration> \ No newline at end of file
diff --git a/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java b/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java
index e2a4c26606bf..7d9d0d52b002 100644
--- a/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java
+++ b/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java
@@ -24,9 +24,10 @@ import android.content.Context;
import android.os.SystemClock;
import android.perftests.utils.ManualBenchmarkState;
import android.perftests.utils.PerfManualStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.usage.IntervalStats;
import com.android.server.usage.UsageStatsDatabase;
diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
index 0105893adf9e..adcd11a08bff 100644
--- a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
+++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageStatsActivity.java
@@ -41,6 +41,7 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -196,8 +197,8 @@ public class UsageStatsActivity extends ListActivity {
intent.setPackage(getPackageName());
intent.putExtra(EXTRA_KEY_TIMEOUT, true);
mUsageStatsManager.registerAppUsageLimitObserver(1, packages,
- 60, TimeUnit.SECONDS, PendingIntent.getActivity(UsageStatsActivity.this,
- 1, intent, 0));
+ Duration.ofSeconds(60), Duration.ofSeconds(60),
+ PendingIntent.getActivity(UsageStatsActivity.this, 1, intent, 0));
}
}
});
diff --git a/tests/UsbTests/Android.mk b/tests/UsbTests/Android.mk
index 4e215cc5996f..aef993b9d348 100644
--- a/tests/UsbTests/Android.mk
+++ b/tests/UsbTests/Android.mk
@@ -24,7 +24,7 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_STATIC_JAVA_LIBRARIES := \
frameworks-base-testutils \
- android-support-test \
+ androidx.test.rules \
mockito-target-inline-minus-junit4 \
platform-test-annotations \
services.core \
diff --git a/tests/UsbTests/AndroidManifest.xml b/tests/UsbTests/AndroidManifest.xml
index 5d606951bb5e..03d1a3ee25e2 100644
--- a/tests/UsbTests/AndroidManifest.xml
+++ b/tests/UsbTests/AndroidManifest.xml
@@ -24,7 +24,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.server.usb"
android:label="UsbTests"/>
</manifest>
diff --git a/tests/UsbTests/AndroidTest.xml b/tests/UsbTests/AndroidTest.xml
index 4affad39b4eb..e55bc98ecdc1 100644
--- a/tests/UsbTests/AndroidTest.xml
+++ b/tests/UsbTests/AndroidTest.xml
@@ -24,7 +24,7 @@
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.server.usb"/>
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbDescriptorParserTests.java b/tests/UsbTests/src/com/android/server/usb/UsbDescriptorParserTests.java
index ea027d7ae049..89dc79c08261 100644
--- a/tests/UsbTests/src/com/android/server/usb/UsbDescriptorParserTests.java
+++ b/tests/UsbTests/src/com/android/server/usb/UsbDescriptorParserTests.java
@@ -16,29 +16,29 @@
package com.android.server.usb;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.usb.descriptors.UsbDescriptorParser;
-import com.android.server.usb.descriptors.UsbDeviceDescriptor;
-import com.google.common.io.ByteStreams;
-import java.io.InputStream;
-import java.io.IOException;
-import java.lang.Exception;
+import com.google.common.io.ByteStreams;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.IOException;
+import java.io.InputStream;
+
/**
* Tests for {@link com.android.server.usb.descriptors.UsbDescriptorParser}
*/
diff --git a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
index 4b93ca3dcaa9..ca1eb705e457 100644
--- a/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
+++ b/tests/UsbTests/src/com/android/server/usb/UsbHandlerTest.java
@@ -31,11 +31,11 @@ import android.hardware.usb.UsbManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.UserHandle;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.FgThread;
diff --git a/tests/WindowAnimationJank/Android.mk b/tests/WindowAnimationJank/Android.mk
index 7800a8078d2a..1c2d16787e88 100644
--- a/tests/WindowAnimationJank/Android.mk
+++ b/tests/WindowAnimationJank/Android.mk
@@ -26,7 +26,7 @@ LOCAL_PACKAGE_NAME := WindowAnimationJank
LOCAL_STATIC_JAVA_LIBRARIES := \
ub-uiautomator \
- ub-janktesthelper \
+ androidx.test.janktesthelper \
junit
LOCAL_JAVA_LIBRARIES := android.test.base.stubs
diff --git a/tests/WindowAnimationJank/src/android/windowanimationjank/FullscreenRotationTest.java b/tests/WindowAnimationJank/src/android/windowanimationjank/FullscreenRotationTest.java
index 1fb502a09874..6792a8b486af 100644
--- a/tests/WindowAnimationJank/src/android/windowanimationjank/FullscreenRotationTest.java
+++ b/tests/WindowAnimationJank/src/android/windowanimationjank/FullscreenRotationTest.java
@@ -17,8 +17,9 @@
package android.windowanimationjank;
import android.os.Bundle;
-import android.support.test.jank.JankTest;
-import android.support.test.jank.GfxMonitor;
+
+import androidx.test.jank.GfxMonitor;
+import androidx.test.jank.JankTest;
/**
* Detect janks during screen rotation for full-screen activity. Periodically change
diff --git a/tests/WindowAnimationJank/src/android/windowanimationjank/WindowAnimationJankTestBase.java b/tests/WindowAnimationJank/src/android/windowanimationjank/WindowAnimationJankTestBase.java
index bf739fa8da07..a8ace162c4d0 100644
--- a/tests/WindowAnimationJank/src/android/windowanimationjank/WindowAnimationJankTestBase.java
+++ b/tests/WindowAnimationJank/src/android/windowanimationjank/WindowAnimationJankTestBase.java
@@ -16,12 +16,10 @@
package android.windowanimationjank;
-import java.io.IOException;
-import java.util.StringTokenizer;
-
-import android.support.test.jank.JankTestBase;
import android.support.test.uiautomator.UiDevice;
+import androidx.test.jank.JankTestBase;
+
/**
* This adds additional system level jank monitor and its result is merged with primary monitor
* used in test.
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
index 01b904d8f088..f8cfd8f3aed8 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
@@ -24,9 +24,7 @@ import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.provider.Settings.Global.TETHER_ENABLE_LEGACY_DHCP_SERVER;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-import static com.android.server.connectivity.tethering.TetheringConfiguration.DUN_NOT_REQUIRED;
-import static com.android.server.connectivity.tethering.TetheringConfiguration.DUN_REQUIRED;
-import static com.android.server.connectivity.tethering.TetheringConfiguration.DUN_UNSPECIFIED;
+import static com.android.internal.R.array.config_tether_upstream_types;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -52,6 +50,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.Arrays;
import java.util.Iterator;
@RunWith(AndroidJUnit4.class)
@@ -112,74 +111,103 @@ public class TetheringConfigurationTest {
.thenReturn(new String[]{ "test_wlan\\d" });
when(mResources.getStringArray(com.android.internal.R.array.config_tether_bluetooth_regexs))
.thenReturn(new String[0]);
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[0]);
+ when(mResources.getIntArray(config_tether_upstream_types)).thenReturn(new int[0]);
when(mResources.getStringArray(
com.android.internal.R.array.config_mobile_hotspot_provision_app))
.thenReturn(new String[0]);
mContentResolver = new MockContentResolver();
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ mHasTelephonyManager = true;
mMockContext = new MockContext(mContext);
}
- @Test
- public void testDunFromTelephonyManagerMeansDun() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[]{TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI});
- mHasTelephonyManager = true;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_REQUIRED);
-
- final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
- assertTrue(cfg.isDunRequired);
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
- assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
- assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
- // Just to prove we haven't clobbered Wi-Fi:
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+ private TetheringConfiguration getTetheringConfiguration(int[] legacyTetherUpstreamTypes) {
+ when(mResources.getIntArray(config_tether_upstream_types)).thenReturn(
+ legacyTetherUpstreamTypes);
+ return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
}
@Test
- public void testDunNotRequiredFromTelephonyManagerMeansNoDun() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[]{TYPE_MOBILE_DUN, TYPE_WIFI});
- mHasTelephonyManager = true;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_NOT_REQUIRED);
-
- final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
+ public void testNoTelephonyManagerMeansNoDun() {
+ mHasTelephonyManager = false;
+ final TetheringConfiguration cfg = getTetheringConfiguration(
+ new int[]{TYPE_MOBILE_DUN, TYPE_WIFI});
assertFalse(cfg.isDunRequired);
assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
// Just to prove we haven't clobbered Wi-Fi:
assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
}
@Test
- public void testDunFromUpstreamConfigMeansDun() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[]{TYPE_MOBILE_DUN, TYPE_WIFI});
- mHasTelephonyManager = false;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_UNSPECIFIED);
+ public void testDunFromTelephonyManagerMeansDun() {
+ when(mTelephonyManager.getTetherApnRequired()).thenReturn(true);
+
+ final TetheringConfiguration cfgWifi = getTetheringConfiguration(new int[]{TYPE_WIFI});
+ final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
+ new int[]{TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI});
+ final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
+ new int[]{TYPE_WIFI, TYPE_MOBILE_DUN});
+ final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
+ new int[]{TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN});
+
+ for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri,
+ cfgWifiDun, cfgMobileWifiHipriDun)) {
+ String msg = "config=" + cfg.toString();
+ assertTrue(msg, cfg.isDunRequired);
+ assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
+ assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+ // Just to prove we haven't clobbered Wi-Fi:
+ assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+ }
+ }
+
+ @Test
+ public void testDunNotRequiredFromTelephonyManagerMeansNoDun() {
+ when(mTelephonyManager.getTetherApnRequired()).thenReturn(false);
+
+ final TetheringConfiguration cfgWifi = getTetheringConfiguration(new int[]{TYPE_WIFI});
+ final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration(
+ new int[]{TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI});
+ final TetheringConfiguration cfgWifiDun = getTetheringConfiguration(
+ new int[]{TYPE_WIFI, TYPE_MOBILE_DUN});
+ final TetheringConfiguration cfgWifiMobile = getTetheringConfiguration(
+ new int[]{TYPE_WIFI, TYPE_MOBILE});
+ final TetheringConfiguration cfgWifiHipri = getTetheringConfiguration(
+ new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI});
+ final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration(
+ new int[]{TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN});
+
+ String msg;
+ // TYPE_MOBILE_DUN should not be present in all of the combinations.
+ // TYPE_WIFI should not be affected.
+ for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
+ cfgWifiMobile, cfgWifiHipri, cfgMobileWifiHipriDun)) {
+ msg = "config=" + cfg.toString();
+ assertFalse(msg, cfg.isDunRequired);
+ assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
+ assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+ }
+
+ for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun,
+ cfgMobileWifiHipriDun)) {
+ msg = "config=" + cfg.toString();
+ assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+ }
+ msg = "config=" + cfgWifiMobile.toString();
+ assertTrue(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertFalse(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
+ msg = "config=" + cfgWifiHipri.toString();
+ assertFalse(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertTrue(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
- final TetheringConfiguration cfg = new TetheringConfiguration(
- mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
- assertTrue(cfg.isDunRequired);
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
- // Just to prove we haven't clobbered Wi-Fi:
- assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
- // Check that we have not added new cellular interface types
- assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
- assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
}
@Test
public void testNoDefinedUpstreamTypesAddsEthernet() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[]{});
- mHasTelephonyManager = false;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_UNSPECIFIED);
+ when(mResources.getIntArray(config_tether_upstream_types)).thenReturn(new int[]{});
+ when(mTelephonyManager.getTetherApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
@@ -187,8 +215,10 @@ public class TetheringConfigurationTest {
assertTrue(upstreamIterator.hasNext());
assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue());
// The following is because the code always adds some kind of mobile
- // upstream, be it DUN or, in this case where we use DUN_UNSPECIFIED,
- // both vanilla and hipri mobile types.
+ // upstream, be it DUN or, in this case where DUN is NOT required,
+ // make sure there is at least one of MOBILE or HIPRI. With the empty
+ // list of the configuration in this test, it will always add both
+ // MOBILE and HIPRI, in that order.
assertTrue(upstreamIterator.hasNext());
assertEquals(TYPE_MOBILE, upstreamIterator.next().intValue());
assertTrue(upstreamIterator.hasNext());
@@ -198,10 +228,9 @@ public class TetheringConfigurationTest {
@Test
public void testDefinedUpstreamTypesSansEthernetAddsEthernet() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI});
- mHasTelephonyManager = false;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_UNSPECIFIED);
+ when(mResources.getIntArray(config_tether_upstream_types)).thenReturn(
+ new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI});
+ when(mTelephonyManager.getTetherApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
@@ -217,10 +246,9 @@ public class TetheringConfigurationTest {
@Test
public void testDefinedUpstreamTypesWithEthernetDoesNotAddEthernet() {
- when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
+ when(mResources.getIntArray(config_tether_upstream_types))
.thenReturn(new int[]{TYPE_WIFI, TYPE_ETHERNET, TYPE_MOBILE_HIPRI});
- mHasTelephonyManager = false;
- when(mTelephonyManager.getTetherApnRequired()).thenReturn(DUN_UNSPECIFIED);
+ when(mTelephonyManager.getTetherApnRequired()).thenReturn(false);
final TetheringConfiguration cfg = new TetheringConfiguration(
mMockContext, mLog, INVALID_SUBSCRIPTION_ID);
@@ -276,9 +304,7 @@ public class TetheringConfigurationTest {
when(mResourcesForSubId.getStringArray(
com.android.internal.R.array.config_tether_bluetooth_regexs))
.thenReturn(new String[0]);
- when(mResourcesForSubId.getIntArray(
- com.android.internal.R.array.config_tether_upstream_types))
- .thenReturn(new int[0]);
+ when(mResourcesForSubId.getIntArray(config_tether_upstream_types)).thenReturn(new int[0]);
when(mResourcesForSubId.getStringArray(
com.android.internal.R.array.config_mobile_hotspot_provision_app))
.thenReturn(PROVISIONING_APP_NAME);
diff --git a/tests/testables/Android.bp b/tests/testables/Android.bp
index f07f09da3f03..0bad7a46abb4 100644
--- a/tests/testables/Android.bp
+++ b/tests/testables/Android.bp
@@ -25,7 +25,7 @@ java_library {
libs: [
"android.test.runner",
"android.test.mock",
- "android-support-test",
+ "androidx.test.rules",
"mockito-target-inline-minus-junit4",
],
diff --git a/tests/testables/src/android/testing/AndroidTestingRunner.java b/tests/testables/src/android/testing/AndroidTestingRunner.java
index cf5d4cf2f828..037522042d23 100644
--- a/tests/testables/src/android/testing/AndroidTestingRunner.java
+++ b/tests/testables/src/android/testing/AndroidTestingRunner.java
@@ -14,13 +14,13 @@
package android.testing;
-import android.support.test.internal.runner.junit4.statement.RunAfters;
-import android.support.test.internal.runner.junit4.statement.RunBefores;
-import android.support.test.internal.runner.junit4.statement.UiThreadStatement;
-
import android.testing.TestableLooper.LooperFrameworkMethod;
import android.testing.TestableLooper.RunWithLooper;
+import androidx.test.internal.runner.junit4.statement.RunAfters;
+import androidx.test.internal.runner.junit4.statement.RunBefores;
+import androidx.test.internal.runner.junit4.statement.UiThreadStatement;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/testables/src/android/testing/BaseFragmentTest.java b/tests/testables/src/android/testing/BaseFragmentTest.java
index d18c126a96c1..9f60cce61bce 100644
--- a/tests/testables/src/android/testing/BaseFragmentTest.java
+++ b/tests/testables/src/android/testing/BaseFragmentTest.java
@@ -26,13 +26,14 @@ import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
-import android.support.test.InstrumentationRegistry;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.FrameLayout;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
diff --git a/tests/testables/src/android/testing/TestableInstrumentation.java b/tests/testables/src/android/testing/TestableInstrumentation.java
index c35dc68e071f..ed867c133141 100644
--- a/tests/testables/src/android/testing/TestableInstrumentation.java
+++ b/tests/testables/src/android/testing/TestableInstrumentation.java
@@ -19,9 +19,10 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.TestLooperManager;
-import android.support.test.runner.AndroidJUnitRunner;
import android.util.Log;
+import androidx.test.runner.AndroidJUnitRunner;
+
import java.util.ArrayList;
/**
diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java
index 8b4cba12b0e6..8d99ac7100eb 100644
--- a/tests/testables/src/android/testing/TestableLooper.java
+++ b/tests/testables/src/android/testing/TestableLooper.java
@@ -20,9 +20,10 @@ import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.os.TestLooperManager;
-import android.support.test.InstrumentationRegistry;
import android.util.ArrayMap;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.runners.model.FrameworkMethod;
import java.lang.annotation.ElementType;
diff --git a/tests/testables/src/android/testing/ViewUtils.java b/tests/testables/src/android/testing/ViewUtils.java
index 1c6016e16f39..80c2e8ddd907 100644
--- a/tests/testables/src/android/testing/ViewUtils.java
+++ b/tests/testables/src/android/testing/ViewUtils.java
@@ -16,7 +16,6 @@ package android.testing;
import android.content.pm.ApplicationInfo;
import android.graphics.PixelFormat;
-import android.support.test.InstrumentationRegistry;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
diff --git a/tests/testables/tests/Android.mk b/tests/testables/tests/Android.mk
index 79469e3aa032..16fbb18b0eca 100644
--- a/tests/testables/tests/Android.mk
+++ b/tests/testables/tests/Android.mk
@@ -27,7 +27,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) \
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
+ androidx.test.rules hamcrest-library \
mockito-target-inline-minus-junit4 \
testables
diff --git a/tests/testables/tests/AndroidManifest.xml b/tests/testables/tests/AndroidManifest.xml
index 61f0be613afe..2bfb04fdb765 100644
--- a/tests/testables/tests/AndroidManifest.xml
+++ b/tests/testables/tests/AndroidManifest.xml
@@ -25,7 +25,7 @@
<uses-library android:name="android.test.runner" />
</application>
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.testables"
android:label="Tests for Testables">
</instrumentation>
diff --git a/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java b/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java
index 2528d090f0ca..13addb195b30 100644
--- a/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java
+++ b/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java
@@ -22,8 +22,8 @@ import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/testables/tests/src/android/testing/TestableContentResolverTest.java b/tests/testables/tests/src/android/testing/TestableContentResolverTest.java
index 71afda0748c4..f531369cd423 100644
--- a/tests/testables/tests/src/android/testing/TestableContentResolverTest.java
+++ b/tests/testables/tests/src/android/testing/TestableContentResolverTest.java
@@ -2,8 +2,9 @@ package android.testing;
import android.content.ContentProvider;
import android.content.IContentProvider;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
diff --git a/tests/testables/tests/src/android/testing/TestablePermissionsTest.java b/tests/testables/tests/src/android/testing/TestablePermissionsTest.java
index c56146e19a40..4626de7576e2 100644
--- a/tests/testables/tests/src/android/testing/TestablePermissionsTest.java
+++ b/tests/testables/tests/src/android/testing/TestablePermissionsTest.java
@@ -20,11 +20,10 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static org.junit.Assert.assertEquals;
import android.Manifest.permission;
-import android.content.pm.PackageManager;
import android.net.Uri;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.testing.TestableLooper.RunWithLooper;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
import org.junit.Rule;
import org.junit.Test;
diff --git a/tests/testables/tests/src/android/testing/TestableResourcesTest.java b/tests/testables/tests/src/android/testing/TestableResourcesTest.java
index dc7cf9554ba5..dd4325c59aa2 100644
--- a/tests/testables/tests/src/android/testing/TestableResourcesTest.java
+++ b/tests/testables/tests/src/android/testing/TestableResourcesTest.java
@@ -21,9 +21,10 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import android.content.res.Resources;
-import android.support.test.InstrumentationRegistry;
import android.test.suitebuilder.annotation.SmallTest;
+import androidx.test.InstrumentationRegistry;
+
import com.android.testables.R;
import org.junit.Rule;
diff --git a/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java b/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java
index ac61debd8dc9..0333d514343d 100644
--- a/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java
+++ b/tests/testables/tests/src/android/testing/TestableSettingsProviderTest.java
@@ -14,20 +14,22 @@
package android.testing;
+import static org.junit.Assert.*;
+
import android.content.ContentResolver;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.*;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TestableSettingsProviderTest {
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
index 6f588935c44c..ee976287b467 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectableClassModel.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Optional;
@@ -86,20 +87,98 @@ public final class InspectableClassModel {
}
/**
+ * Represents a way to access a property, either a getter or a field.
+ */
+ public static final class Accessor {
+ private final String mName;
+ private final Type mType;
+
+ /**
+ * Construct an accessor for a field.
+ *
+ * @param name The name of the field
+ * @return The new accessor
+ * @see Type#FIELD
+ */
+ static Accessor ofField(String name) {
+ return new Accessor(name, Type.FIELD);
+ }
+
+ /**
+ * Construct an accessor for a getter.
+ *
+ * @param name The name of the getter
+ * @return The new accessor
+ * @see Type#GETTER
+ */
+ static Accessor ofGetter(String name) {
+ return new Accessor(name, Type.GETTER);
+ }
+
+ public Accessor(String name, Type type) {
+ mName = Objects.requireNonNull(name, "Accessor name must not be null");
+ mType = Objects.requireNonNull(type, "Accessor type must not be null");
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public Type getType() {
+ return mType;
+ }
+
+ /**
+ * Get the invocation of this accessor.
+ *
+ * Example: {@code "getValue()"} for a getter or {@code "valueField"} for a field.
+ *
+ * @return A string representing the invocation of this accessor
+ */
+ public String invocation() {
+ switch (mType) {
+ case FIELD:
+ return mName;
+ case GETTER:
+ return String.format("%s()", mName);
+ default:
+ throw new NoSuchElementException(
+ String.format("No such accessor type %s", mType));
+ }
+ }
+
+ public enum Type {
+ /**
+ * A property accessed by a public field.
+ *
+ * @see #ofField(String)
+ */
+ FIELD,
+
+ /**
+ * A property accessed by a public getter method.
+ *
+ * @see #ofGetter(String)
+ */
+ GETTER
+ }
+ }
+
+ /**
* Model an inspectable property
*/
public static final class Property {
private final String mName;
- private final String mGetter;
+ private final Accessor mAccessor;
private final Type mType;
private boolean mAttributeIdInferrableFromR = true;
private int mAttributeId = 0;
private List<IntEnumEntry> mIntEnumEntries;
private List<IntFlagEntry> mIntFlagEntries;
- public Property(String name, String getter, Type type) {
+ public Property(String name, Accessor accessor, Type type) {
mName = Objects.requireNonNull(name, "Name must not be null");
- mGetter = Objects.requireNonNull(getter, "Getter must not be null");
+ mAccessor = Objects.requireNonNull(accessor, "Accessor must not be null");
mType = Objects.requireNonNull(type, "Type must not be null");
}
@@ -129,8 +208,8 @@ public final class InspectableClassModel {
return mName;
}
- public String getGetter() {
- return mGetter;
+ public Accessor getAccessor() {
+ return mAccessor;
}
public Type getType() {
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
index 50c79da25eba..6305228cfa36 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectablePropertyProcessor.java
@@ -16,6 +16,7 @@
package android.processor.view.inspector;
+import android.processor.view.inspector.InspectableClassModel.Accessor;
import android.processor.view.inspector.InspectableClassModel.IntEnumEntry;
import android.processor.view.inspector.InspectableClassModel.IntFlagEntry;
import android.processor.view.inspector.InspectableClassModel.Property;
@@ -93,16 +94,15 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
try {
final AnnotationMirror annotation =
mAnnotationUtils.exactlyOneMirror(mQualifiedName, element);
- final ExecutableElement getter = ensureGetter(element);
- final Property property = buildProperty(getter, annotation);
+ final Property property = buildProperty(element, annotation);
model.getProperty(property.getName()).ifPresent(p -> {
throw new ProcessingException(
String.format(
- "Property \"%s\" is already defined on #%s().",
+ "Property \"%s\" is already defined on #%s.",
p.getName(),
- p.getGetter()),
- getter,
+ p.getAccessor().invocation()),
+ element,
annotation);
});
@@ -112,26 +112,79 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
}
}
+
/**
- * Check that an element is shaped like a getter.
+ * Build a {@link Property} from a getter and an inspectable property annotation.
*
- * @param element An element that hopefully represents a getter
- * @return An {@link ExecutableElement} that represents a getter method.
- * @throws ProcessingException if the element isn't a getter
+ * @param accessor An element representing the getter or public field to build from
+ * @param annotation A mirror of an inspectable property-shaped annotation
+ * @return A property for the getter and annotation
+ * @throws ProcessingException If the supplied data is invalid and a property cannot be modeled
*/
- private ExecutableElement ensureGetter(Element element) {
- if (element.getKind() != ElementKind.METHOD) {
- throw new ProcessingException(
- String.format("Expected a method, got a %s", element.getKind()),
- element);
+ private Property buildProperty(Element accessor, AnnotationMirror annotation) {
+ final Property property;
+ final Optional<String> nameFromAnnotation = mAnnotationUtils
+ .typedValueByName("name", String.class, accessor, annotation);
+
+ validateModifiers(accessor);
+
+ switch (accessor.getKind()) {
+ case FIELD:
+ property = new Property(
+ nameFromAnnotation.orElseGet(() -> accessor.getSimpleName().toString()),
+ Accessor.ofField(accessor.getSimpleName().toString()),
+ determinePropertyType(accessor, annotation));
+ break;
+ case METHOD:
+ final ExecutableElement getter = ensureGetter(accessor);
+
+ property = new Property(
+ nameFromAnnotation.orElseGet(() -> inferPropertyNameFromGetter(getter)),
+ Accessor.ofGetter(getter.getSimpleName().toString()),
+ determinePropertyType(getter, annotation));
+ break;
+ default:
+ throw new ProcessingException(
+ String.format(
+ "Property must either be a getter method or a field, got %s.",
+ accessor.getKind()
+ ),
+ accessor,
+ annotation);
}
- final ExecutableElement method = (ExecutableElement) element;
- final Set<Modifier> modifiers = method.getModifiers();
+ mAnnotationUtils
+ .typedValueByName("hasAttributeId", Boolean.class, accessor, annotation)
+ .ifPresent(property::setAttributeIdInferrableFromR);
- if (modifiers.contains(Modifier.PRIVATE)) {
+ mAnnotationUtils
+ .typedValueByName("attributeId", Integer.class, accessor, annotation)
+ .ifPresent(property::setAttributeId);
+
+ switch (property.getType()) {
+ case INT_ENUM:
+ property.setIntEnumEntries(processEnumMapping(accessor, annotation));
+ break;
+ case INT_FLAG:
+ property.setIntFlagEntries(processFlagMapping(accessor, annotation));
+ break;
+ }
+
+ return property;
+ }
+
+ /**
+ * Validates that an element is public, concrete, and non-static.
+ *
+ * @param element The element to check
+ * @throws ProcessingException If the element's modifiers are invalid
+ */
+ private void validateModifiers(Element element) {
+ final Set<Modifier> modifiers = element.getModifiers();
+
+ if (!modifiers.contains(Modifier.PUBLIC)) {
throw new ProcessingException(
- "Property getter methods must not be private.",
+ "Property getter methods and fields must be public.",
element);
}
@@ -143,10 +196,28 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
if (modifiers.contains(Modifier.STATIC)) {
throw new ProcessingException(
- "Property getter methods must not be static.",
+ "Property getter methods and fields must not be static.",
+ element);
+ }
+ }
+
+ /**
+ * Check that an element is shaped like a getter.
+ *
+ * @param element An element that hopefully represents a getter
+ * @return An {@link ExecutableElement} that represents a getter method.
+ * @throws ProcessingException if the element isn't a getter
+ */
+ private ExecutableElement ensureGetter(Element element) {
+ if (element.getKind() != ElementKind.METHOD) {
+ throw new ProcessingException(
+ String.format("Expected a method, got a %s", element.getKind()),
element);
}
+ final ExecutableElement method = (ExecutableElement) element;
+
+
if (!method.getParameters().isEmpty()) {
throw new ProcessingException(
String.format(
@@ -171,77 +242,41 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
return method;
}
- /**
- * Build a {@link Property} from a getter and an inspectable property annotation.
- *
- * @param getter An element representing the getter to build from
- * @param annotation A mirror of an inspectable property-shaped annotation
- * @return A property for the getter and annotation
- * @throws ProcessingException If the supplied data is invalid and a property cannot be modeled
- */
- private Property buildProperty(ExecutableElement getter, AnnotationMirror annotation) {
- final String name = mAnnotationUtils
- .typedValueByName("name", String.class, getter, annotation)
- .orElseGet(() -> inferPropertyNameFromGetter(getter));
-
- final Property property = new Property(
- name,
- getter.getSimpleName().toString(),
- determinePropertyType(getter, annotation));
-
- mAnnotationUtils
- .typedValueByName("hasAttributeId", Boolean.class, getter, annotation)
- .ifPresent(property::setAttributeIdInferrableFromR);
-
- mAnnotationUtils
- .typedValueByName("attributeId", Integer.class, getter, annotation)
- .ifPresent(property::setAttributeId);
-
- switch (property.getType()) {
- case INT_ENUM:
- property.setIntEnumEntries(processEnumMapping(getter, annotation));
- break;
- case INT_FLAG:
- property.setIntFlagEntries(processFlagMapping(getter, annotation));
- break;
- }
-
- return property;
- }
/**
* Determine the property type from the annotation, return type, or context clues.
*
- * @param getter An element representing the getter to build from
+ * @param accessor An element representing the getter or field to determine the type of
* @param annotation A mirror of an inspectable property-shaped annotation
* @return The resolved property type
* @throws ProcessingException If the property type cannot be resolved or is invalid
* @see android.view.inspector.InspectableProperty#valueType()
*/
private Property.Type determinePropertyType(
- ExecutableElement getter,
+ Element accessor,
AnnotationMirror annotation) {
final String valueType = mAnnotationUtils
- .untypedValueByName("valueType", getter, annotation)
+ .untypedValueByName("valueType", accessor, annotation)
.map(Object::toString)
.orElse("INFERRED");
- final Property.Type returnType = convertReturnTypeToPropertyType(getter);
+ final Property.Type accessorType =
+ convertTypeMirrorToPropertyType(extractReturnOrFieldType(accessor), accessor);
- final boolean hasColor = hasColorAnnotation(getter);
+ final boolean hasColor = hasColorAnnotation(accessor);
final Optional<AnnotationValue> enumMapping =
mAnnotationUtils.valueByName("enumMapping", annotation);
final Optional<AnnotationValue> flagMapping =
mAnnotationUtils.valueByName("flagMapping", annotation);
- if (returnType != Property.Type.INT) {
+ if (accessorType != Property.Type.INT) {
enumMapping.ifPresent(value -> {
throw new ProcessingException(
String.format(
"Can only use enumMapping on int types, got %s.",
- returnType.toString().toLowerCase()),
- getter,
+ accessorType.toString().toLowerCase()),
+ accessor,
annotation,
value);
});
@@ -249,8 +284,8 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
throw new ProcessingException(
String.format(
"Can only use flagMapping on int types, got %s.",
- returnType.toString().toLowerCase()),
- getter,
+ accessorType.toString().toLowerCase()),
+ accessor,
annotation,
value);
});
@@ -262,14 +297,14 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
enumMapping.ifPresent(value -> {
throw new ProcessingException(
"Cannot use enumMapping on a color type.",
- getter,
+ accessor,
annotation,
value);
});
flagMapping.ifPresent(value -> {
throw new ProcessingException(
"Cannot use flagMapping on a color type.",
- getter,
+ accessor,
annotation,
value);
});
@@ -278,7 +313,7 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
flagMapping.ifPresent(value -> {
throw new ProcessingException(
"Cannot use flagMapping and enumMapping simultaneously.",
- getter,
+ accessor,
annotation,
value);
});
@@ -286,12 +321,12 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
} else if (flagMapping.isPresent()) {
return Property.Type.INT_FLAG;
} else {
- return returnType;
+ return accessorType;
}
case "NONE":
- return returnType;
+ return accessorType;
case "COLOR":
- switch (returnType) {
+ switch (accessorType) {
case COLOR:
case INT:
case LONG:
@@ -299,37 +334,58 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
default:
throw new ProcessingException(
"Color must be a long, integer, or android.graphics.Color",
- getter,
+ accessor,
annotation);
}
case "GRAVITY":
- requirePackedIntToReturnInt("Gravity", returnType, getter, annotation);
+ requirePackedIntToBeInt("Gravity", accessorType, accessor, annotation);
return Property.Type.GRAVITY;
case "INT_ENUM":
- requirePackedIntToReturnInt("IntEnum", returnType, getter, annotation);
+ requirePackedIntToBeInt("IntEnum", accessorType, accessor, annotation);
return Property.Type.INT_ENUM;
case "INT_FLAG":
- requirePackedIntToReturnInt("IntFlag", returnType, getter, annotation);
+ requirePackedIntToBeInt("IntFlag", accessorType, accessor, annotation);
return Property.Type.INT_FLAG;
default:
throw new ProcessingException(
String.format("Unknown value type enumeration value: %s", valueType),
- getter,
+ accessor,
annotation);
}
}
/**
- * Get a property type from the return type of a getter.
+ * Get the type of a field or the return type of a method.
*
- * @param getter The getter to extract the return type of
+ * @param element The element to extract a {@link TypeMirror} from
+ * @return The return or field type of the element
+ * @throws ProcessingException If the element is not a field or a method
+ */
+ private TypeMirror extractReturnOrFieldType(Element element) {
+ switch (element.getKind()) {
+ case FIELD:
+ return element.asType();
+ case METHOD:
+ return ((ExecutableElement) element).getReturnType();
+ default:
+ throw new ProcessingException(
+ String.format(
+ "Unable to determine the type of a %s.",
+ element.getKind()),
+ element);
+ }
+ }
+
+ /**
+ * Get a property type from a type mirror
+ *
+ * @param typeMirror The type mirror to convert to a property type
+ * @param element The element to be used for exceptions
* @return The property type returned by the getter
* @throws ProcessingException If the return type is not a primitive or an object
*/
- private Property.Type convertReturnTypeToPropertyType(ExecutableElement getter) {
- final TypeMirror returnType = getter.getReturnType();
-
- switch (unboxType(returnType)) {
+ private Property.Type convertTypeMirrorToPropertyType(TypeMirror typeMirror, Element element) {
+ switch (unboxType(typeMirror)) {
case BOOLEAN:
return Property.Type.BOOLEAN;
case BYTE:
@@ -347,7 +403,7 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
case SHORT:
return Property.Type.SHORT;
case DECLARED:
- if (isColorType(returnType)) {
+ if (isColorType(typeMirror)) {
return Property.Type.COLOR;
} else {
return Property.Type.OBJECT;
@@ -356,24 +412,24 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
return Property.Type.OBJECT;
default:
throw new ProcessingException(
- String.format("Unsupported return type %s.", returnType),
- getter);
+ String.format("Unsupported property type %s.", typeMirror),
+ element);
}
}
/**
* Require that a value type packed into an integer be on a getter that returns an int.
*
- * @param typeName The name of the type to use in the exception
+ * @param typeName The name of the type to use in the exception
* @param returnType The return type of the getter to check
- * @param getter The getter, to use in the exception
+ * @param accessor The getter, to use in the exception
* @param annotation The annotation, to use in the exception
* @throws ProcessingException If the return type is not an int
*/
- private static void requirePackedIntToReturnInt(
+ private static void requirePackedIntToBeInt(
String typeName,
Property.Type returnType,
- ExecutableElement getter,
+ Element accessor,
AnnotationMirror annotation) {
if (returnType != Property.Type.INT) {
throw new ProcessingException(
@@ -381,7 +437,7 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
"%s can only be defined on a method that returns int, got %s.",
typeName,
returnType.toString().toLowerCase()),
- getter,
+ accessor,
annotation);
}
}
@@ -393,21 +449,21 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
* not considered to be annotated, nor is a {@code long} annotated with
* {@link android.annotation.ColorInt}.
*
- * @param getter The getter to query
+ * @param accessor The getter or field to query
* @return True if the getter has a color annotation, false otherwise
*/
- private boolean hasColorAnnotation(ExecutableElement getter) {
- switch (unboxType(getter.getReturnType())) {
+ private boolean hasColorAnnotation(Element accessor) {
+ switch (unboxType(extractReturnOrFieldType(accessor))) {
case INT:
for (String name : COLOR_INT_ANNOTATION_NAMES) {
- if (mAnnotationUtils.hasAnnotation(getter, name)) {
+ if (mAnnotationUtils.hasAnnotation(accessor, name)) {
return true;
}
}
return false;
case LONG:
for (String name : COLOR_LONG_ANNOTATION_NAMES) {
- if (mAnnotationUtils.hasAnnotation(getter, name)) {
+ if (mAnnotationUtils.hasAnnotation(accessor, name)) {
return true;
}
}
@@ -452,40 +508,40 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
*
* @see android.view.inspector.IntEnumMapping
* @see android.view.inspector.InspectableProperty#enumMapping()
- * @param getter The getter of the property, used for exceptions
+ * @param accessor The accessor of the property, used for exceptions
* @param annotation The {@link android.view.inspector.InspectableProperty} annotation to
* extract enum mapping values from.
* @return A list of int enum entries, in the order specified in source
* @throws ProcessingException if mapping doesn't exist or is invalid
*/
private List<IntEnumEntry> processEnumMapping(
- ExecutableElement getter,
+ Element accessor,
AnnotationMirror annotation) {
List<AnnotationMirror> enumAnnotations = mAnnotationUtils.typedArrayValuesByName(
- "enumMapping", AnnotationMirror.class, getter, annotation);
+ "enumMapping", AnnotationMirror.class, accessor, annotation);
List<IntEnumEntry> enumEntries = new ArrayList<>(enumAnnotations.size());
if (enumAnnotations.isEmpty()) {
throw new ProcessingException(
- "Encountered an empty array for enumMapping", getter, annotation);
+ "Encountered an empty array for enumMapping", accessor, annotation);
}
for (AnnotationMirror enumAnnotation : enumAnnotations) {
final String name = mAnnotationUtils.typedValueByName(
- "name", String.class, getter, enumAnnotation)
+ "name", String.class, accessor, enumAnnotation)
.orElseThrow(() -> {
throw new ProcessingException(
"Name is required for @EnumMap",
- getter,
+ accessor,
enumAnnotation);
});
final int value = mAnnotationUtils.typedValueByName(
- "value", Integer.class, getter, enumAnnotation)
+ "value", Integer.class, accessor, enumAnnotation)
.orElseThrow(() -> {
throw new ProcessingException(
"Value is required for @EnumMap",
- getter,
+ accessor,
enumAnnotation);
});
@@ -504,45 +560,45 @@ public final class InspectablePropertyProcessor implements ModelProcessor {
*
* @see android.view.inspector.IntFlagMapping
* @see android.view.inspector.InspectableProperty#flagMapping()
- * @param getter The getter of the property, used for exceptions
+ * @param accessor The accessor of the property, used for exceptions
* @param annotation The {@link android.view.inspector.InspectableProperty} annotation to
* extract flag mapping values from.
* @return A list of int flags entries, in the order specified in source
* @throws ProcessingException if mapping doesn't exist or is invalid
*/
private List<IntFlagEntry> processFlagMapping(
- ExecutableElement getter,
+ Element accessor,
AnnotationMirror annotation) {
List<AnnotationMirror> flagAnnotations = mAnnotationUtils.typedArrayValuesByName(
- "flagMapping", AnnotationMirror.class, getter, annotation);
+ "flagMapping", AnnotationMirror.class, accessor, annotation);
List<IntFlagEntry> flagEntries = new ArrayList<>(flagAnnotations.size());
if (flagAnnotations.isEmpty()) {
throw new ProcessingException(
- "Encountered an empty array for flagMapping", getter, annotation);
+ "Encountered an empty array for flagMapping", accessor, annotation);
}
for (AnnotationMirror flagAnnotation : flagAnnotations) {
final String name = mAnnotationUtils.typedValueByName(
- "name", String.class, getter, flagAnnotation)
+ "name", String.class, accessor, flagAnnotation)
.orElseThrow(() -> {
throw new ProcessingException(
"Name is required for @FlagMap",
- getter,
+ accessor,
flagAnnotation);
});
final int target = mAnnotationUtils.typedValueByName(
- "target", Integer.class, getter, flagAnnotation)
+ "target", Integer.class, accessor, flagAnnotation)
.orElseThrow(() -> {
throw new ProcessingException(
"Target is required for @FlagMap",
- getter,
+ accessor,
flagAnnotation);
});
final Optional<Integer> mask = mAnnotationUtils.typedValueByName(
- "mask", Integer.class, getter, flagAnnotation);
+ "mask", Integer.class, accessor, flagAnnotation);
if (mask.isPresent()) {
flagEntries.add(new IntFlagEntry(name, target, mask.get()));
diff --git a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
index 7b04645e9f44..1ab9914d3aed 100644
--- a/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
+++ b/tools/processors/view_inspector/src/java/android/processor/view/inspector/InspectionCompanionGenerator.java
@@ -16,6 +16,7 @@
package android.processor.view.inspector;
+
import android.processor.view.inspector.InspectableClassModel.IntEnumEntry;
import android.processor.view.inspector.InspectableClassModel.IntFlagEntry;
import android.processor.view.inspector.InspectableClassModel.Property;
@@ -268,10 +269,10 @@ public final class InspectionCompanionGenerator {
for (PropertyIdField propertyIdField : propertyIdFields) {
builder.addStatement(
- "propertyReader.read$L($N, node.$L())",
+ "propertyReader.read$L($N, node.$L)",
methodSuffixForPropertyType(propertyIdField.mProperty.getType()),
propertyIdField.mFieldSpec,
- propertyIdField.mProperty.getGetter());
+ propertyIdField.mProperty.getAccessor().invocation());
}
return builder.build();
diff --git a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
index f6d8bb0939db..35f0fcf9bcae 100644
--- a/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
+++ b/tools/processors/view_inspector/test/java/android/processor/view/inspector/InspectionCompanionGeneratorTest.java
@@ -20,6 +20,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
+
+import android.processor.view.inspector.InspectableClassModel.Accessor;
import android.processor.view.inspector.InspectableClassModel.IntEnumEntry;
import android.processor.view.inspector.InspectableClassModel.IntFlagEntry;
import android.processor.view.inspector.InspectableClassModel.Property;
@@ -86,7 +88,7 @@ public class InspectionCompanionGeneratorTest {
@Test
public void testNoAttributeId() {
- final Property property = new Property(
+ final Property property = addProperty(
"noAttributeProperty",
"getNoAttributeProperty",
Property.Type.INT);
@@ -98,19 +100,18 @@ public class InspectionCompanionGeneratorTest {
@Test
public void testSuppliedAttributeId() {
- final Property property = new Property(
+ final Property property = addProperty(
"suppliedAttributeProperty",
"getSuppliedAttributeProperty",
Property.Type.INT);
property.setAttributeId(0xdecafbad);
- mModel.putProperty(property);
assertGeneratedFileEquals("SuppliedAttributeId");
}
@Test
public void testIntEnum() {
- final Property property = new Property(
+ final Property property = addProperty(
"intEnumProperty",
"getIntEnumProperty",
Property.Type.INT_ENUM);
@@ -127,7 +128,7 @@ public class InspectionCompanionGeneratorTest {
@Test
public void testIntFlag() {
- final Property property = new Property(
+ final Property property = addProperty(
"intFlag",
"getIntFlag",
Property.Type.INT_FLAG);
@@ -139,13 +140,21 @@ public class InspectionCompanionGeneratorTest {
new IntFlagEntry("WARP", 0x4)
));
- mModel.putProperty(property);
-
assertGeneratedFileEquals("IntFlag");
}
+ @Test
+ public void testFieldProperty() {
+ mModel.putProperty(new Property(
+ "fieldProperty",
+ Accessor.ofField("fieldProperty"),
+ Property.Type.INT));
+
+ assertGeneratedFileEquals("FieldProperty");
+ }
+
private Property addProperty(String name, String getter, Property.Type type) {
- final Property property = new Property(name, getter, type);
+ final Property property = new Property(name, Accessor.ofGetter(getter), type);
mModel.putProperty(property);
return property;
}
diff --git a/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/FieldProperty.java.txt b/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/FieldProperty.java.txt
new file mode 100644
index 000000000000..a44c43ec0b21
--- /dev/null
+++ b/tools/processors/view_inspector/test/resources/android/processor/view/inspector/InspectionCompanionGeneratorTest/FieldProperty.java.txt
@@ -0,0 +1,39 @@
+package com.android.node;
+
+import android.R;
+import android.view.inspector.InspectionCompanion;
+import android.view.inspector.PropertyMapper;
+import android.view.inspector.PropertyReader;
+import java.lang.Override;
+
+/**
+ * Inspection companion for {@link TestNode}.
+ *
+ * Generated by {@link android.processor.view.inspector.InspectionCompanionGenerator}
+ * on behalf of {@link android.processor.view.inspector.InspectionCompanionGeneratorTest}.
+ */
+public final class TestNode$$InspectionCompanion implements InspectionCompanion<TestNode> {
+ /**
+ * Set by {@link #mapProperties(PropertyMapper)} once properties have been mapped.
+ */
+ private boolean mPropertiesMapped = false;
+
+ /**
+ * Property ID of {@code fieldProperty}.
+ */
+ private int mFieldPropertyId;
+
+ @Override
+ public void mapProperties(PropertyMapper propertyMapper) {
+ mFieldPropertyId = propertyMapper.mapInt("fieldProperty", R.attr.fieldProperty);
+ mPropertiesMapped = true;
+ }
+
+ @Override
+ public void readProperties(TestNode node, PropertyReader propertyReader) {
+ if (!mPropertiesMapped) {
+ throw new InspectionCompanion.UninitializedPropertyMapException();
+ }
+ propertyReader.readInt(mFieldPropertyId, node.fieldProperty);
+ }
+}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 5ca30fcbf0db..8ef976f0f9ae 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1227,6 +1227,7 @@ public class WifiManager {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD
})
+ @NonNull
public List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> getAllMatchingWifiConfigs(
@NonNull List<ScanResult> scanResults) {
List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> configs = new ArrayList<>();
@@ -1269,6 +1270,7 @@ public class WifiManager {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD
})
+ @NonNull
public Map<OsuProvider, List<ScanResult>> getMatchingOsuProviders(
List<ScanResult> scanResults) {
try {
@@ -1295,6 +1297,7 @@ public class WifiManager {
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_SETUP_WIZARD
})
+ @NonNull
public Map<OsuProvider, PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(
@NonNull Set<OsuProvider> osuProviders) {
try {
@@ -4524,7 +4527,7 @@ public class WifiManager {
/**
* @return true if this device supports Wi-Fi Enhanced Open (OWE)
*/
- public boolean isOweSupported() {
+ public boolean isEnhancedOpenSupported() {
return isFeatureSupported(WIFI_FEATURE_OWE);
}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
index 84b28a9a2657..358bf31bf3f7 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -45,7 +45,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
/**
* Builder used to create {@link WifiNetworkSpecifier} objects.
*/
- public static class Builder {
+ public static final class Builder {
private static final String MATCH_ALL_SSID_PATTERN_PATH = ".*";
private static final String MATCH_EMPTY_SSID_PATTERN_PATH = "";
private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN1 =
@@ -115,7 +115,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* string pattern to use for matching the network's SSID.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setSsidPattern(@NonNull PatternMatcher ssidPattern) {
+ public @NonNull Builder setSsidPattern(@NonNull PatternMatcher ssidPattern) {
checkNotNull(ssidPattern);
mSsidPatternMatcher = ssidPattern;
return this;
@@ -133,7 +133,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the SSID is not valid unicode.
*/
- public Builder setSsid(@NonNull String ssid) {
+ public @NonNull Builder setSsid(@NonNull String ssid) {
checkNotNull(ssid);
final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
if (!unicodeEncoder.canEncode(ssid)) {
@@ -155,7 +155,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @param mask Mask for BSSID pattern.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setBssidPattern(
+ public @NonNull Builder setBssidPattern(
@NonNull MacAddress baseAddress, @NonNull MacAddress mask) {
checkNotNull(baseAddress, mask);
mBssidPatternMatcher = Pair.create(baseAddress, mask);
@@ -174,7 +174,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @param bssid BSSID of the network.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setBssid(@NonNull MacAddress bssid) {
+ public @NonNull Builder setBssid(@NonNull MacAddress bssid) {
checkNotNull(bssid);
mBssidPatternMatcher = Pair.create(bssid, MATCH_EXACT_BSSID_PATTERN_MASK);
return this;
@@ -185,7 +185,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsEnhancedOpen() {
+ public @NonNull Builder setIsEnhancedOpen() {
mIsEnhancedOpen = true;
return this;
}
@@ -198,7 +198,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the passphrase is not ASCII encodable.
*/
- public Builder setWpa2Passphrase(@NonNull String passphrase) {
+ public @NonNull Builder setWpa2Passphrase(@NonNull String passphrase) {
checkNotNull(passphrase);
final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
if (!asciiEncoder.canEncode(passphrase)) {
@@ -216,7 +216,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the passphrase is not ASCII encodable.
*/
- public Builder setWpa3Passphrase(@NonNull String passphrase) {
+ public @NonNull Builder setWpa3Passphrase(@NonNull String passphrase) {
checkNotNull(passphrase);
final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
if (!asciiEncoder.canEncode(passphrase)) {
@@ -233,7 +233,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setWpa2EnterpriseConfig(
+ public @NonNull Builder setWpa2EnterpriseConfig(
@NonNull WifiEnterpriseConfig enterpriseConfig) {
checkNotNull(enterpriseConfig);
mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
@@ -247,7 +247,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setWpa3EnterpriseConfig(
+ public @NonNull Builder setWpa3EnterpriseConfig(
@NonNull WifiEnterpriseConfig enterpriseConfig) {
checkNotNull(enterpriseConfig);
mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
@@ -263,12 +263,11 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsHiddenSsid() {
+ public @NonNull Builder setIsHiddenSsid() {
mIsHiddenSSID = true;
return this;
}
-
private void setSecurityParamsInWifiConfiguration(
@NonNull WifiConfiguration configuration) {
if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
@@ -409,7 +408,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
* @return Instance of {@link NetworkSpecifier}.
* @throws IllegalStateException on invalid params set.
*/
- public NetworkSpecifier build() {
+ public @NonNull NetworkSpecifier build() {
if (!hasSetAnyPattern()) {
throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/"
+ "setBssid should be invoked for specifier");
@@ -496,7 +495,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc
this.requestorPackageName = requestorPackageName;
}
- public static final @android.annotation.NonNull Creator<WifiNetworkSpecifier> CREATOR =
+ public static final @NonNull Creator<WifiNetworkSpecifier> CREATOR =
new Creator<WifiNetworkSpecifier>() {
@Override
public WifiNetworkSpecifier createFromParcel(Parcel in) {
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 4cee6ec95906..3742b83d5836 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -45,7 +45,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
/**
* Builder used to create {@link WifiNetworkSuggestion} objects.
*/
- public static class Builder {
+ public static final class Builder {
private static final int UNASSIGNED_PRIORITY = -1;
/**
@@ -125,7 +125,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the SSID is not valid unicode.
*/
- public Builder setSsid(@NonNull String ssid) {
+ public @NonNull Builder setSsid(@NonNull String ssid) {
checkNotNull(ssid);
final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
if (!unicodeEncoder.canEncode(ssid)) {
@@ -150,7 +150,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @param bssid BSSID of the network.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setBssid(@NonNull MacAddress bssid) {
+ public @NonNull Builder setBssid(@NonNull MacAddress bssid) {
checkNotNull(bssid);
mBssid = MacAddress.fromBytes(bssid.toByteArray());
return this;
@@ -161,7 +161,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsEnhancedOpen() {
+ public @NonNull Builder setIsEnhancedOpen() {
mIsEnhancedOpen = true;
return this;
}
@@ -174,7 +174,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the passphrase is not ASCII encodable.
*/
- public Builder setWpa2Passphrase(@NonNull String passphrase) {
+ public @NonNull Builder setWpa2Passphrase(@NonNull String passphrase) {
checkNotNull(passphrase);
final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
if (!asciiEncoder.canEncode(passphrase)) {
@@ -192,7 +192,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the passphrase is not ASCII encodable.
*/
- public Builder setWpa3Passphrase(@NonNull String passphrase) {
+ public @NonNull Builder setWpa3Passphrase(@NonNull String passphrase) {
checkNotNull(passphrase);
final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
if (!asciiEncoder.canEncode(passphrase)) {
@@ -209,7 +209,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setWpa2EnterpriseConfig(
+ public @NonNull Builder setWpa2EnterpriseConfig(
@NonNull WifiEnterpriseConfig enterpriseConfig) {
checkNotNull(enterpriseConfig);
mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
@@ -223,7 +223,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setWpa3EnterpriseConfig(
+ public @NonNull Builder setWpa3EnterpriseConfig(
@NonNull WifiEnterpriseConfig enterpriseConfig) {
checkNotNull(enterpriseConfig);
mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
@@ -237,7 +237,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsHiddenSsid() {
+ public @NonNull Builder setIsHiddenSsid() {
mIsHiddenSSID = true;
return this;
}
@@ -255,7 +255,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsAppInteractionRequired() {
+ public @NonNull Builder setIsAppInteractionRequired() {
mIsAppInteractionRequired = true;
return this;
}
@@ -267,7 +267,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsUserInteractionRequired() {
+ public @NonNull Builder setIsUserInteractionRequired() {
mIsUserInteractionRequired = true;
return this;
}
@@ -283,7 +283,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link Builder} to enable chaining of the builder method.
* @throws IllegalArgumentException if the priority value is negative.
*/
- public Builder setPriority(int priority) {
+ public @NonNull Builder setPriority(int priority) {
if (priority < 0) {
throw new IllegalArgumentException("Invalid priority value " + priority);
}
@@ -298,7 +298,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
*
* @return Instance of {@link Builder} to enable chaining of the builder method.
*/
- public Builder setIsMetered() {
+ public @NonNull Builder setIsMetered() {
mIsMetered = true;
return this;
}
@@ -406,7 +406,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
* @return Instance of {@link WifiNetworkSuggestion}.
* @throws IllegalStateException on invalid params set.
*/
- public WifiNetworkSuggestion build() {
+ public @NonNull WifiNetworkSuggestion build() {
if (mSsid == null) {
throw new IllegalStateException("setSsid should be invoked for suggestion");
}
@@ -483,7 +483,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
this.suggestorPackageName = suggestorPackageName;
}
- public static final @android.annotation.NonNull Creator<WifiNetworkSuggestion> CREATOR =
+ public static final @NonNull Creator<WifiNetworkSuggestion> CREATOR =
new Creator<WifiNetworkSuggestion>() {
@Override
public WifiNetworkSuggestion createFromParcel(Parcel in) {
diff --git a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
index a1684d664c2d..57dff9d761cb 100644
--- a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
+++ b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
@@ -16,6 +16,7 @@
package android.net.wifi.hotspot2;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.graphics.drawable.Icon;
import android.net.Uri;
@@ -156,7 +157,7 @@ public final class OsuProvider implements Parcelable {
*
* @return String matching the default locale, null otherwise
*/
- public String getFriendlyName() {
+ public @Nullable String getFriendlyName() {
if (mFriendlyNames == null || mFriendlyNames.isEmpty()) return null;
String lang = Locale.getDefault().getLanguage();
String friendlyName = mFriendlyNames.get(lang);
@@ -180,7 +181,7 @@ public final class OsuProvider implements Parcelable {
return mServiceDescription;
}
- public Uri getServerUri() {
+ public @Nullable Uri getServerUri() {
return mServerUri;
}